Как полностью отключить flymake и все, к чему он подключен?

Ниже приведены фрагменты в моем init.el отношение к Flymake:

(add-hook 'python-mode-hook 
      (lambda () 
        (unless (eq buffer-file-name nil) (flymake-mode 1)) ;dont invoke flymake on temporary buffers for the interpreter
        (local-set-key [f2] 'flymake-goto-prev-error)
        (local-set-key [f3] 'flymake-goto-next-error)
        (local-set-key [f4] 'flymake-display-err-menu-for-current-line)
        (hs-minor-mode)
        (orgtbl-mode)
        (outline-minor-mode -1)))

...

;;===== PyFlakes
;; code checking via pyflakes+flymake
(when (load "flymake" t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
               'flymake-create-temp-inplace))
       (local-file (file-relative-name
            temp-file
            (file-name-directory buffer-file-name))))
      (list "pychecker" (list local-file))))

  (add-to-list 'flymake-allowed-file-name-masks
           '("\\.py\\'" flymake-pyflakes-init)))

(mapcar (lambda (hook) (add-hook 'find-file-hook hook))
    (list 'flymake-find-file-hook))

(unload-feature 'flymake) ; unloaded in an attempt to get rid of the error

Но каждый раз, когда я find-file или же revert-buffer (расширения .xml, .php, .html) Я получаю следующую ошибку (не с .py):

Flymake: Не удалось запустить процесс проверки синтаксиса 'php' с аргументами (-f _posteddata_flymake.php -l): Поиск программы: разрешение запрещено, php. Flymake будет выключен

или же

Flymake: Не удалось запустить процесс проверки синтаксиса "xml" с аргументами (val //path/to/file/config/prod-conf_flymake.xml): Поиск программы: разрешение запрещено, xml. Flymake будет выключен

Я также пытался сделать (load "flymake" nil) но это тоже не сработало.

Большая потеря времени при открытии или перезагрузке большого количества файлов.

Как я могу это исправить?

2 ответа

Решение

Только не добавляйте Flymake в find-file-hook, Вместо этого добавьте его только в основные режимы, в которых вы хотите его использовать.

Возможно, вы также захотите взглянуть на альтернативный пакет Flycheck, который безопаснее включить в глобальном масштабе, поддерживает больше языков и требует гораздо меньше настроек. Отказ от ответственности: я автор этого пакета.

Я закончил с этим вопросом, пытаясь отключить flymake внутри python-mode / elpy, который вызывался по умолчанию. Это не идеально, но это сработало, поэтому я просто публикую это на случай, если это поможет кому-то еще, кто окажется здесь с той же проблемой.

Предполагая, что вы используете "use-package" в своей конфигурации и хотите заменить flymake на flycheck, для включения flycheck вам просто нужно добавить следующее в вашу конфигурацию:

(use-package flycheck
  :ensure t
  :init
  (global-flycheck-mode t))

Затем, чтобы добавить режим elpy и python, код будет выглядеть так:

(use-package python
  :mode ("\\.py" . python-mode)
  :ensure t
  :config
  (flymake-mode) ;; <- This line makes the trick of disabling flymake in python mode!
  (use-package elpy
    :ensure t
    :init
    (add-to-list 'auto-mode-alist '("\\.py$" . python-mode))
    :config
    (remove-hook 'elpy-modules 'elpy-module-flymake) ;; <- This removes flymake from elpy
    (setq elpy-rpc-backend "jedi")
    :bind (:map elpy-mode-map
              ("M-." . elpy-goto-definition)
              ("M-," . pop-tag-mark))
  )
  (elpy-enable)
)

Приведенный выше код включит режим elpy каждый раз, когда вы находитесь в python-режиме / редактируете файлы python. Проблема заключалась в том, что режим python автоматически включал flymake при загрузке, а затем elpy загружал flycheck. Таким образом, у вас будут запущены обе шашки.

Решение, которое я придумал, называлось flymake-mode еще один раз после загрузки режима Python, таким образом отключив его. Это, вероятно, должно работать и в других режимах / случаях.

Я знаю, что "правильным" решением было бы найти способ вообще не загружать flymake при загрузке режима python, но пока мне это не удастся, этого должно быть достаточно.

Другие вопросы по тегам