Emacs и Python, Python и Emacs

    В сети часто возникают разговоры на тему «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

    Поделиться публикацией

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

    Комментарии 56

      +2
      NetBeans 6.5 — готовится к выходу и обещает встроенную поддержку программирования на Python, ждем с нетерпением!

      Netbeans 6.5 уже зарелизилась!
      • НЛО прилетело и опубликовало эту надпись здесь
      0
      Спасибо, мне очень интересны такие статьи, python+emacs — сейчас для меня очень актуально :)
        +1
        Предлагаю перенести в блог Язык программирования Python
          +2
          Статья понравилась. Может заставлю себя опять попробовать Emacs.

          # Насчёт шрифтов Liberation согласен с вами на 100%
            0
            Прошу прощения, но не хватает :)
              +2
              Помог вам по мере возможностей
                0
                Спасибо! Перенес в Python.
                  0
                  Лучше бы в блог Emacs ;) IMHO
                    0
                    Кто в блоге Emacs и так все это умеет :) Конечно я от выбора IDE для Python скатился до описание настроек Emacs, но оно ведь ради Python все сделано.
            +1
            отличная статья, хоть я из противоположного лагеря вимовцев но труд оценил :)

            ps: не раз пытался осилить емакс но все никак, наверное сильно я привык к нескольким режимам редактирования.
              +1
              По идеологии пользователи vim и emacs скорее союзники — вечно что-то им хочется все время настраивать под себя, и никак не хватает им notepad++ и nano :)

              А vim я помню пробовал, но поскольку это было уже после emacs, то не получилось :) Это по-моему так работает — что первое попробовал после обычных редакторов, на том и остался, либо emacs, либо vim. Как первая работа — не имеет значения, что ты знаешь, твоя первая работа во многом определяет, чем ты будешь по жизни заниматься :)
                +1
                Фигня, я первым попробовал вим, а емакс аж через полтора года после него. И ничего, остался на Емаксе, вот уже больше 4-х лет. :)
                  0
                  Я рад, что нас много :)
              0
              А можно чуть подробнее чем не понравился Eclipse + PyDev под Ubuntu?
              По идее это все кроссплатформенные вещи, ставится без проблем.
              Что именно сподвигло переходить на новую среду разработки? Ведь помимо потраченных 6 часов будут еще потери времени на привыкание.
              Очень интересно, потому что я как раз хочу сделать обратный переход с консльных редакторов на Eclipse + PyDev :)
                0
                У него какой-то невразумительный автокомплит.
                Тормозит, да и глюкав несколько. Я вот толком не смог подсветку тёмную настроить. Нетбинс много лучше, если уж рассматривать такие решения.
                  0
                  1. Да, autocomplete не все берет и тормозит.
                  2. Сцуко тяжелый он :) Для Python хочется что-то быстрое и легкое.
                  3. Очень нравится Emacs :) (работа с буферами, окнами, сочетания клавиш, гибкость).
                  4. Желание ковыряться и настраивать все под себя.

                  Много субъективных причин, но все-таки это основное.
                  +1
                  Чувак дело говорит.
                  В деталях описывает процесс настройки emacs как python ide, да еще и всё своё добро из ~/.emacs.d скачать дает.
                    +2
                    Кхм, ссылка пропала куда-то.
                    Вот: www.enigmacurry.com/2008/05/09/emacs-as-a-powerful-python-ide/
                      0
                      Спасибо. Чувак тоже про Rope в основном рассказывает. Но узнал и нового — про YASnippet, например, хотя я не очень люблю сниппеты — я просто очень быстро набираю :-D
                    +1
                    Вечных вам плюсов в карму!)

                    p.s.: Не люблю такие комментарии, но иногда позволить можно, думаю :-)
                      0
                      Вечных? :) Спасибо! Я вообще рад, что пост столько положительных откликов вызвал.
                      0
                      Спасибо за статью! Такой вопрос: у меня на каждый def myfunction на верхнем уровне пишет «Redefining name 'myfunction' from outer scope», это глюк или я что-то не так понял?
                        +1
                        Это не глюк, а лишь предупреждение о потенциальном опасном коде :)

                        Почитайте mail.python.org/pipermail/python-list/2006-April/379343.html

                        «Q: W:933:sendStringToSocket: Redefining name 'nPortNumber' from outer scope (line What is wrong with using the same variable name in a function that is used by its caller?

                        A: It's not used by the caller but in the outer scope. It may confuse the
                        reader seeing `ham` in the outer scope and then `ham` in the function
                        without noticing that this is actually another `ham`.»
                          0
                          Спасибо. Внимательнее посмотрел, действительно эта ошибка.
                        0
                        Спасибо, давно хотел попробовать Emacs, да как-то не получалось.
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            > дружил Vim и Python
                            К сожалению, запрошенная Вами страница не найдена.
                            • НЛО прилетело и опубликовало эту надпись здесь
                            +1
                            А почему не вспомнили eric4? Или с ним что то не то?
                              0
                              Точно. Все время преследовало чувство, что какую-то IDE забыл упомянуть. Включил в список, спасибо.
                              0
                              Никогда emacs не использовал, попробую последовать совету, единственный вопрос, а как же переход с файла на другой файл, в netbeans и pydev+eclipse такая фишка есть. То есть если я нажимаю Cmd + по имени класса или метода то IDE открывает для меня тот файл где функция находится. Как с этим делом в emacs?
                                0
                                А вот в этом как раз Rope помогает — у него есть функция Go to definition (по умолчанию на клавишах C-c g, т.е. Ctrl+c, потом g). И еще в Rope много рефакторинга, которого просто нету в PyDev! :)
                                0
                                Вот спасибо. Как раз занимаюсь настройкой emacs под perl и python-программинг.

                                На счет автодополнений, на вики пишут, что можно задружить auto-complete.el с pysmell.el.
                                yasnippet, опять же неплох, хотя вимовский snippetsEmu.vim проще в настройке.
                                Ещё смотрю как бы тут удобным образом автоматически заголовки файла создавать, когда файл новый и python-mode.
                                  0
                                  Я ведь тоже только в начале Пути :) Про дальнейшие изыскания по autocompletion уже обещал написать, по выходным буду пытаться выложить результаты за неделю. И попробую таки посмотреть на сниппеты, второй раз в комментариях о них читаю.
                                  0
                                  А что это за всплывающие сообщения об ошибках? В моём emacs`е такого нет :o/
                                    0
                                    Просто мышкой навожу на pylint-овские выделения — он выводит всплывающее сообщение :)
                                      0
                                      Не, если я навожу, то подсказка в статус-баре выводится, а не всплывающим сообщением. Видимо, у вас что-то ещё на эту тему активировано.
                                        0
                                        Ага, разобрался. M-x customize-group tooltip и чтение настроек помогло.
                                          0
                                          Да, я тоже нашел :) После своего коммента ниже уже.
                                          0
                                          Может потому что у меня версия 23… Хотя в Windows помню и 22 выводил всплывающие сообщения при наведении. У вас же в иксах emacs, не в консоли?
                                      0
                                      В 23 емаксе сглаживание поддерживается?
                                      0
                                      > Текст подготовлен в ХабраРедакторе
                                      Почему не в емаксе? :)
                                        0
                                        Увы, хабр специфичен — хотя можно было приколоться :).
                                        Очень хотел htmlize использовать для посветки кода, но он выдает полную страницу и стили прописаны в шапке. Вроде можно настроить, чтобы вместо этого использовал, надо погуглить :).
                                          0
                                          habrahabr-mode.el?
                                            0
                                            Хм… :)
                                              0
                                              А что, отличная идея — поправить htmlize
                                              0
                                              набираешь конанду emacs:
                                              customize-group htmlize
                                              а потом в перменной Htmlize Output Type выставить соответственно `font`
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                              0
                                              Спасибо нормальная статья, что-то получилось, что-то нет
                                              Хотелось бы Полного How-To если это возможно?
                                              И про ttf шрифты (использую Monaco Cyr)
                                              0
                                              Часть того что перечислено стояло уже, посоветовали на freenode #python
                                              А вот до rope как-то руки не доходили. В итоге поставил, емакс выдавал ошибку при сохранении документа, после ребута магическим образом все нормализовалось. странно это как-то…

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое