Как исключить {{{…}}} в режиме flyspell и буфере flyspell?

11

Я редактирую много страниц MoinMoinWiki в моем emacs и люблю их flyspell-mode. Предварительно отформатированный материал в {{{...}}}(в несколько строк), а также «backtick text backtick» обычно содержит фрагменты программного кода, которые не имеют смысла проверять орфографию.

Могу ли я настроить ispell/ flyspellне включать программный код?

Пример:

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
источник

Ответы:

15

Переменная ispell-skip-region-alistделает то, что вы хотите при проверке орфографии буфера, но не для flyspell. Просто добавьте запись, как

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

К сожалению, заставить Flyspell не так легко игнорировать определенные регионы. Вы должны использовать, flyspell-generic-check-word-predicateкоторый является функцией. Несколько режимов уже определяют это, поэтому вам нужно добавить следующее в качестве рекомендаций для этих функций. Для простоты я предполагаю, что вы используете режим (который я использовал text-modeниже), в котором он не определен. Затем вы можете добавить следующее в ваш .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)
Иван Андрус
источник
идеально! Мой мод-лайн сказал (Fundamental Fly). Зацепить его flyspell-modeне получилось, но fundamental-modeвместо этого text-modeвроде нормально.
towi
Хм ... как я обрабатывать как: в ^{{{... ^}}}регулярное выражении и кавычка-слово-кавычка один?
towi
Я добавил поддержку backtick-text-backtick. Предполагается, что такие операторы появляются только в одной строке - он подсчитывает, есть ли четное или нечетное число обратных черт на строке перед ним.
Иван Андрус