Friday, 8 February 2019

emacs - How to exclude {{{ ... }}} in flyspell-mode and flyspell-buffer?


I edit a lot of MoinMoinWiki pages in my emacs and love the flyspell-mode. Preformatted stuff in {{{...}}} (in multiple lines) as well as "backtick text backtick" usually contains snippets of programming code which make no sense to spellcheck.


Can I configure ispell/flyspell not to include the programming code?


Example:


Bla bla lorem ipsum die Standardcontainer wie `vector` eine
''Methode'' haben, die ein einzelnes Argument nimmt, also
`vector::swap(vector&)`. 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<>

{{{#!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&) {
// ...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

Answer



The variable ispell-skip-region-alist does what you want when spell checking the buffer, but not for flyspell. Just add an entry like


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

Unfortunately, it's not as easy to get flyspell to ignore certain regions. You have to use flyspell-generic-check-word-predicate which is a function. Several modes already define this so you would have to add the following as advice to those functions. I'll assume for simplicity though that you are using a mode (I used text-mode below) which doesn't have it defined. Then you can add the following to your .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)

No comments:

Post a Comment

Where does Skype save my contact&#39;s avatars in Linux?

I'm using Skype on Linux. Where can I find images cached by skype of my contact's avatars? Answer I wanted to get those Skype avat...