Python и emacs, несколько удобных решений

    Расскажу немного о том, как быстро превратить emacs в полноценную python IDE. Начнем с интересного способа автозавершения кода + по ходу дела добавим еще пару интересных и полезных возможностей. Наверняка многие используют что-то типа rope (или может свои какие-то решения) и это довольно разумно, но не слишком наглядно. Расскажу об одном дополнительном способе.

    Теперь по нажатию TAB мы будем получать вот это:
    image


    1. И так, перво-наперво открываем ~/.emacs и добавляем (если раньше этого сделано не было) каталог загрузки скриптов (add-to-list ‘load-path “~/.emacs.d/”) вместо ~/.emacs.d/ можете использовать свой, но я предпочитаю этот (пока не закрывайте .emacs, он нам понадобится позднее).

    2. Скачиваем файлы для автокомплитов github.com/m2ym/auto-complete и кладем их в папку ~/.emacs.d/ или в ту в которую вы указали ранее.
    Подключаем в .emacs
    (require ‘auto-complete-config)
    (global-auto-complete-mode t)


    3. Далее скачиваем последнюю версию yasnippet code.google.com/p/yasnippet/downloads/list нам нужны файлы YASnippet Bundle и YASnippet Release.
    YASnippet это система шаблонов для emacs. Например чтобы создать новую функцию нужно набрать «def» и нажать TAB, последующие нажатия TAB будут перемещать вас внутри созданного шаблона.

    Подключаем в .emacs
    (require ‘yasnippet)
    (yas/initialize)
    (yas/load-directory “~/.emacs.d/snippets”)


    4. Скачиваем python-mode.el (если вдруг вы его еще не установили). Последнюю версию можно забрать здесь: launchpad.net/python-mode

    Напоминаю, что все скачанное кидаем в нашу папку для загрузки ~/.emacs.d/.

    5. Устанавливаем Rope, Ropemacs и Pymacs.

    sudo apt-get install pymacs

    sudo apt-get install mercurial
    mkdir /tmp/rope && cd /tmp/rope
    hg clone http://bitbucket.org/agr/rope
    hg clone http://bitbucket.org/agr/ropemacs
    hg clone http://bitbucket.org/agr/ropemode

    Теперь нам понадобится easy_install
    wget http://peak.telecommunity.com/dist/ez_setup.py
    sudo python ez_setup.py
    sudo easy_install rope
    ln -s ../ropemode/ropemode ropemacs/
    sudo easy_install ropemacs

    6. Устанавливаем pyflakes для автоматической проверки синтаксиса.
    sudo apt-get install pyflakes

    7. Создаем файл init_python.el в нашей дирректории ~/.emacs.d/ и вставляем туда этот код:

    (autoload 'python-mode "python-mode" "Python Mode." t)
    (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
    (add-to-list 'interpreter-mode-alist '("python" . python-mode))
    (require 'python-mode)
    (add-hook 'python-mode-hook
    (lambda ()
    (set-variable 'py-indent-offset 4)
    ;(set-variable 'py-smart-indentation nil)
    (set-variable 'indent-tabs-mode nil)
    (define-key py-mode-map (kbd "RET") 'newline-and-indent)
    ;(define-key py-mode-map [tab] 'yas/expand)
    ;(setq yas/after-exit-snippet-hook 'indent-according-to-mode)
    (smart-operator-mode-on)
    ))
    ;; pymacs
    (autoload 'pymacs-apply "pymacs")
    (autoload 'pymacs-call "pymacs")
    (autoload 'pymacs-eval "pymacs" nil t)
    (autoload 'pymacs-exec "pymacs" nil t)
    (autoload 'pymacs-load "pymacs" nil t)
    ;;(eval-after-load "pymacs"
    ;; '(add-to-list 'pymacs-load-path YOUR-PYMACS-DIRECTORY"))
    (pymacs-load "ropemacs" "rope-")
    (setq ropemacs-enable-autoimport t)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;; Auto-completion
    ;;; Integrates:
    ;;; 1) Rope
    ;;; 2) Yasnippet
    ;;; all with AutoComplete.el
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (defun prefix-list-elements (list prefix)
    (let (value)
    (nreverse
    (dolist (element list value)
    (setq value (cons (format "%s%s" prefix element) value))))))
    (defvar ac-source-rope
    '((candidates
    . (lambda ()
    (prefix-list-elements (rope-completions) ac-target))))
    "Source for Rope")
    (defun ac-python-find ()
    "Python `ac-find-function'."
    (require 'thingatpt)
    (let ((symbol (car-safe (bounds-of-thing-at-point 'symbol))))
    (if (null symbol)
    (if (string= "." (buffer-substring (- (point) 1) (point)))
    (point)
    nil)
    symbol)))
    (defun ac-python-candidate ()
    "Python `ac-candidates-function'"
    (let (candidates)
    (dolist (source ac-sources)
    (if (symbolp source)
    (setq source (symbol-value source)))
    (let* ((ac-limit (or (cdr-safe (assq 'limit source)) ac-limit))
    (requires (cdr-safe (assq 'requires source)))
    cand)
    (if (or (null requires)
    (>= (length ac-target) requires))
    (setq cand
    (delq nil
    (mapcar (lambda (candidate)
    (propertize candidate 'source source))
    (funcall (cdr (assq 'candidates source)))))))
    (if (and (> ac-limit 1)
    (> (length cand) ac-limit))
    (setcdr (nthcdr (1- ac-limit) cand) nil))
    (setq candidates (append candidates cand))))
    (delete-dups candidates)))
    (add-hook 'python-mode-hook
    (lambda ()
    (auto-complete-mode 1)
    (set (make-local-variable 'ac-sources)
    (append ac-sources '(ac-source-rope)));;(append ac-sources '(ac-source-rope) '(ac-source-yasnippet)))
    (set (make-local-variable 'ac-find-function) 'ac-python-find)
    (set (make-local-variable 'ac-candidate-function) 'ac-python-candidate)
    (set (make-local-variable 'ac-auto-start) nil)))
    ;;Ryan's python specific tab completion
    (defun ryan-python-tab ()
    ; Try the following:
    ; 1) Do a yasnippet expansion
    ; 2) Do a Rope code completion
    ; 3) Do an indent
    (interactive)
    (if (eql (ac-start) 0)
    (indent-for-tab-command)))
    (defadvice ac-start (before advice-turn-on-auto-start activate)
    (set (make-local-variable 'ac-auto-start) t))
    (defadvice ac-cleanup (after advice-turn-off-auto-start activate)
    (set (make-local-variable 'ac-auto-start) nil))
    (define-key py-mode-map "\t" 'ryan-python-tab)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;; End Auto Completion
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;; Auto Syntax Error Hightlight
    (when (load "flymake" t)
    (defun flymake-pyflakes-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 "pyflakes" (list local-file))))
    (add-to-list 'flymake-allowed-file-name-masks
    '("\\.py\\'" flymake-pyflakes-init)))
    (add-hook 'find-file-hook 'flymake-find-file-hook)
    (provide 'init_python)


    Добавляем ее в .emacs (load-library "init_python")

    Все! Теперь по кнопке tab мы будем получать выпадающий список с вариантами автокомплитов.

    На последок приятная мелочь.
    8. ipython вместо стандартной консоли.

    sudo easy_install ipython

    скачиваем в полюбившуюся вам ~/.emacs.d/ скрипт ipython.scipy.org/dist/ipython.el
    подключаем в .emacs
    (require 'ipython)
    (setq py-python-command-args '( "-colors" "Linux"))
    (defadvice py-execute-buffer (around python-keep-focus activate)
    "return focus to python code buffer"
    (save-excursion ad-do-it))


    Ну вот наверно и все. Разве что возможно вам захочется сменить цвет подсветки на другой, но об этом вы найдете кучу статей в интернете и на хабре. Желаю удачи!

    PS Статья на английском, по мотивам которой была написана данная статья: www.enigmacurry.com/2009/01/21/autocompleteel-python-code-completion-in-emacs
    Share post

    Similar posts

    Comments 55

      0
      Помню такую штучку, очень удобно. Сейчас похожее для руби не отказался бы найдти.
        0
        Видел похожие слова но, конечно, не пробовал. Если интересно покопаться посмотрите www.cx4a.org/pub/ файл auto-complete-ruby.el. В нем запрашивается rcodetools я честно говоря без понятия что это, но нагуглилось вот rubyforge.org/projects/rcodetools/
        Дерзайте одним словом (:
          0
          Плагины для emacs под ruby on rails
          Мне очень понравилась сборка;)
        • UFO just landed and posted this here
            +1
            спам?! О ля ля.
              0
              зелёный, жирный…
              0
              Вот бы кто для С++ такой процесс расписал (для emacs или для vi) — хочется попробовать, но самому разбираться как-то лениво.

              А то все что-то говорят, что emacs и vi — это круто, а сколько я не пытался к ним подобраться, они мне всегда казались абсолютно нечеловеческими, и устаревшими (о боже, не используйте стрелочки, их же может не быть на вашем терминале О_о про мышь так вообще молчат мануалы). Не понимать!
                0
                Я тоже примерно так же думал пока не попробовал.
                А стрелочки не рекомендуют не потому что их «нет на вашем терминале», а потому что при использовании сокращений не приходится отрывать руки от привычного положения «фыва-олдж»
                    0
                    потому что стрелочки это самый тупой и казуальный способ перемещения по исходнику =)
                    0
                    Без указания протокола не пашет :)
                    hg clone bitbucket.org/agr/rope/
                    hg clone bitbucket.org/agr/ropemacs/
                    hg clone bitbucket.org/agr/ropemode/
                      0
                      спасибо, кое-кто скушал «http://»
                        0
                        ааа, это хабр рубит
                        0
                        Большое спасибо за статью!

                        Ой, а аппетитной расцветкой не поделитесь?
                          +2
                          Пожалуйста.
                          Темка просто лучшее что я видел! Случайно увидел на одном форуме ссылку. Держите.
                          0
                          Мне больше всего нравится zenburn
                          0
                          А как можно сделать показ необходимых параметров функций, заставить отображаться docstring во всплывающей подсказке?
                          Есть ли что-то типа F3, как в PyDev- т.е. переход к описанию элемента под курсором?

                          Если нет всего этого, то даже стандарный IDLE лучше.
                            0
                            > Если нет всего этого

                            Смеетесь? В emacs всё есть.
                              0
                              Тогда дайте мне ссылку на дистрибутив emacs, где всё-работает-из-коробки, чтобы функциональность была аналогична Eclipse)
                                +2
                                Только в обмен на ссылку на дистрибутив хрома, и чтобы там из коробки работала функциональность аналогичная моему firefox с десятком расширений.
                                  0
                                  Вы шутите или просто не понимаете, о чем речь?
                                    0
                                    Не шучу ни в коем случае. Даже у той же Firefox или Miranda есть всякие сборки, почему бы не выпускать такое же для emacs?
                                      0
                                      А вроде бы есть, хотя я и не пользуюсь. В ubuntu есть пакеты конфигураций:

                                      happycoders-emacs
                                      emacs-extra
                                        0
                                        emacs-goodies-el
                            • UFO just landed and posted this here
                              • UFO just landed and posted this here
                                  0
                                  Нет, к сожалению. Но что поделать другие автокомплиты для emacs, что я видел еще хуже.
                                  • UFO just landed and posted this here
                                  0
                                  А у меня почему-то методы не дополняет, как на скрине, только зарезервированные слова
                                    0
                                    помимо зарезервированных слов еще выдаются все варианты слов в модуле начинающиеся на то сочетание что вы набрали. Так что если вы вызываете метод класса описанного в этом же файле, то все должно работать. И вы что-то неправильно подключили.
                                    Ну либо я вас не понял.
                                      0
                                      Все вроде получилось подключить, но после запуска emacs и нажатии tab для автодополнения, то вылазит диалог выбора директории для 'rope project root folder' — для чего это выводится?
                                      Как сделать, чтобы не выводилось.
                                      Причем после выбора произвольной директории не спрашивает до следующего перезапуска emacs.

                                      Подскажите в чем может быть дело.
                                    0
                                    Какой у вас шрифт в терминале?
                                      0
                                      consolas, тока тсссс +)
                                        0
                                        А что, MS делает неплохие шрифты. Заявляю во всеуслышание: на моем линукс-боксе в качестве fixed шрифта стоит Consolas, в том числе и в емаксе :)
                                          0
                                          К тому же Consolas — это еще и очень качественная кириллица:
                                            0
                                            ничего не видно, повторите пожалуйста
                                      0
                                      что-то картинку не получилось приложить, вообщем тут скриншот:
                                      dl.dropbox.com/u/494475/consolas.png

                                        0
                                        Подскажите пожалуйста, а для PHP и Javascript есть такой инструмент?
                                        • UFO just landed and posted this here
                                          0
                                          А я вот не люблю автодополнение, зато настроил Flymake+pylint+tidy, теперь XHTML и Python-код проверяется на лету. И YASnippet использую просто так.
                                          А для xhtml еще zencoding-mode (: Короче, в прямых руках Emacs рулит.
                                          P.S. Спасибо за цветовую тему!
                                            0
                                            Подскажите пожалуйста как настроить запуск команд emacs в режиме русской раскладки.
                                              0
                                              Если под никсами, то раскладку нужно переключать с помощью встроенной в emacs комбинации клавиш. По умолчанию: Alt+\
                                                0
                                                Я тут старательно описывал суть проблемы: vyazovoi.info/pages/emacs-im-switching.html
                                                  0
                                                  у меня в сиситеме альт+шифт, а в емаксе по капсу.
                                                0
                                                Спустя время прочитав собственную статью пришел в ужас. Надеюсь меня простят за мешанину менеджеров пакетов :)
                                                  0
                                                  Легко простят ;) Особенно если напишите ишо :) Вот я задавшись целью запускать python из emacs все скопипастил с вашей статьи когда-то — все работало — так что огромная благодраность! С удовольствием почитал бы еще варианты с уклоном на использование менеджеров пакетов… Потому как при переезде на другуй комп пройти этот квест ишо раз неосилил ;)

                                                  P.S. да, я знаю что статье 3 года, но вдруг автор еще порадует…
                                                    0
                                                    OH SHI~ и правда два года уже
                                                    Сейчас можешь посмотреть мой конфиг github.com/zubchick/my-emacs-conf может найдешь что полезное :)
                                                    Но там толстый zubchick.el который (кто бы сомневался) еще далек от совершенства.
                                                      0
                                                      ах да и еще емакс 24
                                                        0
                                                        ядрен батон… сколько же у тебя там всего ;)
                                                        не прошел я этот квест :(
                                                        ругалось на шрифт, tabbar-ruler — покоментил
                                                        на slime-nav-mode-autoloads (кажись так ;) сдался — мне бы пока чего попроще ;)
                                                        кстати, табы таки появились…
                                                        emacs беру из emacs.naquadah.org/ вроде новее некуда — тока самому собирать…
                                                          0
                                                          шрифт коотрый у меня стоит мак-специфичный, ненужные пакеты можно покоментировать в init.el ненужные куски можно поудалять из большого конфига тоже :)
                                                  0
                                                  Извиняюсь, что через такой большой промежуток времени пишу.

                                                  Начинаю осваивать emacs, как я понимаю, не обязательно что-то записывать в файл .emacs, он сам подхватит все из .emacs.d или я не прав?
                                                    0
                                                    нет, настройки либо в файле .emacs либо в .emacs.d/init.el
                                                    0
                                                    Спасибо.

                                                    Only users with full accounts can post comments. Log in, please.