Python и emacs, несколько удобных решений
Расскажу немного о том, как быстро превратить emacs в полноценную python IDE.
🕛 27.11.2009, 12:14
Начнем с интересного способа автозавершения кода + по ходу дела добавим еще пару интересных и полезных возможностей. Наверняка многие используют что-то типа rope (или может свои какие-то решения) и это довольно разумно, но не слишком наглядно. Расскажу об одном дополнительном способе.Теперь по нажатию TAB мы будем получать вот это:
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 (если вдруг вы его еще не установили). Последнюю версию можно забрать здесь: https://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))
Ну вот наверно и все. Разве что возможно вам захочется сменить цвет подсветки на другой, но об этом вы найдете кучу статей в интернете и на хабре. Желаю удачи!