【问题标题】:Running flymake for python when files don't have .py extension当文件没有 .py 扩展名时为 python 运行 flymake
【发布时间】:2012-12-29 15:10:29
【问题描述】:

我根本不是一个 lisp 人,但我的主要脚本环境依赖于 emacs,当文件上没有 .py 扩展名时,我需要一些帮助才能让我的 flymake/pyflakes 运行。因为我工作中的一些脚本没有 .py 扩展名。

当我读取/编码具有 .py 扩展名的文件时,这非常适合 pylint、pep8、pychecker 等。

;; flymake for python
(add-to-list 'load-path "~/.emacs.d/plugins/flymake")

(when (load "flymake" t)
  (defun flymake-pylint-init (&optional trigger-type)
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-with-folder-structure))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name)))
           (options (when trigger-type (list "--trigger-type" trigger-type))))
      (list "~/.emacs.d/plugins/flymake/pyflymake.py" (append options (list local-file)))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pylint-init)))

(add-hook 'find-file-hook 'flymake-find-file-hook)

;; flymake help on minibuffer
(defun my-flymake-show-help ()
  (when (get-char-property (point) 'flymake-overlay)
   (let ((help (get-char-property (point) 'help-echo)))
    (if help (message "%s" help)))))

(add-hook 'post-command-hook 'my-flymake-show-help)

当没有 .py 扩展名时,我试图让这个工作的 init sn-p 工作。我用 python-mode-hook 包装了上面的代码,并将 \.py\ 部分更改为 \.*\ 之类的东西。

然而,这不仅是为 python 文件调用 flymake-pylint-init 函数。它称它为在 emacs 中打开的任何东西。

顺便说一句,我不能在无扩展文件上使用 m-x flymake-mode,它没有打开那个次要模式。

我很想知道让它工作的任何想法。谢谢!

【问题讨论】:

  • 如果你不介意我问,为什么不给文件加上 .py 扩展名呢?甚至可以将内容临时复制到 .py 缓冲区。

标签: python emacs lisp flymake pyflakes


【解决方案1】:

首先让我说下面的代码通常不是解决 Emacs 问题的方法。我所做的是加载 flymake 然后踩到其中一个核心功能。由于 flymake 的编写方式,我找不到挂钩函数甚至使用建议的方法。如果 flymake 改变了这个函数或它的调用方式,它将不再起作用。也就是说,它已经为我工作了多年:)

这是基本代码:

(require 'flymake)

(defun flymake-get-file-name-mode-and-masks (file-name)
  "Return the corresponding entry from `flymake-allowed-file-name-masks'."
  (unless (stringp file-name)
    (error "Invalid file-name"))
  (let ((fnm flymake-allowed-file-name-masks)
        (mode-and-masks nil)
        (matcher nil))
    (while (and (not mode-and-masks) fnm)
      (setq matcher (car (car fnm)))
      (if (or (and (stringp matcher) (string-match matcher file-name))
              (and (symbolp matcher) (equal matcher major-mode)))
          (setq mode-and-masks (cdr (car fnm))))
      (setq fnm (cdr fnm)))
    (flymake-log 3 "file %s, init=%s" file-name (car mode-and-masks))
    mode-and-masks))

然后从你上面的代码,而不是这个:

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

这样做:

(add-to-list 'flymake-allowed-file-name-masks '(python-mode flymake-pylint-init))

你可以对 Perl 等做同样的事情。

【讨论】:

  • 您好,先生,感谢您抽出宝贵时间。但是,这对我不起作用,(甚至 .py 文件都不起作用)我的配置文件看起来像这样; paste.ubuntu.com/1481689 我正在运行 Emacs 24.2.1 并且我安装了 flymake 的分叉版本,以便从这里与 tramp 一起工作; github.com/rpatterson/flymake-python 我错过了什么吗?再次感谢。
  • 尝试去掉 (when (load "flymake" t) 行(它是相应的结束括号),或者将我给你的代码移到那里。
  • 无论哪种方式,我都会在 minibuffer 上收到 Wrong type argument: stringp, python-mode 错误。
  • 顺便说一句,我发现你在这里提供的基本代码已经在我的 flymake.el 文件中了。
  • 不,不是。正如我上面所说,我正在用这个覆盖 flymake.el 函数之一。您的问题很可能是我的函数首先被加载然后被原始函数覆盖。确保此代码位于最后。
【解决方案2】:

AFAIU 结尾仅对自动检测所需的缓冲模式很重要。 您可以显式调用模式,分别。任何文件的交互式 M-x python-mode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2013-02-24
    • 2021-01-13
    • 2022-09-24
    • 2021-08-25
    • 1970-01-01
    • 2011-07-20
    • 2013-05-26
    相关资源
    最近更新 更多