Как включить 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)))))