在纠结的代码块上没有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标记之间的内容。如何做到这一点?


2
flyspell-generic-check-word-predicate如果尚未发明,似乎有人需要使用编写一些代码。这是使用以下命令与flyspell相关的线程flyspell-generic-check-word-predicatesuperuser.com/a/345461/206164 ; 并且,这是使用的ispell的半相关线程ispell-skip-region-alist,但与flyspell无关: emacs.stackexchange.com/a/2103/2287
法律列表



1
@grettke:看起来像个骗子,但事实并非如此。更改Ispell的设置实际上并不能解决Flyspell中的问题。至少在我尝试时没有。
Brian Z

需要时,它可以在v8.3中直接使用ox
rasmus 2015年

Answers:


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

请注意,flyspell不使用ispell-skip-region-alist。

使用内置的组织模式在Emacs24.3、24.4、24.5、25.1上进行测试

默认情况下,大多数用户都启用flyspell。因此上面的代码就足够了。

但是我没有在组织文件中启用flyspell-mode。我喜欢M-x flyspell-buffer一次又一次手动。所以我需要(flyspell-mode 1) (flyspell-mode -1)在org-mode-hook中。是的,打开然后关闭flyspell模式。目的是确保已加载组织模式的默认谓词。


我建议在正则表达式中添加引号,例如:`(begin-regexp“ ^ [\ t] *#\\ + begin _ \(src \\ | html \\ | latex \\ | quote \)”)(end- regexp“ ^ [\ t] *#\\ + end _ \(src \\ | html \\ | latex \\ | quote \)”)`
prjorgensen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.