【问题标题】:How to enable flyspell-mode in emacs for all files and all major modes?如何在 emacs 中为所有文件和所有主要模式启用 flyspell-mode?
【发布时间】:2011-10-15 04:50:33
【问题描述】:

如何在 Emacs 启动后立即为每个文件和每个主要模式启用 flyspell-mode?​​p>

另外,有没有不将 XML 标记标记为拼写错误的词的 XML 字典?

【问题讨论】:

  • 如果您仍然活跃,将您的接受更改为使用stackoverflow.com/a/20078310/1187277 更新可能会有所帮助,因为它显然是您问题的正确答案,并且应该是人们第一个看到的答案。

标签: xml emacs mode flyspell


【解决方案1】:

您可以将以下内容添加到您的 Emacs 初始化文件中:

(flyspell-all-modes)

功能描述说明:

在所有主要模式中使用 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.el (1.70) www-sop.inria.fr/members/Manuel.Serrano/flyspell/flyspell.html 和 Emacs 23.2 中都没有看到它。
  • ^ 还有我的问题,我没有在任何地方看到这样的选项。
  • 它位于 Emacs 24 中包含的 flyspell.el 中。
  • 嘿,使用尚未正式发布的 Emacs 版本并不公平。 :P
  • 其实我在emacs 24.093中没有找到这个功能
【解决方案2】:

很有可能,您并不是真的希望为所有模式启用flyspell-mode,而是希望为主要处理文本的模式(文本模式、消息模式等)启用flyspell-mode,以及@987654323 @ 用于编程模式(C/C++、Java、Ruby、Lisp 等)。两种模式的区别在于第一种检查所有单词,而flyspell-prog-mode只检查cmets和字符串中的单词(从而避免检查代码,通常不是单词)。

无论哪种方式,都没有一个地方可以在所有文件/缓冲区中启用 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-modehtml-modenxml-mode 进行了自定义,以便不对标签进行拼写检查(从 Emacs 23.2 开始)。如果您使用的是旧版本的 Emacs(回到 21.1),您应该能够将其添加到您的 .emacs 以获得对 nxml-mode 的支持:

(put 'nxml-mode 'flyspell-mode-predicate 'sgml-mode-flyspell-verify)

【讨论】:

  • 我正在使用 nXml 模式。因此,例如,如果我想为所有降价文件自动打开 flyspell,我可以使用这样的东西吗? (add-hook 'markdown-mode-hook 'flyspell-mode)
  • @mart1n 我添加了有关 XML 处理的更多信息,如果您使用的是旧版本的 Emacs(21 或 22),则可能需要最后一行更新。
  • 在 Emacs 24 包含的 flyspell 版本中,包含以下行以禁用在 nxml 模式下检查 xml 标签:(put 'nxml-mode 'flyspell-mode-predicate 'sgml-mode -flyspell-verify)
  • 我使用的是 Emacs 23。 (add-hook 'markdown-mode-hook 'flyspell-mode) 是否正确,用于为所有 markdown 文件启用 flyspell-mode?​​span>
  • markdown-modenxml-mode 是不同的模式,所以不,你问的那个钩子不会做任何事情(我相信)。
【解决方案3】:

这个问题的答案对我有用:

How to enable automatic spell check by default?

此外,与其他先前的答案相比,它似乎更笼统。将以下行添加到您的 .emacsinit.el

(add-hook 'text-mode-hook 'flyspell-mode)
(add-hook 'prog-mode-hook 'flyspell-prog-mode)

【讨论】:

  • 这对我来说非常有效,在 Text WS、Markdown WS、Tex WS 和 Python WS 上进行了测试。按预期工作。
【解决方案4】:

我不能说什么时候,但是 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)))

【讨论】:

    【解决方案5】:

    我在 2021 年 10 月在 Debian 11.1 上使用 Emacs 27.1。我编写了一个函数,它根据缓冲区的主要模式的类型做正确的事情,并将它与find-file-hook 挂钩,它为每个访问的文件运行。我将此作为其他答案的补充,而不是替代。理由:

    • 我发现flyspell-mode(无论是通过键绑定调用,还是作为模式挂钩调用),没有自动识别模式/缓冲区/文件的类型,相反由@RichieHH 回答。
    • 我发现 @zev 暗示的 flyspell-all-modes 不存在。
    • 我发现添加到text-mode-hook 的建议和 prog-mode-hook,根据@b4hand,尽其所能,但离开了 Flyspell 关闭了我打开的许多随机文件 基本模式。

    一个潜在的缺点是,这不会针对与任何文件关联的缓冲区运行。显然没有很好的方法来挂钩“创建任何缓冲区”。然而,一个人应该能够添加多个钩子而不会产生不良影响——如果多次调用,该函数应该会发现 Flyspell 已经启用,并且什么也不做。因此,如果您愿意,也可以为 text-mode-hookprog-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)))))
    

    【讨论】:

      猜你喜欢
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2013-09-13
      • 2013-04-01
      相关资源
      最近更新 更多