【问题标题】:How to complete disable flymake and all the things it is hooked to?如何完成禁用flymake和它所连接的所有东西?
【发布时间】:2013-12-26 07:26:13
【问题描述】:

以下是我init.el 中与 Flymake 相关的 sn-ps:

(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-filerevert-buffer(扩展名.xml.php.html)我都会收到以下错误(.py 除外):

Flymake:无法使用 args (-f _posteddata_flymake.php -l) 启动语法检查进程“php”:正在搜索程序:权限被拒绝,php。 Flymake 将关闭

Flymake:无法使用 args 启动语法检查过程“xml”(val //path/to/file/config/prod-conf_flymake.xml):搜索程序:权限被拒绝,xml。 Flymake 将关闭

我也尝试过(load "flymake" nil),但也没有用。

打开或重新加载大量文件时会耗费大量时间。

我该如何解决?

【问题讨论】:

  • 不是真正的解决方案,但试试flycheck。这是一款开箱即用的flymake,适用于大多数语言和配置,而且不会很糟糕。
  • 顺便说一句,(load "flymake" nil) 并没有按照您的想法执行,即卸载库。那是unload-feature,但是库需要明确支持卸载,而 Flymake 不需要。
  • 今天遇到了这个问题:如果您使用某种会话管理包,例如,删除您的 .emacsflymake 的任何和所有引用可能还不够。 desktop.el。一定要杀死那个状态,例如重新加载缓冲区

标签: emacs flymake


【解决方案1】:

只是不要将 Flymake 添加到 find-file-hook。而是只将它添加到主要模式的钩子中,您想在其中使用它。

您可能还想查看替代的Flycheck 包,它可以更安全地在全球范围内启用,支持更多语言,并且需要更少的自定义。免责声明:我是这个包的作者。

【讨论】:

  • 既然钩子已经到位,我该如何摆脱它?
  • 嗯,嗯,把小时配置sn-p中的对应行去掉就好了。
  • 在运行的 Emacs 上? ;)
  • 在运行的 Emacs 中,只需在已经有 Flymake 的缓冲区中执行 M-x flymake-mode,并自定义 find-file-hook 以删除 Flymake。
  • 您不需要将flymake-mode 添加到visit-file-hook。事实上,实际上你应该永远不要那样做,甚至互联网上的许多地方都这样告诉你。 Flymake 不会优雅地失败,因此不适合全局启用。不要从 Emacs Wiki 复制任何内容,如果您复制了有害的自定义设置,删除它们并重新启动 Emacs 通常是撤消这些操作的最简单方法。
【解决方案2】:

我最终遇到了这个问题,试图在默认调用的 python-mode / elpy 中禁用 flymake。它并不完美,但它有效,所以我只是发布它,以防它对最终在这里遇到同样问题的其他人有所帮助。

假设您在配置中使用“use-package”,并且您想用 flycheck 替换 flymake,要启用 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)
)

上面的代码会在你每次在 python 模式/编辑 python 文件时启用 elpy 模式。问题是python模式在加载时会自动启用flymake,然后elpy正在加载flycheck。所以你会同时运行两个检查器。

我想出的解决方案是在加载 python 模式后再次调用flymake-mode,从而禁用它。这可能也适用于其他模式/案例。

我知道“正确”的解决方案是找到一种在加载 python 模式时根本不加载 flymake 的方法,但在我设法做到这一点之前,这应该就足够了。

【讨论】:

  • M-x customize-variable elpy-modules 然后取消选中 Highlight syntax errors (Flymake)。然后Apply and Save。保存更改 python 的 use-package 配置。
  • @ayman 您的方法对我有用,但我想知道它会将更改写入哪里?我在init.el 中没有找到。
  • 回答我自己:我知道了,它从elpy-modules 列表中删除了elpy-module-flymake,所以我没有找到任何flymake 的东西。我以为它写了一行来明确禁用flymake
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多