3

私はまったく 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\ セクションを \.*\ のようなものに変更しました。

ただし、これは Python ファイルだけでなく flymake-pylint-init 関数を呼び出しています。emacs 内で開いたものは何でも呼び出します。

ところで、拡張子のないファイルでは mx flymake-mode を使用できません。そのマイナー モードを開いていません。

私はそれを機能させるためのアイデアを得たいと思っています。ありがとう!

4

2 に答える 2

2

まず、以下のコードは通常、Emacs の問題を修正する方法ではないと言うことから始めましょう。私がやっていることは、flymake をロードしてから、コア関数の 1 つを踏むことです。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などでも同じことができます。

于 2012-12-30T01:43:51.880 に答える
0

AFAIUエンディングは、必要なバッファモードを自動検出するためにのみ重要です。モードを明示的に呼び出すことができます。任意のファイルの対話型 Mx python-mode。

于 2012-12-29T18:59:28.137 に答える