Bagaimana cara mengecualikan {{{...}}} dalam mode flyspell dan flyspell-buffer?


11

Saya mengedit banyak halaman MoinMoinWiki di emacs saya dan menyukainya flyspell-mode. Item yang telah diformat dalam {{{...}}}(dalam beberapa baris) serta "backtick text backtick" biasanya berisi potongan kode pemrograman yang tidak masuk akal untuk diperiksa ejaan.

Bisakah saya mengkonfigurasi ispell/ flyspelltidak memasukkan kode pemrograman?

Contoh:

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

Jawaban:


15

Variabel ispell-skip-region-alistmelakukan apa yang Anda inginkan ketika mengeja memeriksa buffer, tetapi tidak untuk flyspell. Cukup tambahkan entri seperti

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

Sayangnya, tidak mudah mendapatkan spell untuk mengabaikan wilayah tertentu. Anda harus menggunakan flyspell-generic-check-word-predicateyang merupakan fungsi. Beberapa mode sudah mendefinisikan ini sehingga Anda harus menambahkan yang berikut sebagai saran untuk fungsi-fungsi tersebut. Saya akan menganggap untuk kesederhanaan meskipun Anda menggunakan mode (saya gunakan di text-modebawah) yang tidak mendefinisikannya. Kemudian Anda dapat menambahkan yang berikut ke .emacs Anda:

(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)

sempurna! Baris mode saya mengatakan (Fundamental Fly). Mengaitkannya dengan flyspell-modetidak berhasil, tetapi fundamental-modebukannya text-modeterlihat baik-baik saja.
towi

Hmm ... bagaimana saya menangani keduanya: ^{{{... ^}}}regex dan Backtick-word-Backtick?
towi

Saya menambahkan dukungan untuk backtick-text-backtick. Ini mengasumsikan bahwa pernyataan seperti itu hanya muncul pada satu baris — ia menghitung apakah ada jumlah backtick yang genap atau ganjil pada baris sebelumnya.
Ivan Andrus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.