私はemacsのMoinMoinWikiページをたくさん編集していて、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
変数ispell-skip-region-alist
は、バッファのスペルチェック時に必要なことを実行しますが、flyspellの場合は実行しません。次のようなエントリを追加するだけです
(add-to-list 'ispell-skip-region-alist
'("^{{{" . "^}}}"))
残念ながら、特定の地域を無視するようにフライスペルを取得するのは簡単ではありません。関数である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)