Wie kann ich {{{…}}} im Flyspell-Modus und im Flyspell-Puffer ausschließen?

11

Ich bearbeite viele MoinMoinWiki- Seiten in meinen Emacs und liebe die flyspell-mode. Vorformatierte Inhalte {{{...}}}(in mehreren Zeilen) sowie "Backtick- Text- Backtick" enthalten normalerweise Ausschnitte aus Programmcode, die für die Rechtschreibprüfung keinen Sinn ergeben.

Kann ich den Programmcode so konfigurieren ispell/ flyspellnicht einschließen?

Beispiel:

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
quelle

Antworten:

15

Die Variable ispell-skip-region-alistmacht das, was Sie wollen, wenn Sie den Puffer auf Rechtschreibung prüfen, jedoch nicht auf Flyspell. Fügen Sie einfach einen Eintrag wie hinzu

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

Leider ist es nicht so einfach, Flyspell dazu zu bringen, bestimmte Regionen zu ignorieren. Sie müssen verwenden, flyspell-generic-check-word-predicatewelche eine Funktion ist. Einige Modi definieren dies bereits, sodass Sie diesen Funktionen Folgendes als Hinweis hinzufügen müssen. Der Einfachheit halber gehe ich jedoch davon aus, dass Sie einen Modus verwenden (den ich text-modeunten verwendet habe), in dem er nicht definiert ist. Dann können Sie Ihren .emacs Folgendes hinzufügen:

(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)
Ivan Andrus
quelle
perfekt! Meine Moduszeile sagte (Fundamental Fly). Einhaken es flyspell-modehat nicht funktioniert, aber fundamental-modestatt text-modescheint in Ordnung.
Towi
Hmm ... wie gehe ich mit beiden um: dem ^{{{... ^}}}Regex und dem Backtick-Wort-Backtick?
Towi
Ich habe Unterstützung für den Backtick-Text-Backtick hinzugefügt. Es wird davon ausgegangen, dass solche Anweisungen nur in einer einzelnen Zeile erscheinen - es zählt, ob sich in der Zeile davor eine gerade oder ungerade Anzahl von Backticks befindet.
Ivan Andrus