Делюсь опытом в описанных технологиях. Блог в первую очередь выполняет роль памяток для меня самого.

EMACS для Python

4 комментария

Введение

Решил наконец написать статью о том, как настроить EMACS для удобной работы с Python'ом. Ниже список рассматриваемых вопросов:

  • Разбиение конфигурации на части
  • Пакеты
  • Ergoemacs
  • Anaconda-mode

Разбиение конфигурации на части

Долгое время мой .emacs представлял собой всего один файл. Естественно, править его было не очень удобно. С течением времени он рос и становился толще, наконец, в определённый момент поддерживать его стало совершенно невозможно. К счастью, я подсмотрел на StackOverflow, как можно разбить его на несколько маленьких частей.

Для подгрузки параметров из других файлов нужно в .emacs написать следующее:

;;; package --- Summary
;;; Commentary:
;;; Main EMACS settings file, load settings from parts.

;;; Code:

(load "~/.emacs.d/fonts.el")
(load "~/.emacs.d/packages.el")
(load "~/.emacs.d/ergoemacs.el")
(load "~/.emacs.d/personal.el");
(load "~/.emacs.d/keyboard.el")
(load "~/.emacs.d/variables.el")
(load "~/.emacs.d/flycheck.el")
(load "~/.emacs.d/rust.el")
(load "~/.emacs.d/python.el")
(load "~/.emacs.d/web.el")

;;; .emacs ends here

Здесь load - функция, выполняющая загрузку указанного файла. Сам файл находится в каталоге .emacs.d/ и называется fonts.el. Туда я положил настройки шрифтов. Затем идёт подгрузка файла, отвечающего за список пакетов. При необходимости недостающие пакеты будут установлены из MELPA, MELPA-STABLE или другого из указанных репозиториев, впрочем, об этом я уже писал ранее.

Я не буду давать рекомендаций по поводу того, на сколько частей нужно разбивать конфигурацию, как эти части называть и так далее, каждый решает сам, потому что, например, несколько дней назад я не видел необходимости выносить настройки шрифтов отдельно, а сейчас решил, что так будет лучше. Как видите, за настройки для разработки на Python'е отвечает файл .emacs.d/python.el, в него я поместил все нужные параметры EMACS'а.

Пакеты

Как я уже говорил, автоматическую установку пакетов я описывал в другой статье, ниже перечислю лишь те пакеты, которые понадобятся, а так же дам краткое описание того, для чего они нужны.

anaconda-mode

Данный пакет служит для поддержки функциональности IDE при работе с файлами Python'а, как то быстрый переход к декларациям, вывод документации и т.д.

company

Данный пакет рекомендуется как более современная замена пакету auto-complete. Ничего не имею против последнего, но лично мне использовать указанный приятнее.

company-anaconda

Автодополнение в режиме anaconda-mode, без этого подсказки работать не будут.

ergoemacs-mode

В общем-то, не скажу, что этот пакет жизненно необходим, но он даёт необходимые удобства, например, упрощает работу с командами, заменяя стандартные хоткеи EMACS'а на свои, более близкие к тем, которыми пользуются нормальные люди, например, комбинации Ctrl+C и Ctrl+V, а так же многие другие начинают работать так, как это принято в подавляющем большинстве современных программ, т.е. копируют и вставляют текст. Подробнее можно почитать на сайте проекта.

flycheck, flycheck-pos-tip

Стандарт де-факто для проверки синтаксиса. Какой именно синтаксис и чем будет проверяться - настраивается. По умолчанию для Python'а используются flake8, pylint и pycompile. Естественно, чтобы данные средства работали, они должны присутствовать в системе.

helm

Система подсказок. Допустим, нажали Вы Alt+X, начинаете вводить lis, а он сразу выдаёт отфильтрованные команды, в которых присутствует данная строка. Можно стрелками выбрать нужную строку и нажать Enter. Умеет подсказывать не только команды, но так же имена файлов, виртуальные окружения и многое другое, легко расширяется. Практически незаменимое средство.

neotree

Пакет просто выводит дерево файлов слева. Можно забиндить отображение / скрытие на горячую клавишу, работать станет в разы удобнее.

python-mode

Базовый пакет для поддержки EMACS'ом Python'а.

py-autopep8

Пакет позволяет применить autopep8 - средство для автоформатирования кода по стандартам. Можно настроить на автоформат кода при сохранении файла. Удобно, хотя в старых проектах, где код писан ногами, порождает тонны баттхёрта у тех, кто будет делать ревью вашего кода.

py-isort

Сортирует импортированные файлы. Можно передать разные настройки. Лично я предпочитаю импорт 1-1, т.е. одна строка - один модуль или класс. Рекомендую, т.к. в этом случае с помощью flycheck будет проще удалять неиспользованные модули - выделил строку, нажал Backspace, сохранил.

pyvenv, virtualenvwrapper

Позволяет EMACS'у видеть виртуальные окружения и нормально с ними работать.

pip-requirements

Небольшой пакет для удобного редактирования файла зависимостей. Если кто не в курсе - файл REQUIREMENTS создаётся в корне Python-проекта и позволяет в одну команду установить все нужные для работы зависимости:

pip install -r REQUIREMENTS -U

В чём плюс данного пакета? Он выдаёт подсказки по именам, подгружая список с PyPi - главного всемирного рассадника питонячьих пакетов.

Установка через pip (от имени root)

pip install autopep8 flake8 isort pylint -U

Ergoemacs

Данный пакет довольно активно развивается и предоставляет кучу удобств. Вся его конфигурация у меня вынесена в отдельный файл, и чтобы далеко не ходить, публикую его ниже:

;;; Package --- Summary
;;; Comment:
;;; Settings for ergoemacs-mode

;;; Code:

(require 'ergoemacs-mode)

;;; Ergoemacs
(setq ergoemacs-theme nil)
(setq ergoemacs-keyboard-layout "us")
(setq ergoemacs-ini-mode t)
(setq ergoemacs-use-menus t)
(setq ergoemacs-smart-paste nil)
(setq ergoemacs-ctl-c-or-ctl-x-delay 0.3)
(ergoemacs-mode 1)

;;; ergoemacs.el ends here

Anaconda-mode

Тут речь не только об anaconda-mode, ниже приводится весь файл настроек для Python. Надеюсь, комментарии помогут в понимании данных настроек

;;; Package --- Summary
;;; Commentary:
;;; Settings for Python

;;; Code:

;;; Импорт необходимых модулей
(require 'py-autopep8)
(require 'py-isort)
(require 'pip-requirements-mode)

;;; Псевдоним для команды pyvenv-workon, пользователи virtualenv оценят удобство
(defalias 'workon 'pyvenv-workon)

;;; Автоматически загружать модуль python-mode, писать в статус баре "Python-mode"
(autoload 'python-mode "python-mode" "Python mode." t)

;;; Применять python-mode для файлов с расширением .py
;;; Использовать интерпретатор python для python-mode
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))

(add-to-list 'auto-mode-alist '("\\REQUIREMENTS" . pip-requirements-mode))
(add-to-list 'auto-mode-alist '("\\REQUIREMENTS.txt" . pip-requirements-mode))
(add-to-list 'auto-mode-alist '("\\requirements" . pip-requirements-mode))
(add-to-list 'auto-mode-alist '("\\requirements.txt" . pip-requirements-mode))

;;; Подсвечивать строки, которые обычно используются при отладке
(defun annotate-pdb()
  (interactive)
  (highlight-lines-matching-regexp "import ipdb")
  (highlight-lines-matching-regexp "import pdb")
  (highlight-lines-matching-regexp "set_trace()")
  (highlight-phrase "TODO")
  (highlight-regexp "FIXME")
  (highlight-regexp "BUG")
  )

;;; В Python-mode автоматически включать anaconda-mode, pdb и
;;; автоматически применять autopep8 при сохранении файла
(add-hook 'python-mode-hook 'anaconda-mode)
(add-hook 'python-mode-hook 'annotate-pdb)
(add-hook 'python-mode-hook 'py-autopep8-enable-on-save)

;;; Перед сохранением так же отсортировать импортированные модули.
;;; Правило сортировки: одна строка - один модуль
(add-hook 'before-save-hook 'py-isort-before-save)
(setq py-isort-options '("-sl"))

;;; python.el ends here

Теперь следует перезапустить EMACS, чтобы он подхватил настройки, и начать работать. Ниже приводится вид моего EMACS'а, когда я пишу на Python.

Конфиг на GitHub

4 комментария :

  1. А для работы с python не смотрел на https://github.com/jorgenschaefer/elpy ? Он вроде как один из самых популярных, чем-то не понравился?

    ОтветитьУдалить
    Ответы
    1. С него я и пытался начать, но начались проблемы с Jedi. В Linux не всегда подхватывал окружение, активированное через pyvenv-workon, работает только через устаревший auto-complete, с company даже через company-jedi подружить не удалось. В винде Jedi вообще не запустился, писал что-то про невозможность запуска сервера (да, у меня на домашней пекарне основная система Windows, т.к. Steam и половина игорей не портирована ещё, а многие и не будут).

      Удалить
  2. Подход реализованный в данной инструкции ОЧЕНЬ ПОНРАВИЛСЯ =)

    Но есть пару нюансов.
    Я начинающий пользователь emacs и в целом начинающий пользователь linux и работы с ним и на нем.

    Для меня некоторые моменты были непонятны.

    1) Файл emacs выглядит так - http://piccy.info/view3/10110759/95b5af0ce5f3ebcc8ef77ef02ad628c2/
    Куда в нем вставить код для подгрузки параметров из других файлов?
    2) последующие скриншоты с настройками отдельных модулей например anaconda-mode - что это за код? в смысле в каком файле (название файла и его расширение) и в какой директории он должен лежать?

    Я думаю если эти 2 момента добавить к каждому скрину на котором есть код то манул выйдет прям воообще на 6+ по 5ти бальной шкале =)

    P.s. для понимания моего уровня (не привычке к Linux) я в гугле гуглил вопрос "где находится файл настроек emacs) потому как в каждой статье которую я нашел в интернете не было указано где же он находится для его заполнения и редактирования =))

    Очень рад что нашел данную статью. Здесь много комментариев и поэтому становиться более понятно как это все собирается в конструктор некий. Классно =)

    ОтветитьУдалить
    Ответы
    1. Здравствуйте!

      У меня конфигурация разбита на маленькие файлы, посмотрите на GitHub.

      Удалить