How to complete disable flymake and all the things it is hooked to?

7.9k views Asked by At

Following are the snippets in my init.el relevant to 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

But everytime I find-file or revert-buffer (extensions .xml, .php, .html) I get the following error (not with .py):

Flymake: Failed to launch syntax check process 'php' with args (-f _posteddata_flymake.php -l): Searching for program: permission denied, php. Flymake will be switch OFF

or

Flymake: Failed to launch syntax check process 'xml' with args (val //path/to/file/config/prod-conf_flymake.xml): Searching for program: permission denied, xml. Flymake will be switch OFF

I've also tried doing (load "flymake" nil) but it didn't work either.

A big time sink when opening or reloading a big hunk of files.

How can I fix it?

2

There are 2 answers

9
AudioBubble On BEST ANSWER

Just don't add Flymake to find-file-hook. Instead only add it to the hooks of major modes, you'd like to use it in.

You may also want to look at the alternative Flycheck package, which is safer to enable globally, supports more languages, and needs much less customization. Disclaimer: I'm the author of this package.

3
gekaklam On

I ended up in this question trying to disable flymake inside the python-mode / elpy which was called by default. It ain't perfect, but it worked, so I'm just posting it in case it's of help to someone else who ends up here with the same problem.

Assuming you use "use-package" in your config, and you want to replace flymake with flycheck, to enable flycheck you just need to add the following to your config:

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

Then to add elpy and python mode, the code would be:

(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)
)

The above code would enable elpy mode every time you are in the python-mode / editing python files. The problem was that python mode was automatically enabling flymake when it was being loaded, and then elpy was loading flycheck. So you'd have both checkers running.

The solution I came up was calling flymake-mode one more time after loading the python mode, thus disabling it. This should probably work on other modes / cases too.

I know that a "proper" solution would be to find a way to not load flymake at all when loading the python-mode, but until I manage to do that, this should suffice.