Jak używać flyspell w buforach org bez wyzwalania flyspell w splątanych blokach kodu?

19

Wyobraź sobie bufor organizacji w Emacsie, taki jak:

* Title

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

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

Chcę, aby flyspell sprawdził bufor organizacji (i wyłapał w nim błąd ortograficzny), ale zignorował treść między znakami # + BEGIN_SRC i # + END_SRC. Jak sobie z tym poradzić?

prjorgensen
źródło
2
Wygląda na to, że ktoś będzie musiał napisać kod za pomocą flyspell-generic-check-word-predicate, jeśli nie został jeszcze wynaleziony. Oto powiązany wątek dla flyspell przy użyciu flyspell-generic-check-word-predicate: superuser.com/a/345461/206164 ; i tutaj jest częściowo powiązany wątek dotyczący używania ispell ispell-skip-region-alist, ale nie związany z flyspell: emacs.stackexchange.com/a/2103/2287
lawlist
czy emacs.stackexchange.com/a/2103/2609 może pomóc?
Imię
To pytanie jest duplikatem tego emacs.stackexchange.com/questions/450/…
grettke
1
@grettke: Wygląda na dupek, ale tak nie jest. Zmiana ustawień Ispell nie rozwiązuje problemu w Flyspell. Przynajmniej nie, kiedy tego spróbowałem.
Brian Z
Działa po wyjęciu z pudełka w wersji 8.3, kiedy jest to wymagane ox.
rasmus

Odpowiedzi:

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

Uwaga: isspell-skip-region-alist NIE jest używany przez flyspell.

Test na Emacs24.3, 24.4, 24.5, 25.1 z wbudowanym trybem org

Większość użytkowników domyślnie włącza Flyspell. Tak więc powyższy kod wystarczy.

Ale nie włączam trybu flyspell w pliku org. Wolę ręcznie M-x flyspell-bufferwielokrotnie. Potrzebuję (flyspell-mode 1) (flyspell-mode -1)haka w trybie org. Tak, włącz, a następnie wyłącz tryb flyspell. Celem jest upewnienie się, że domyślny predykat trybu org jest załadowany.

Chen Bin
źródło
Sugeruję dodanie cudzysłowu do wyrażenia regularnego, takiego jak: `(begin-regexp" ^ [\ t] * # \\ + begin _ \ (src \\ | html \\ | latex \\ | quote \) ") (end- regexp "^ [\ t] * # \\ + end _ \ (src \\ | html \\ | latex \\ | quote \)") `
prjorgensen