Bagaimana cara menggunakan flyspell dalam buffer org tanpa memicu flyspell pada blok kode kusut?

19

Bayangkan buffer org di Emacs seperti:

* Title

Some text describing the title and the codew (sic) and whatnot.

#+BEGIN_SRC emacs_lisp
(setq backup-by-copying t)
#+END_SRC

Saya ingin flyspell memeriksa buffer org (dan menangkap kesalahan ejaan di dalamnya) tetapi mengabaikan konten antara tanda # + BEGIN_SRC dan # + END_SRC. Bagaimana seseorang melakukannya?

prjorgensen
sumber
2
Sepertinya seseorang perlu menulis beberapa kode menggunakan flyspell-generic-check-word-predicate, jika itu belum ditemukan. Berikut adalah utas terkait untuk flyspell menggunakan flyspell-generic-check-word-predicate: superuser.com/a/345461/206164 ; dan, di sini ada utas semi-terkait untuk penggunaan ispell ispell-skip-region-alist, tetapi tidak terkait dengan flyspell: emacs.stackexchange.com/a/2103/2287
lawlist
dapatkah emacs.stackexchange.com/a/2103/2609 membantu?
Nama
Pertanyaan ini adalah tiruan
grettke
1
@ grettke: Tampaknya seperti korban penipuan, tetapi ternyata tidak. Mengubah pengaturan untuk Ispell sebenarnya tidak menyelesaikan masalah di Flyspell. Setidaknya tidak ketika saya mencobanya.
Brian Z
Ini berfungsi di luar kotak di v8.3 saat Anda membutuhkannya ox.
rasmus

Jawaban:

12
;; NO spell check for embedded snippets
(defadvice org-mode-flyspell-verify (after org-mode-flyspell-verify-hack activate)
  (let* ((rlt ad-return-value)
         (begin-regexp "^[ \t]*#\\+begin_\\(src\\|html\\|latex\\|example\\|quote\\)")
         (end-regexp "^[ \t]*#\\+end_\\(src\\|html\\|latex\\|example\\|quote\\)")
         (case-fold-search t)
         b e)
    (when ad-return-value
      (save-excursion
        (setq b (re-search-backward begin-regexp nil t))
        (if b (setq e (re-search-forward end-regexp nil t))))
      (if (and b e (< (point) e)) (setq rlt nil)))
    (setq ad-return-value rlt)))

Harap dicatat ispell-skip-region-alist TIDAK digunakan oleh flyspell.

Uji pada Emacs24.3, 24.4, 24.5, 25.1 dengan mode-bawaan bawaan

Sebagian besar pengguna mengaktifkan flyspell secara default. Jadi kode di atas sudah cukup.

Tapi saya tidak mengaktifkan mode flyspell dalam file org. Saya lebih suka secara manual M-x flyspell-bufferlagi dan lagi. Jadi saya perlu (flyspell-mode 1) (flyspell-mode -1)di org-mode-hook. Ya, hidupkan kemudian matikan flyspell-mode. Tujuannya adalah untuk memastikan predikat default mode-org dimuat.

chen bin
sumber
Saya sarankan menambahkan kutipan ke regexp, seperti: `(begin-regexp" ^ [\ t] * # \\ + begin _ \ (src \\ | html \\ | latex \\ | quote \) ") (end- regexp "^ [\ t] * # \\ + end _ \ (src \\ | html \\ | latex \\ | quote \)") `
prjorgensen