Обновить

Emacs и Python, Python и Emacs

PythonEmacs
В сети часто возникают разговоры на тему «Python best IDE — does it really exist?». Для примера — недавний Q&A в группе Python community на LinkedIn (к сожалению, просмотр возможен только для пользователей группы). Если вкратце, то мир вертится вокруг:

  • Eclipse + PyDev — похоже, что самое популярное из свободных решений.
  • Komodo IDE — по отзывам отличное средство, но не free.
  • WingIDE — лучший autocompletion для Python, но опять-таки non-free.
  • Eric — IDE на Qt и QScintilla, пробовал только на Windows, видно недопробовал — показалась неудобной. Если у кого есть полезная информация и ссылки — поделитесь, пожалуйста, в комментариях.
  • NetBeans 6.5 — готовится к выходу встроенная поддержка Python в этой IDE версии 6.5, ждем с нетерпением!
  • Vim — для фанатов Vim ничего лучше быть, понятно, не может — после обработки напильником, правда.
  • Emacs — аналогично Vim — для пользователей, которые много времени проводят в Emacs, он дает лучший user-experience при разработке на любом языке.


Если первые четыре решения предоставляют IDE для Python прямо из коробки, то последние два требуют определенных настроек. Для Vim не знаю, но для Emacs надо потратить не меньше 6 часов поисков по интернету и экспериментов перед тем как будет получена удобная и (очень) функциональная среда для Python.

Что до меня, то весьма долгое время я работал с Eclipse + PyDev — вполне работоспособное решение. Но после окончательного переезда с Windows в Ubuntu (всем ставить шрифты Liberation в Убунте!), я решил таки завершить начатое уже давно — начать использовать Emacs не только как GTD-органайзер, IRC-клиент и редактор «когда не хочется запускать Eclipse».

История данных шести часов под хабракатом (история предполагает, что читающие хоть немного знакомы с Emacs и Python, а также носит Ubuntu(Debian)-specific оттенок, когда дело касается установки пакетов).



Emacs Python-Mode


Emacs версий 21 и старше имеют встроенный режим программирования на Python, называемый по имени файла модуля python.el. Существует и независимый проект, который дает примерно ту же функциональность. Сравним оба решения.

Встроенный python.el


Хорошая новость для тех, кому просто нужен удобный и функциональный текстовый редактор для python-скриптов – можно ничего, что описано ниже не делать, python.el обеспечивает хороший комплект возможностей прямо из коробки:

  1. Синтаксическая подсветка кода.
  2. Автоматическое расставление отступов.
  3. Возможность запуска внутреннего (в Emacs) интерпретатора.
  4. Запуск редактируемого кода во внутреннем интерпретаторе (как всего буфера, так и выделенной его части).
  5. Какой-никакой completion.
  6. Удобные функции комментирования/раскомментирования кода.
  7. Взаимодействие со справочной системой Python.


Независимый python-mode.el


Походив некоторое время по просторам интернета на тему «python-mode.el vs. python.el», я пришел к выводу, что большая часть сообщества пользуется модулем python-mode.el. Основные причины этого вполне себе изложены в этой ветке на форуме velocityreviews. Из основных можно выделить:

  1. Плохая «встроенность» внутреннего интерпретора у python.el.
  2. Отсутствие обозревателя классов у python.el.
  3. «Совсем не тот look&feel как у старого доброго python-mode.el» — сообщество придирчиво :)


Собственно различий не так уж и много и сразу они не будут заметны — нужно какое-то время поработать там и там, чтобы их обнаружить. Но я все-таки поставил python-mode.el: sudo aptitude install python-mode и делов — даже .emacs править не надо.

Итак, считаем, что режим выбрали, переходим дальше после пары скриншотов Emacs в Python-Mode:





Наблюдательные, наверное, заметили, что у меня в Emacs ttf-шрифты? Об этом будет небольшой следующий пост. Также можно заметить, что ошибки подсвечиваются на лету.

Подсветка ошибок на лету — pylint


У Emacs есть отличный режим flymake-mode, который позволяет подсвечивать на лету все ошибки компиляции (а также предупреждения и сообщения о плохом стиле программирования). Беда в том, что по умолчанию Python не поддерживается. Исправляем это упущение:

В консоли:
sudo aptitude install pylint pymacs

Эти пакеты требуются для flymake в python-mode. pylint — для проверки кода на ошибки, pymacs обеспечивает двусторонее взаимодействие между Python и EmacsLISP'ом.

Создайте следующий скрипт в вашем PATH (я создал в ~/bin), назовите его epylint:

#!/usr/bin/env python

import re
import sys

from subprocess import *

p = Popen("pylint -f parseable -r n --disable-msg-cat=C,R %s" %
          sys.argv[1], shell = True, stdout = PIPE).stdout

for line in p.readlines():
    match = re.search("\\[([WE])(, (.+?))?\\]", line)
    if match:
        kind = match.group(1)
        func = match.group(3)

        if kind == "W":
            msg = "Warning"
        else:
            msg = "Error"

        if func:
            line = re.sub("\\[([WE])(, (.+?))?\\]",
                          "%s (%s):" % (msg, func), line)
        else:
            line = re.sub("\\[([WE])?\\]", "%s:" % msg, line)

        print line,

    p.close()


Данный скрипт будет проверять наши исходники на ошибки вызовом pylint'а.

Далее, в вашем .emacs (обычно ~/.emacs, но у упорядоченных людей имеется небольшая иерархия файлов, вроде programming.el, python.el, common.el, которые подгружаются в .emacs c помощью load-file) добавляем строки:

(when (load "flymake" t)
  (defun flymake-pylint-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 "epylint" (list local-file))))

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

(add-hook 'python-mode-hook 'flymake-mode)


Последняя строчка необязательна — она включает режим flymake по умолчанию для всех новых буферов, использующих python-mode. Если ее не написать, для включения flymake нужно будет выполнять M-x flymake-mode в нужном буфере.

Все, подсветка ошибок должна заработать.

Рефакторинг и completion Python-кода


Идем на SourceForge-хостинг проектов Rope и Ropemacs, качаем rope и ropemacs, устанавливаем — sudo python setup.py install — оба пакета.

После этого нужно добавить в .emacs-файл строки:

(require 'pymacs)
(pymacs-load "ropemacs" "rope-")


Возможно, что вы заметили в процессе, что оба пакета rope и ropemacs — обычные python-модули. А расширение функционала Emacs с помощью ropemacs происходит через pymacs — который связывает EmacsLISP и Python.

Смотрим результат (обратите внимание на меню — там появился пункт «Rope», через который доступны большинство функций ropemacs):

Completion (срабатывает по нажатию M-/):


Рефакторинг (на примере Rename):


На самом деле это не лучший completion, который можно получить в Emacs для Python, но давайте в следующий раз :) Обещаю рассказать про свои дальнейшие изыскания.

Для новичков в Emacs


Я привык к Emacs'у, его сочетаниям клавиш и общей парадигме — поэтому со всем тем, что у получилось в итоге, мне работать в удовольствие — пальцы летают по клавиатуре, о мыши совсем забыл, минибуфер рулит… Однако у меня есть серьезные опасения, что у тех, кто Emacs'ом пока не пользовался, но хотел бы, возникнут серьезные проблемы — это как после Windows пересесть на Linux, очень похожие ощущения. Кнопки странные, курсор двигать слишком мудрено, какие-то буферы, окна… Именно для таких читателей пишу — если правда хочется попробовать Emacs (не зря же о нем столько разговоров) — пройдите сначала Emacs tutorial, потом поиграйте с ним с недельку по вечерам и уже потом запускайте его в свой рабочий процесс — отвыкнуть будет сложно. Я сам скептически относился к этому «редактору» полгода назад — а сейчас он у меня работает от включения до выключения компьютера, заменяя с десяток программ (органайзер, дневник, IDE для разных языков, просто редактор, jabber и IRC-клиент, средства для написания и публикования документации в html и не только, файловый менеджер) — причем он не навязывается, он просто удобней их.

Всем спасибо за внимание, надеюсь, информация будет полезной для вас. И да — это моя первая публикация на хабре, если есть оплошности — пишите в комментариях, учту на будущее.

Источники и полезные ссылки (многие из EmacsWiki по Python-Mode)


EmacsWiki по Python-Mode
Выбор между python.el и python-mode.el
Bazaar-репозитарий проекта python-mode.el
Включение completion в python-mode
Использование C-c! для запуска ipython вместо python
Нажимаем F1 для проверки кода pylint'ом
Отличный code completion и рефакторинг python-кода
Отладка python-кода в Emacs: PdbNotes
Python completion с pycomplete
И еще про completion

Теги:emacspythonсекс
Хабы: Python Emacs
Рейтинг +48
Количество просмотров 20,5k Добавить в закладки 120
Комментарии
Комментарии 56

Похожие публикации

Программист Python / python developer
от 120 000 до 160 000 ₽U-SystemВоронежМожно удаленно
Программист Python
до 200 000 ₽YLabМожно удаленно
Python-разработчик Middle
до 125 000 ₽ТатнефтьКазань
Разработчик Python
от 180 000 ₽Clover GroupМожно удаленно
Python Developer
от 200 000 до 300 000 ₽HighTeamМосква

Лучшие публикации за сутки