2011-01-12 16 views
9

Uso Emacs per scrivere la maggior parte dei miei scritti. Scrivo usando reStructuredText e poi li trasformo in LaTeX dopo un po 'di pre-elaborazione, dal momento che scrivo le mie citazioni su LaTeX. Questo è un estratto di uno dei miei testi (in spagnolo):Come rendere flyspell bypassare alcune parole in base al contesto?

En \cite[pp.~XXVIII--XXIX]{Crnkovic2002} se brindan algunos riesgos 
que se pueden asumir con el desarrollo basado en componentes, los 

Questo testo viene elaborato da alcuni script personalizzati che si occupa della parte \cite modo rst2latex può fare il suo lavoro.

Quando si attiva la modalità flyspell segnala la maggior parte dei tasti di citazione come errori di ortografia.

Come posso dire a flyspell di non eseguire il controllo ortografico nei comandi \cite.

Inoltre, come posso combinare rst-mode e flyspell, in modo che la modalità rst mantenga il controllo ortografico di ciò che segue?

  • reST commenti del codice
  • reST letterale
  • resto parametri direttivi e gli argomenti
  • resto DIRETTIVA prime

Tutte le idee?

risposta

11

È possibile impostare la variabile ispell-parser sul valore 'tex in modo che il flyspell ignori le sequenze (la) tex. Per fare ciò, è possibile impostare manualmente in ogni buffer in questo modo:

M-: (setq 'ispell-parser 'tex) 

oppure scrivere un po 'di funzione che lo farà per voi. Inserire il seguente nel vostro file .emacs:

(defun flyspell-ignore-tex() 
    (interactive) 
    (set (make-variable-buffer-local 'ispell-parser) 'tex)) 

si può comunque richiamare manualmente, utilizzando

M-x flyspell-ignore-tex 

o si potrebbe aggiungere un gancio che chiama automaticamente quella funzione ogni volta che si modifica un file di un certo tipo Faresti il ​​secondo aggiungendo la funzione appena definita al tuo auto-mode-alist. Dicono i nomi dei file in genere terminano con ".rst", quindi aggiungere questa riga al vostro file .emacs:

(add-to-list 'auto-mode-alist '("\\.rst$" . flyspell-ignore-tex)) 

Per quanto riguarda la seconda parte della tua domanda: fare flyspell modalità ignora le regioni più grandi, come, ad esempio, i commenti di reST, non sono facilmente realizzabili. Diventa chiaro quando pensi al modo in cui flyspell funziona: controlla il testo parola per parola. Per questo, flyspell-word guarda solo una parola alla volta che invia a un processo ispell in esecuzione in background. Il processo ispell esegue la ricerca nel dizionario e restituisce se la parola corrente è corretta o meno. Se flyspell-word dovessi controllare ogni singola volta se la parola corrente fa parte o meno di un commento o di un'altra regione che non dovrebbe essere controllata, sarebbe piuttosto lenta, perché ciò includerebbe un bel po 'di ricerca nel buffer.

Ora, naturalmente, è possibile avvicinarsi a questo un po 'più in modo intelligente e trovare prima le regioni senza commenti ecc. E quindi eseguire la verifica parola per parola solo in quelle parti che sono al di fuori di quelle regioni - ma sfortunatamente non è così che Flyspell viene implementato.

Se si può fare a meno della parte "vola", tuttavia, la modalità ispell ha un meccanismo per personalizzare quali regioni di un buffer possono essere saltate. Questo viene fatto tramite la variabile ispell-skip-region-alist. Ma anche se la modalità flyspell funziona in modalità ispell, per le ragioni sopra indicate tale variabile non viene utilizzata dalla modalità flyspell.

+0

Thomas, grazie mille! Ho usato la modalità ispell in passato, ma flyspell mi si adatta meglio al momento. Tuttavia, dopo aver letto il documento 'ispell-skip-region-alist', penso che dovrei programmare una funzione per rilevare la fine del commento. Non ho ancora familiarità con Emacs Lisp. In ogni caso il metodo 'ispell-parser' è ancora utile. Forse potrei controllare come è stato usato e creare il mio ispettore-parser personale quando posso. – manu

+0

Manu, probabilmente non dovrai programmare una funzione lisp per rilevare l'inizio e la fine di un commento. In genere, un'espressione regolare dovrebbe essere sufficiente, una che corrisponde all'inizio e una che corrisponde alla fine. Li metti entrambi tra parentesi e li aggiungi a "ispell-skip-region-alist" (l'ho provato ieri, in realtà non è così difficile) e ci sono buone probabilità che 'rst-mode' contenga già le espressioni regolari stai cercando da qualche parte. – Thomas

+0

In reStructuredText la fine della sezione di codice viene rilevata quando il livello di indentazione viene diminuito. Quindi regexp non sarebbe d'aiuto. Cordiali saluti, Manu. – manu

4

È anche possibile utilizzare flyspell-generic-check-word-predicate come spiegato in this question in Super User.

1

(filtro tex di aspell può fare esattamente quello che vuoi - ma se si vuole una soluzione più generale)

Anche se sto usando il codice qui sotto per convincere flyspell di non bandiera alcune parole con i numeri in loro, voi può usare questo tipo di hook per abbinare determinati contesti.

l'esame inizia nella posizione desiderata, quindi è possibile effettuare una ricerca all'indietro per l'inizio/fine di qualsiasi contesto a cui tieni.

(when "another attempt to accept certain words flyspell/ispell/aspell flags as incorrect" 
    (defun flyspell-ignore-WordNumber99-stuff/ag (beg end info) 
    (save-excursion 
     (goto-char beg) 
     (cond 
    ((or 
     (looking-at "\\bWord1\\b") 
     (looking-at "\\bWord99Foo\\b") 
     ) 
     t) 
    (t nil) 
    ) 
    ) 
    ) 
) 

(add-hook 'flyspell-incorrect-hook 'flyspell-ignore-WordNumber99-stuff/ag) 
Problemi correlati