¿Cómo excluir {{{…}}} en flyspell-mode y flyspell-buffer?

11

Edito muchas páginas de MoinMoinWiki en mis emacs y me encanta flyspell-mode. Las cosas preformateadas en {{{...}}}(en varias líneas), así como "backtick text backtick" generalmente contienen fragmentos de código de programación que no tienen sentido para la corrección ortográfica.

¿Puedo configurar ispell/ flyspellno incluir el código de programación?

Ejemplo:

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
Towi
fuente

Respuestas:

15

La variable ispell-skip-region-alisthace lo que quiere cuando revisa la ortografía del búfer, pero no para el flyspell. Simplemente agregue una entrada como

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

Desafortunadamente, no es tan fácil hacer que el flyspell ignore ciertas regiones. Tienes que usar flyspell-generic-check-word-predicatecuál es una función. Varios modos ya definen esto, por lo que debería agregar lo siguiente como consejo para esas funciones. Sin embargo, supondré por simplicidad que está utilizando un modo (que utilicé a text-modecontinuación) que no lo tiene definido. Luego puede agregar lo siguiente a sus .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)
Ivan Andrus
fuente
¡Perfecto! Mi línea de modo dijo (Fundamental Fly). Engancharlo flyspell-modeno funcionó, pero en fundamental-modelugar de text-modeparece estar bien.
Towi
Hmm ... ¿cómo manejo ambas: la ^{{{... ^}}}regex y la Backtick-word-Backtick?
Towi
Agregué soporte para el backtick-text-backtick. Supone que tales declaraciones solo aparecen en una sola línea: cuenta si hay un número par o impar de backticks en la línea anterior.
Ivan Andrus