Как включить flyspell-mode в emacs для всех файлов и всех основных режимов?

Как вы включаете режим flyspell, который будет автоматически использоваться для каждого файла и каждого основного режима, как только Emacs будет запущен?

Кроме того, существует ли словарь XML, который не помечает теги XML как слова с ошибками?

5 ответов

Решение

Скорее всего, вы действительно не хотите 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 или же init.el,

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

Вы можете добавить следующее в ваш файл инициализации Emacs:

(Flyspell-все-режимы)

Описание функции гласит:

Используйте Flyspell во всех основных режимах. Применяется как к существующим буферам, так и к буферам, которые вы впоследствии создаете. Отключает `flyspell-text-mode ', если включено.

РЕДАКТИРОВАТЬ: Очевидно, вышеупомянутая функция включена только в версию flyspell, которая есть в Emacs 24. Если вы не можете использовать эту версию, вам следует вместо этого использовать решение, предложенное Trey, для "полуглобального" включения flyspell. Чтобы отключить проверку тегов XML с помощью NXML, вы можете добавить следующую строку в файл инициализации Emacs:

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

Примечание: эта строка уже есть в flyspell.el, включенном в Emacs 24.

Я не могу сказать, когда, но теперь 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)))

Я использую Emacs 27.1 на Debian 11.1 в октябре 2021 года. Я написал функцию, которая делает правильные вещи в зависимости от типа основного режима буфера, и подключил ее к , который выполняется для каждого посещенного файла. Я предлагаю это как дополнение к другим ответам, а не замену. Обоснование:

  • я нашел (будь то вызывается ключом связывания, или как режим крюком), так и не автоматически распознает тип режима / буфера / файла, противоречащего ответ на @RichieHH.
  • я нашел не существует, как подразумевает @zev.
  • Я обнаружил, что предложение о добавлении и, согласно @b4hand, работает до конца, но оставил Flyspell отключенным для многих случайных файлов, которые у меня открыты в режиме Fundamental.

Одним из потенциальных недостатков является то, что это не будет работать для буферов, не связанных с каким-либо файлом. По-видимому, нет хорошего способа перехватить «создание любого буфера». Тем не менее, нужно иметь возможность добавлять к нескольким хукам без вредных эффектов - при многократном вызове функция должна обнаружить, что 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)))))
Другие вопросы по тегам