如何在Emacs启动时自动为每个文件和每个主要模式启用flyspell-mode?
此外,是否有一个XML词典不会将XML标记标记为拼写错误单词?
这个问题的答案对我有用:
此外,与其他先前的答案相比,它似乎更为普遍。将以下行添加到您的.emacs
或init.el
。
(add-hook 'text-mode-hook 'flyspell-mode)
(add-hook 'prog-mode-hook 'flyspell-prog-mode)
你可能并不想在所有模式下启用flyspell-mode
,而是希望在主要处理文本的模式(text-mode、message-mode等)中启用flyspell-mode
,在编程模式(C/C++、Java、Ruby、Lisp等)中启用flyspell-prog-mode
。两种模式的区别在于前者检查所有单词,而flyspell-prog-mode
仅检查注释和字符串中的单词(从而避免检查代码,因为代码通常不是单词)。
无论哪种方式,都没有一个单一的位置可以在所有文件/缓冲区中启用flyspell,因为它始终被编写为局部缓冲区。一个近似的方法是
(defun turn-on-flyspell () (flyspell-mode 1))
(add-hook 'find-file-hooks 'turn-on-flyspell)
这并不能涵盖没有关联文件的缓冲区,而且我不建议使用它,因为它无法区分编程模式和非编程模式 - 而我认为这很有用。
由于无法知道某些模式是否是编程模式,您需要手动添加所有您关心的编程模式的自定义内容,例如:
(mapcar (lambda (mode-hook) (add-hook mode-hook 'flyspell-prog-mode))
'(c-mode-common-hook tcl-mode-hook emacs-lisp-mode-hook
ruby-mode-hook java-mode-hook))
注意:这两段代码可能不兼容。
关于 XML,flyspell已经针对sgml-mode
、html-mode
和nxml-mode
进行了定制,以不检查标记拼写(自 Emacs 23.2 起)。如果您使用的是较旧版本的 Emacs(回溯到21.1),则可以将以下内容添加到您的 .emacs 文件中,以获取对 nxml-mode
的支持:
(put 'nxml-mode 'flyspell-mode-predicate 'sgml-mode-flyspell-verify)
markdown-mode
是一种不同于 nxml-mode
的模式,所以不会有任何作用(我相信)你所询问的那个钩子。 - Trey Jacksonflyspell-prog-mode
。并且还要添加一行(put 'nxml-mode'flyspell-mode-predicate' sgml-mode-flyspell-verify) - 因为这对XML进行了一些额外的调整(这正是您想要的)。 - Trey Jackson(put 'nxml-mode 'flyspell-mode-predicate 'sgml-mode-flyspell-verify)
我无法确定具体时间,但是 flyspell-mode 现在可以很好地知道它所处的模式并做出相应的反应。这是我的 use-package 实现,带有 company-completion 接口。
(use-package flyspell :demand t
:config
(use-package
flyspell-correct-helm)
(defun flyspellCompletion()
(flyspell-mode 1)
(set (make-local-variable 'company-backends)
(copy-tree company-backends))
(add-to-list 'company-backends 'company-ispell))
(defun flyspell-most-modes()
(add-hook 'text-mode-hook 'flyspellCompletion)
(add-hook 'prog-mode-hook 'flyspellCompletion)
(dolist (hook '(change-log-mode-hook log-edit-mode-hook))
(add-hook hook (lambda ()
(flyspell-mode -1)))))
(flyspell-most-modes)
:bind (:map flyspell-mode-map
("C-." . flyspell-correct-wrapper)))
find-file-hook
,该钩子对每个访问的文件运行。我将此作为其他答案的补充而不是替代品提供。原因如下:
flyspell-mode
(无论是通过键绑定还是作为模式挂钩调用)并没有自动识别模式/缓冲区/文件类型,这与@RichieHH的答案相反。flyspell-all-modes
不存在,这与@zev的说法不符。text-mode-hook
和prog-mode-hook
的建议,如@b4hand所述,只能解决部分问题,对于我打开的许多随机文件,它们以基本模式打开,Flyspell仍然关闭。(add-hook 'find-file-hook 'flyspell-on-for-buffer-type)
(defun flyspell-on-for-buffer-type ()
(interactive)
;; if flyspell mode is not already on, turn it on
(if (not (symbol-value flyspell-mode))
(if (derived-mode-p 'prog-mode)
(progn
(message "Flyspell on (code)")
(flyspell-prog-mode))
(progn
(message "Flyspell on (text)")
(flyspell-mode 1)))))