Запуск flymake для python, когда файлы не имеют расширения .py

Я вообще не любитель шепелявых, но моя основная среда сценариев живет на emacs, и мне нужна помощь, чтобы запустить мой flymake / pyflakes, когда у файлов нет расширения .py. Потому что некоторые из скриптов здесь, на моей работе, не имеют расширения .py.

Это неплохо работает с pylint, pep8, pychecker и т. Д., Когда я читаю / кодирую файл с расширением .py.

;; 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. Я обернул приведенный выше код с помощью python-mode-hook и изменил раздел \ .py \ на что-то вроде \. * \.

Однако это вызывает функцию flymake-pylint-init не только для файлов Python. Он вызывает все, что открыто в emacs.

Кстати, я не могу использовать m-x flymake-mode для файлов без расширения, он не открывает этот второстепенный режим.

Я хотел бы получить любую идею, чтобы заставить его работать. Благодарность!


person Muhammet Can    schedule 29.12.2012    source источник
comment
Почему бы не дать файлам расширение .py, если вы не возражаете, если я спрошу? Можно даже временно скопировать содержимое в буфер .py.   -  person PascalVKooten    schedule 29.12.2012


Ответы (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 и т. Д.

person scottfrazer    schedule 30.12.2012
comment
привет, сэр, спасибо, что нашли время. однако это не работает для меня (он не работает даже с файлами .py) мой файл конфигурации выглядит так; paste.ubuntu.com/1481689 Я использую Emacs 24.2.1 и установил разветвленную версию flymake, чтобы заставить его работать с бродягой отсюда; github.com/rpatterson/flymake-python Я что-то упустил? еще раз спасибо. - person Muhammet Can; 31.12.2012
comment
Попробуйте либо избавиться от строки (when (load "flymake" t) (и соответствующей закрывающей скобки), либо переместить туда код, который я вам дал. - person scottfrazer; 31.12.2012
comment
Я все равно получаю Wrong type argument: stringp, python-mode ошибку в минибуфере. - person Muhammet Can; 31.12.2012
comment
кстати, я понял, что базовый код, который вы здесь предоставили, уже был в моем файле flymake.el. - person Muhammet Can; 02.01.2013
comment
Нет, это не так. Как я сказал выше, я перезаписываю одну из функций flymake.el этой. Ваша проблема, скорее всего, в том, что моя функция сначала загружается, а затем перезаписывается оригиналом. Убедитесь, что этот код идет последним. - person scottfrazer; 02.01.2013
comment
да, ты был прав. перезапись была проблемой, большое спасибо за то, что нашли время, теперь я добился того, что хочу :) - person Muhammet Can; 02.01.2013

AFAIU окончание важно только для автоматического определения необходимого буферного режима. Вы можете вызвать режим явно, соответственно. интерактивный питон-режим M-x для любого файла.

person Andreas Röhler    schedule 29.12.2012