一旦 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
启用所有模式,而是希望flyspell-mode
启用主要处理文本的模式(文本模式、消息模式等)和flyspell-prog-mode
编程模式(C/C++、Java、 Ruby、Lisp 等)。两种模式的区别在于第一种检查所有单词,而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)
您可以将以下内容添加到您的 Emacs 初始化文件中:
(flyspell-所有模式)
功能描述指出:
在所有主要模式中使用 Flyspell。适用于现有缓冲区和您随后创建的缓冲区。如果打开,则关闭“flyspell-text-modes”。
编辑:显然,上述功能仅包含在 Emacs 24 中的 flyspell 版本中。如果您不能使用该版本,则应使用 Trey 建议的解决方案来“半全局”启用 flyspell。要使用 NXML 禁用 XML 标记检查,可以将以下行添加到 Emacs 初始化文件中:
(put 'nxml-mode 'flyspell-mode-predicate 'sgml-mode-flyspell-verify)
注意:该行已经在 Emacs 24 中包含的 flyspell.el 中。
我不能说什么时候,但是 flyspell-mode 现在可以很好地知道它处于什么模式并做出相应的反应。这是我的使用包实现,带有公司完成接口。
(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)))
我在 2021 年 10 月在 Debian 11.1 上使用 Emacs 27.1。我编写了一个函数,它根据缓冲区的主要模式的类型做正确的事情,并将它连接到find-file-hook
,它为访问的每个文件运行。我将此作为其他答案的补充,而不是替代。理由:
flyspell-mode
(无论是通过键绑定还是作为模式挂钩调用),都没有自动识别模式/缓冲区/文件的类型,这与@RichieHH 的回答相反。flyspell-all-modes
不存在。text-mode-hook
and
的建议prog-mode-hook
,根据@b4hand,尽其所能,但让 Flyspell 关闭了我在基本模式下打开的许多随机文件。一个潜在的缺点是,这不会针对与任何文件关联的缓冲区运行。显然没有很好的方法来挂钩“创建任何缓冲区”。但是,应该能够添加多个钩子而不会产生不良影响——如果多次调用,该函数应该会发现 Flyspell 已经启用,并且什么也不做。因此,如果您愿意,也可以text-mode-hook
添加钩子。prog-mode-hook
(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)))))