Пользователь
0,0
рейтинг
29 октября 2013 в 00:51

Разработка → Emacs как IDE для Python из песочницы

Как известно, существует множество решений которые позволяют сделать из «консольного» редактора (vim/emacs) более-менее удобную IDE для языка Python. Представляю Вашему вниманию наиболее успешную, на мой взгляд, реализацию среды разработкы в редакторе emacs на основе пакета python-jedi.el. Отмечу, что бандл заменяющий rope(*-jedi) есть так же для vim, инстукцию по его настройке можно найти здесь .

image

1. Подготовка к настройке


Для настройки emacs следует знать о стандартном конфигурационном файле, который располагается в ~/.emacs и директории ~/.emacs.d куда мы будем добавлять плагины.
Так же следует ознакомиться с сокращениями и обозначений «горячих» клавиш. Таких как C(по-умолчанию Ctrl) и Meta(по-умолчанию Alt). Так же существуют определенные правила при написании комбинаций клавиш, так, например: C-h t Данная команда означает, что надо одновременно нажать Ctrl и h, отпустить, затем t. Полный список «горячих» клавиш.
После того как разобрались с основными клавишами и порядком их использования, можно приступать к превращению редактора в IDE.

2. Необходимые пакеты


Конечно, кроме python-jedi нам понадобятся еще такие пакеты как:
  • auto-complete: интерактивное авто-дополнение;
  • autopair: авто-закрытие кавычек и скобок;
  • flycheck: проверка синтаксиса;
  • ido-settings.el: интерактивное управление буферами и файлами;
  • ipython: интеграция с мощной интерактивной оболочкой python;
  • linum-mode: нумерация строк;

Сам же python-jedi, является расширенным авто-дополнением кода, т.е. в отличие от auto-complete, он умеет дополнять еще и тот код который вы еще не вводили в данном файле, например — дополнение импорта

2.1 Установка пакетов в Emacs-24

Для простой и быстрой установки пакетов в emacs лучше всего воспользоваться ELPA (Emacs Lisp Package Archive), для этого необходимо в конфиг-файл .emacs добавить репозитории и определить директорию откуда будут подгружаться модули
(add-to-list 'load-path "~/.emacs.d/")
(load "package")
(require 'package)
(setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")
                          ("melpa" . "http://melpa.milkbox.net/packages/")))


После этого можно получить список
M-x: package-list-packages

и преступить к установке пакетов auto-complete, autopair, flycheck, ipython
M-x: package-install

Однако, кроме package существует решение el-get, отличительной особенностью которого яляется умение автоматически докачивать зависимости. Для установки el-get перейдите в буфер *scratch* (C-x b) и вставьте следующие строки:
(url-retrieve
 "https://raw.github.com/dimitri/el-get/master/el-get-install.el"
 (lambda (s)
   (let (el-get-master-branch)
     (goto-char (point-max))
     (eval-print-last-sexp))))

затем нажмите C-j (это выполнит код), после этого добавляем в конфиг директорию el-get c условием перезакачки скрипта
(add-to-list 'load-path "~/.emacs.d/el-get/el-get")
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))
(el-get 'sync)

Т.к. пакет ido уже присутствует в emacs 24, то просто активируем его через .emacs:
(require 'ido)
(ido-mode t)


2.2 Установка jedi

Для корректной работы python-jedi необходим python-модуль virtualenv, в большинстве ОС, по-умолчанию, он отсутствует, устанавливаем через pip:
pip install virtualenv

M-x: el-get-install jedi

После этого в конфигурационный файл добавляем
(add-hook 'python-mode-hook 'auto-complete-mode)
(add-hook 'python-mode-hook 'jedi:ac-setup)


2.2 Навигация по проекту

Для передвижения по директории проекта, предлагается использовать emacs-nav
M-x: el-get-install emacs-nav

image

3. Дополнительные пакеты


Дополнительно можно установить модуль для автоматического подсвечивания ошибок и автоматического закрытия кавычек и скобок.Правим .emacs:
(add-hook 'after-init-hook #'global-flycheck-mode)

(require 'autopair)
(autopair-global-mode) 

Отмечу, что последний (autopair) может создать очень много скобок или кавычек при копи-пасте, для отключения оного следует удалить две последние строчки.
Для того, что бы использовать ipython как оболочку по-умолчанию, добавляем строчки
(setq-default py-shell-name "ipython")
(setq-default py-which-bufname "IPython")


Заключение


Вот и все, из простого редактора мы получили, по функциональным возможностям, IDE с собственным менеджером пакетов и возможностью расширения.
image
Спасибо всем кто дочитал до конца.
Dmitry K @ex0hunt
карма
3,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (7)

  • 0
    Поделюсь ка я и своим init.el, может кому пригодится.

    ~/.emacs.d/init.el
    ;; path
    (setq root-dir (expand-file-name "~/.emacs.d"))
    (add-to-list 'load-path root-dir)
    ;; (add-to-list 'load-path (concat root-dir "/misc"))
    
    (global-set-key "\C-q" 'save-buffers-kill-terminal)
    (cua-mode)
    (show-paren-mode)
    
    ;; fixing xterm bug
    (define-key input-decode-map "\e[1;2A" [S-up])
    
    
    ;; Marmelade
    (require 'package)
    (add-to-list 'package-archives 
        '("marmalade" .
          "http://marmalade-repo.org/packages/"))
    (package-initialize)
    
    
    ;; Programming shortcuts
    ;; (global-set-key (kbd "C-_") 'comment-region)
    
    
    ;; Clojure: nrepl
    (when (not (package-installed-p 'nrepl))
      (package-install 'nrepl))
    
    ;; Clojure: key bindings
    (add-hook 'clojure-mode-hook
    	  '(lambda () (local-set-key "\C-d" 'nrepl-eval-expression-at-point)))
    
    
    ;; Python
    ;; NOTE: this section contains a number of useful setting for all modes, 
    ;; not only python mode! 
    (add-to-list 'load-path "~/.emacs.d/emacs-for-python/") 
    (require 'epy-setup)      ;; It will setup other loads, it is required!
    (require 'epy-python)     ;; If you want the python facilities [optional]
    (require 'epy-completion) ;; If you want the autocompletion settings [optional]
    (require 'epy-editing)    ;; For configurations related to editing [optional]
    (require 'epy-bindings)   ;; For my suggested keybindings [optional]
    (require 'epy-nose)       ;; For nose integration
    (epy-setup-ipython)
    (setq skeleton-pair nil)
    
    (defun trim-string (string)
      (replace-regexp-in-string "\\`[ \t\n]*" "" 
    			    (replace-regexp-in-string "[ \t\n]*\\'" "" string)))
    
    (defun python-shell-send-line () 
      (interactive)
      (python-shell-send-string (trim-string (thing-at-point 'line)) nil t))
    
    
    (add-hook 'python-mode-hook
              '(lambda ()
                 (local-set-key (kbd "C-d") 'python-shell-send-line)
                 (local-set-key (kbd "C-c C-k") 'python-shell-send-buffer)
                 (local-set-key (kbd "C-c !") 'run-python)
                 (pretty-lambda-mode)
                 (jedi:setup)
                 (setq jedi:setup-keys t)
                 (setq jedi:complete-on-dot t)))
    
    ;; (setq python-remove-cwd-from-path nil)
    ;; (require 'ipython)
    ;; (setq py-shell-name "ipython")
    
    
    ;; Ruby
    (add-to-list 'load-path "~/.emacs.d/ruby")
    (autoload 'ruby-mode "ruby-mode"
      "Mode for editing ruby source files")
    (add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
    (add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
    (autoload 'run-ruby "inf-ruby"
      "Run an inferior Ruby process")
    (autoload 'inf-ruby-keys "inf-ruby"
      "Set local key defs for inf-ruby in ruby-mode")
    (add-hook 'ruby-mode-hook
    	  '(lambda ()
    	     (inf-ruby-keys)
    	     (local-set-key "\C-d" 'ruby-send-definition)))
    (add-hook 'ruby-mode-hook 'turn-on-font-lock)
    
    
    ;; Octave
    (autoload 'octave-mode "octave-mod" nil t)
    (setq auto-mode-alist
          (cons '("\\.m$" . octave-mode) auto-mode-alist))
    
    (add-hook 'octave-mode-hook
    	  (lambda ()
    	    (abbrev-mode 1)
    	    (auto-fill-mode 1)
    	    (if (eq window-system 'x)
    		(font-lock-mode 1))))
    
    (add-hook 'octave-mode-hook 
              (lambda () 
                (local-set-key "\C-d" 'octave-send-block)
    	    (local-set-key "\C-f" 'octave-send-defun)
    	    (local-set-key "\C-j" 'octave-send-line)))
    
    
    ;; R
    (add-to-list 'auto-mode-alist '("\\.r$" . R-mode))
    (add-to-list 'auto-mode-alist '("\\.R$" . R-mode))
    
    
    ;; PHP
    (add-to-list 'auto-mode-alist '("\\.php$" . php-mode))
    (add-hook 'php-mode-hook 
              (lambda () 
    	    (setq tab-width 4) ; or any other preferred value
    	    (defvaralias 'c-basic-offset 'tab-width)
    	    (defvaralias 'cperl-indent-level 'tab-width)))
    
    ;; Markdown
    (add-to-list 'auto-mode-alist '("\\.md" . markdown-mode))
    
    
    (custom-set-variables
     ;; custom-set-variables was added by Custom.
     ;; If you edit it by hand, you could mess it up, so be careful.
     ;; Your init file should contain only one such instance.
     ;; If there is more than one, they won't work right.
     )
    (custom-set-faces
     ;; custom-set-faces was added by Custom.
     ;; If you edit it by hand, you could mess it up, so be careful.
     ;; Your init file should contain only one such instance.
     ;; If there is more than one, they won't work right.
     '(font-lock-comment-face ((t (:foreground "magenta")))))
    


    В файле собраны настройки для Clojure, Python, Ruby, Octave, R, PHP и Markdown, а также некоторые настройки шрифтов, фикс для бага xterm (из-за которого в консольной версии курсор не двигается вверх), плюс пара горячих клавиш, к которым у меня лежала душа. Код разбит на секции, и любую из них можно выбросить без вреда для здоровья. Исключение — секция для Python, где прописаны настройки emacs-for-python, влияющие на поведение всего редактора. Если что-то не работает, скорее всего не хватает либо имаксовских пакетов, либо внешних библиотек, что, впрочем, обычно чинится за 15-20 минут.
  • 0
    M-x: el-get-install emacs-nav
    

    не работает
    • 0
      Сейчас в репо пакет называется nav, а не emacs-nav.

      P.S. А как же без elscreen? Без вкладок неудобно, имхо.
      • 0
        Когда переходил с больших IDE тоже так думал. Потом попробовал без них, и оказалось что буферов хватает и регистров хватает с головой.
  • 0
    А для какой версии Питона все это должно работать? А то у меня стоит 2.7.5 и 3.x.x и в итоге, как бы я не настраивал, ничего не вышло.
    • 0
      Теоретически должно работать на любой версии, у меня на 2.7.3 и 2.7.5 все дополняет. Тут больше играет роль версия Emacs, она у Вас точно 24?
      • 0
        Да, 24-я. Я сделал все заново и работает, хотя пришлось помучиться с установкой пакетов на сам питон. Какие-то пакеты из оф. репозитория не подошли, или это совсем не то, что нужно. В общем, пошел другим путем, используя pip. Спасибо за инструкцию :)

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