Как можно использовать flyspell в организационных буферах без запуска flyspell на запутанных кодовых блоках?

19

Представьте себе буфер организации в Emacs, например:

* Title

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

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

Я хочу, чтобы flyspell проверил буфер org (и уловил в нем орфографическую ошибку), но игнорировал содержимое между отметками # + BEGIN_SRC и # + END_SRC. Как можно это сделать?

prjorgensen
источник
2
Похоже, кому-то нужно будет написать некоторый код, используя flyspell-generic-check-word-predicate, если это еще не было изобретено. Вот связанная тема для flyspell с использованием flyspell-generic-check-word-predicate: superuser.com/a/345461/206164 ; и вот частично связанная тема для использования ispell ispell-skip-region-alist, но не относящаяся к flyspell: emacs.stackexchange.com/a/2103/2287
lawlist
Может ли помочь emacs.stackexchange.com/a/2103/2609 ?
Имя
Этот вопрос является обманом этого emacs.stackexchange.com/questions/450/…
grettke
1
@grettke: Похоже на обман, но это не так. Изменение настроек для Ispell на самом деле не решает проблему в Flyspell. По крайней мере, когда я попробовал.
Брайан З.
Он работает из коробки в v8.3, когда вам нужно ox.
Расм

Ответы:

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

Обратите внимание, что ispell-skip-region-alist НЕ используется flyspell.

Тест на Emacs24.3, 24.4, 24.5, 25.1 со встроенным org-режимом

Большинство пользователей включают flyspell по умолчанию. Так что приведенного выше кода достаточно.

Но я не включаю режим flyspell в файле org. Я предпочитаю вручную M-x flyspell-bufferснова и снова. Так что мне нужно (flyspell-mode 1) (flyspell-mode -1)в org-mode-hook. Да, включите и выключите режим flyspell. Цель состоит в том, чтобы убедиться, что предикат режима org по умолчанию загружен.

чен бен
источник
Я предлагаю добавить к регулярному выражению кавычку, например: `(begin-regexp" ^ [\ t] * # \\ + begin _ \ (src \\ | html \\ | latex \\ | quote \) ") (end- regexp "^ [\ t] * # \\ + end _ \ (src \\ | html \\ | latex \\ | quote \)") `
prjorgensen