Come escludere {{{…}}} in modalità flyspell e buffer flyspell?


11

Modifica molte pagine di MoinMoinWiki nei miei emacs e adoro il flyspell-mode. Gli elementi preformattati in {{{...}}}(su più righe) e "backtick text backtick" di solito contengono frammenti di codice di programmazione che non hanno senso effettuare il controllo ortografico.

Posso configurare ispell/ flyspellnon includere il codice di programmazione?

Esempio:

Bla bla lorem ipsum die Standardcontainer wie `vector` eine
''Methode'' haben, die ein einzelnes Argument nimmt, also
`vector<T>::swap(vector<T)>&)`. Bla bla und diese `swap`-Methoden sind
von dieser Sorte. Warum das so ist, sehen wir gleich. Bla bla
was '''kanonisch''' ist bla bla Template-Funktion<<tlitref(stdswap)>>

{{{#!highlight c++ title="Man könnte 'std::swap@LT@@GT@' spezialisieren"
namespace std {
  template<> // wir können durchaus im namespace std spezialisieren
  void swap<Thing>(Thing&, Thing&) {
    // ...hier swappen...
  }
}
}}}

Nun, das würde sicherlich in diesem Fall helfen, doch es bleibt ein
größeres Problem: Eine teilweise Spezialisierung lorem ipsum bla bla

Risposte:


15

La variabile ispell-skip-region-alistfa quello che vuoi quando controlli l'ortografia del buffer, ma non per flyspell. Basta aggiungere una voce come

(add-to-list 'ispell-skip-region-alist
             '("^{{{" . "^}}}"))

Sfortunatamente, non è così facile ottenere l'incantesimo per ignorare determinate regioni. Devi usare flyspell-generic-check-word-predicatequale è una funzione. Diverse modalità lo definiscono già, quindi è necessario aggiungere quanto segue come consiglio a tali funzioni. Presumo per semplicità anche se stai usando una modalità (che ho usato text-modesotto) che non l'ha definita. Quindi puoi aggiungere quanto segue al tuo .emacs:

(defun flyspell-ignore-verbatim ()
  "Function used for `flyspell-generic-check-word-predicate' to ignore {{{ }}} blocks."
  (save-excursion
    (widen)
    (let ((p (point))
          (count 0))
      (not (or (and (re-search-backward "^{{{" nil t)
                    (> p (point))
                    ;; If there is no closing }}} then assume we're still in it
                    (or (not (re-search-forward "^}}}" nil t))
                        (< p (point))))
               (eq 1 (progn (while (re-search-backward "`" (line-beginning-position) t)
                              (setq count (1+ count)))
                            (- count (* 2 (/ count 2))))))))))
(put 'text-mode 'flyspell-mode-predicate 'flyspell-ignore-verbatim)

Perfetto! Disse la mia linea di modalità (Fundamental Fly). Collegarlo a flyspell-modenon ha funzionato, ma fundamental-modeinvece text-modesembra a posto.
towi,

Hmm ... come gestirli entrambi: il ^{{{... ^}}}regex e il Backtick-word-Backtick?
towi,

Ho aggiunto il supporto per il backtick-text-backtick. Presuppone che tali affermazioni appaiano solo su una singola riga: conta se esiste un numero pari o dispari di backtick sulla riga prima di essa.
Ivan Andrus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.