Como excluir {{{…}}} no flyspell-mode e no flyspell-buffer?

11

Eu edito muitas páginas do MoinMoinWiki no meu emacs e amo o flyspell-mode . Material pré-formatado em {{{...}}} (em várias linhas), bem como "backtick texto backtick" geralmente contém trechos de código de programação que não fazem sentido para verificação ortográfica.

Posso configurar ispell / flyspell para não incluir o código de programação?

Exemplo:

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
    
por towi 10.10.2011 / 21:23

1 resposta

14

A variável ispell-skip-region-alist faz o que você deseja quando corrige a ortografia do buffer, mas não para flyspell. Basta adicionar uma entrada como

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

Infelizmente, não é tão fácil conseguir flyspell para ignorar certas regiões. Você tem que usar flyspell-generic-check-word-predicate , que é uma função. Vários modos já definem isso, então você teria que adicionar o seguinte como um conselho para essas funções. Vou assumir por simplicidade que você está usando um modo (eu usei text-mode abaixo) que não tem isso definido. Então você pode adicionar o seguinte ao seu .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)
    
por 11.10.2011 / 22:59

Tags