当文件没有.py扩展名时,为python运行flymake

时间:2012-12-29 15:10:29

标签: python emacs lisp flymake pyflakes

我根本不是一个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片段。我用python-mode-hook包装上面的代码,并将\ .py \ section更改为类似\。* \的内容。

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

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

我很想知道让它运转起来。谢谢!

2 个答案:

答案 0 :(得分:2)

首先让我说下面的代码通常不是修复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等做同样的事情。

答案 1 :(得分:0)

AFAIU结尾只对自动检测所需的缓冲模式很重要。 你可以明确地调用模式,resp。任何文件的交互式M-x python-mode。