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

1386
towi

Я редактирую много страниц 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 
11

1 ответ на вопрос

14
Ivan Andrus

Переменная 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) 
идеально! Моя мод-линия сказала `(Фундаментальная муха)`. Подключить его к «flyspell-mode» не получилось, но вместо «text-mode» вместо «text-mode» работает «basic-mode». towi 12 лет назад 0
Хм ... как мне обработать оба: регулярное выражение `^ {{{` ... `^}}}` и обратное Backtick-word-Backtick? towi 12 лет назад 0
Я добавил поддержку для backtick-text-backtick. Предполагается, что такие операторы появляются только в одной строке - он подсчитывает, есть ли четное или нечетное число обратных черт на строке перед ним. Ivan Andrus 12 лет назад 0

Похожие вопросы