簡體   English   中英

如何在 emacs 中為所有文件和所有主要模式啟用 flyspell-mode?

[英]How to enable flyspell-mode in emacs for all files and all major modes?

如何在 Emacs 啟動后立即自動將 flyspell-mode 用於每個文件和每個主要模式?

另外,是否有不將 XML 標記標記為拼寫錯誤的單詞的 XML 詞典?

這個問題的答案對我有用:

如何默認啟用自動拼寫檢查?

此外,與其他先前的答案相比,它似乎更通用。 init.el添加到您的.emacsinit.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-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-modehtml-modenxml-mode進行了自定義,以不檢查標簽(從 Emacs 23.2 開始)。 如果您使用的是舊版本的 Emacs(回到 21.1),您應該能夠將它添加到您的 .emacs 以獲得對nxml-mode的支持:

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

您可以將以下內容添加到您的 Emacs init 文件中:

(flyspell-all-modes)

功能描述指出:

在所有主要模式中使用 Flyspell。 適用於現有緩沖區和您隨后創建的緩沖區。 如果打開,則關閉 `flyspell-text-modes'。

編輯:顯然上述功能僅包含在 Emacs 24 中的 flyspell 版本中。如果您不能使用該版本,則應改用 Trey 建議的解決方案來“半全局”啟用 flyspell。 要使用 NXML 禁用 XML 標記檢查,您可以將以下行添加到您的 Emacs init 文件中:

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

注意:此行已經在 Emacs 24 中包含的 flyspell.el 中。

我不知道什么時候,但是 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)))

我將於 2021 年 10 月在 Debian 11.1 上使用 Emacs 27.1。 我編寫了一個函數,它根據緩沖區的主要模式的類型做正確的事情,並將其掛鈎到find-file-hook ,它為每個訪問過的文件運行。 我提供此作為對其他答案的補充,而不是替代。 理由:

  • 我發現flyspell-mode (無論是通過鍵綁定調用還是作為模式鈎子調用),都不會自動識別模式/緩沖區/文件的類型,這與 @RichieHH 的回答相反。
  • 正如@zev 暗示的那樣,我發現flyspell-all-modes不存在。
  • 我發現添加到text-mode-hookprog-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)))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM