Публикации с меткой «emacs»

Блог python на хабрахабре

Python / [Из песочницы] Настройка emacs для разработки на python или поиск «идеального» редактора

Цель статьи рассказать о своем поиске «идеального» редактора для python кода, о том почему выбрал emacs и кратко о том как я его (emacs) настроил для работы с python.

Небольшая предистория: Разработкой на python я занимаюсь уже более двух лет и все это время пытался подобрать оптимальный редактор. Что я только не использовал за это время — mcedit, nano, gedit, netbeans, eclipse, а также некоторые другие платные варианты (демо версии). Но всегда чего то нехватало, где то автокомплита, где то подсветки, где то банально неудобно. Какой то период (около 10 месяцев) использовал Eclipse, но его прожорливость в ресурсах, зависания доводили до белого каления. Когда ошибки eclipse мне окончательно надоели, я начал поиски такого редактора который стал бы отличным помошником в работе.
Вооружившись google начал искать «идеальный» редактор.

Александр Соловьёв

Управление проектами в Емаксе

У Емакса какое-то подобие проектов из коробки появилось только в 23 версии, и то очень простое - только переменные директорий (directory variables, что-то типа file variables, только хранящиеся в отдельном файле - .dir-locals.el). По большей части потому, что über-решения нету, и разным людям нравятся разные решения. Вот я и решил вкратце рассказать о том, что нравится мне.

Пару лет назад я прочитал статью в каком-то блоге об одном из подобных решений и попробовал его использовать. Как-то это решение (это был eproject, что ли) не прижилось и я пошëл искать альтернативы. Перепробовав какое-то количество, я взял project-root, прикрутив к нему несколько понравившихся фич от других проектов. Теперь можно сказать, что мне действительно удобно - использую эту штуку уже больше года и доволен. :)

Вся идея заключается в том, что вручную указывать путь к проекту (как это сделано в большинстве - если не всех - IDE) - не очень удобно. У большинства проектов есть какой-то характерный файл (или набор файлов) в корне. К примеру, manage.py у джанговых проектов, или директория .hg у проекта, который лежит в репозитории меркуриала. В результате можно определять проект по наличию таких файлов; моя текущая конфигурация выглядит примерно таким образом:

(setq project-roots
      `(("Django project"
         :root-contains-files ("manage.py")
         :filename-regex ,(regexify-ext-list '(py html css js sh))
         :exclude-paths '("contrib"))
        ("Sphinx documentation"
         :root-contains-files ("Makefile" "conf.py")
         :filename-regex ,(regexify-ext-list '(py rst))
         :exclude-paths '("_build"))
        ("Python project with buildout"
         :root-contains-files ("../../buildout.cfg")
         :filename-regex ,(regexify-ext-list '(py)))
        ("Generic Python project"
         :root-contains-files ("setup.py")
         :filename-regex ,(regexify-ext-list '(py)))
        ("Generic Mercurial project"
         :root-contains-files (".hg"))
        ("Generic git project"
         :root-contains-files (".git"))))

Интересно посмотреть на определение проекта с билдаутом - из-за того, что обычно расположение директорий там выглядит как

proj/
    buildout.cfg
    src/
        proj/

то приходится так извращаться, чтоб лишние файлы не попадали. :) Кроме того, легко видно, что можно задать директории, которые нужно игнорировать и регулярное выражение для файлов, которые хочется найти. :)

Что это даëт? Это даëт возможность project-root'у определить, что он находится в проекте, и включает работу клëвого макроса with-project-root. В принципе он практически ничем не занимается, кроме как изменением текущей директории на корень проекта - но этого хватает, чтоб заработали предопределëнные команды, которые я повесил на кнопки вот так:

(global-set-key (kbd "C-c p f") 'project-root-find-file)
(global-set-key (kbd "C-c p g") 'project-root-grep)
(global-set-key (kbd "C-c p a") 'project-root-ack)
(global-set-key (kbd "C-c p d") 'project-root-goto-root)
(global-set-key (kbd "C-c p l") 'project-root-browse-seen-projects)

Наиболее часто используемая из них - find-file, которая показывает в минибуфере список файлов (в виде file\parentdir\parentdir - обратный путь к корню проекта), давая выбрать один из них с помощью ido-mode - т.е. вся вкуснотища типа flex matching'а работает1. :)

Отступлю от темы и вкратце расскажу, что такое ido. Это такой клëвый пакет в емаксе, который позволяет сильно облегчить работу в минибуфере своим автодополнением и удобным переходом между соседними значениями (он показывает сразу все возможные значения одновременно - и это удобно). Я его использую вместо обычного открытия файла, для перехода между буферами, и вот с той же целью он используется в project-root.

Не думаю, что нужно описывать grep или ack, которые просто запускают соответствующую программу от корня проекта - результаты запуска, как обычно, показываются в буфере со ссылками на найденные значения (так что можно легко перейти к нужному файлу/строке). goto-root тоже не делает ничего особенного, просто открывает dired в корне проекта.

А вот browse-seen-projects - очень интересная штука. Дело в том, что project-root-find-file при первом открытия проекта добавляет его в список проектов в файле ~/.emacs.d/.project-roots и сохраняет этот файл. А browse-seen-projects создаëт новый буфер в режиме org-mode и добавляет туда все проекты - в виде ссылок на их директории, конечно. ;) Так что можно довольно быстро и удобно прыгнуть к нужному проекту.

В основном функциональность этого кусочка кода я описал, еще информацию можно почерпнуть на страничке project-root'a и в его исходниках. Естественно, что до идеального состояния его можно точить и точить, так что патчи - велкам. :)


  1. надо только не забыть установить ido-enable-flex-matching в t

Expl0rer’s Weblog

Отладка Python программ в Emacs

Поиск отладчика для Python увенчался успехом.  Это не первая попытка найти удобный инструмент, но все предыдущие были неудачными:

  • Pdb, как консольная утилита,  обладает всеми необходимыми мне возможностями, но ненаглядна.  Для получения элементарной информации, такой как, текущее положение в коде, состояние переменных, перечень точек останова надо вводить консольные команды.  Это требует дополнительных трудозатрат и отвлекает от решения основной задачи – поиска ошибки. Если я запустил отладчик – значит я уже облажался и программа работает не так как я ожидал, а значит мне нужна среда, которая позволит максимально сосредоточиться на поиске ошибки, а не будет отвлекать меня по мелочам.
  • Eclipse в связке с Pydev хороший вариант для тех, кто уже работает с этой средой. Я же в очередной раз подумал, что трудзатраты на привыкание к новой среде окажутся далеко не адекватны полученному результату.
  • WinPdb, лично мне, показался неинтуитивным. К тому же, идея править код в одном окне, а отлаживать его в другом несколько напрягала.

К счастью я нашел решение в среде Emacs:

  • Создаем исполнимый файл следующего содержания:

в любой папке, указанной в PATH.

  • Открываем Emacs с кодом программы и выполняем:

M-x pdb

  • В минибуфере указываем, что мы хотим отлаживать именно *.py файл:

pdb source.py

После Emacs откроет дополнительный буфер Debugger с стандартным приглашением pdb со всеми возможностями этого отладчика:

  • c – запуск программы на выполенение;
  • n – перейти к следующей строке кода;
  • s – аналогично n, но с заходом во все функции и методы;
  • w – печать стека программы;
  • p <имя переменной> – показать значение переменной;
  • u / d – перемещение по стеку вызовов функций.

В дополнение к консольным возможностям pdb связка с Emacs предлагает следующие возможности, недоступные ранее:

  • Удобный способ расстановки точек остановки. Достаточно переключиться в буфер с исходным кодом и выполнить команду C-x SPC.
  • Emacs подсвечивает текущую строку в буфере с кодом. Очень удобно.
  • При перемещении по стеку (u / d) Emacs подсвечивает соответствующие позиции в коде.

В качестве дополнительной возможности можно повесить команды pdb на функциональные клавиши и наслаждаться отладкой.


Александр Соловьёв

Мои инструменты

Я тут немножечко протормозил с продолжением поста Лориена на тему используемых инструментов - довольно напряжённые были последние пару дней (да и последующие тоже такими будут, судя по всему :), но вот всё же собрался - и пишу. :)

Собственно основное время я провожу в Емаксе. ;) У меня в нём - текстовый редактор (да, это можно использовать как текстовый редактор!), органайзер, почтовый клиент (Gnus), джаббер-клиент и irc-клиент. :) На самом деле это всё достаточно удобно, потому что система управления окнами (так в емаксе называются те зоны, на которые вертикально или горизонтально можно делить окно) тут достаточно развитая (больше 20 лет уже занимаются ей), и в результате так выходит гораздо проще, чем держать все эти программы во внешней ОС. Кстати, благодаря монитору (как я доволен, что купил себе вайдскрин - 1680х1050) при делении экрана пополам вертикально как раз влазит по 90 с небольшим символов - очень удобно редактировать, посматривая на что-то сопуствующее (старый код, документация, чат с кем-то в джаббере).

Внешней осью служит дебиан, на который сверху прилеплен xmonad - я перешёл на мозаичный менеджер окон примерно год назад и оказалось, что это очень удобно. В результате у меня на рабочих столах последовательно висят Емакс, Файрфокс (куда ж без него?) и три терминала. Три терминала - это для разработки, в одном ./manage.py runserver, в других - по необходимости шелл, шелл джанги, коннект к базе и тому подобное.

Ну и где-то ближе к концу (рабочих столов всего 9) висит Амарок - к сожалению, в линухе ничего лучше (и хотя бы близко приближающееся к foobar2000) я не нашёл. :( Правда, в отличие Лориена, у меня всё крутится вокруг моей музыки, а не интернет-радио - и коннект не позволяет, и подбирал же я эту самую музыку не зря? :)

Надеюсь, что это было интересно прочесть не только заказчегу, а я останавливать такие посты на своём блоге не собираюсь - мне было бы очень интересно прочесть, как всё организовано у Юры. :-)

Александр Соловьёв

Мои инструменты

Я тут немножечко протормозил с продолжением поста Лориена на тему используемых инструментов - довольно напряжённые были последние пару дней (да и последующие тоже такими будут, судя по всему :), но вот всё же собрался - и пишу. :)

Собственно основное время я провожу в Емаксе. ;) У меня в нём - текстовый редактор (да, это можно использовать как текстовый редактор!), органайзер, почтовый клиент (Gnus), джаббер-клиент и irc-клиент. :) На самом деле это всё достаточно удобно, потому что система управления окнами (так в емаксе называются те зоны, на которые вертикально или горизонтально можно делить окно) тут достаточно развитая (больше 20 лет уже занимаются ей), и в результате так выходит гораздо проще, чем держать все эти программы во внешней ОС. Кстати, благодаря монитору (как я доволен, что купил себе вайдскрин - 1680х1050) при делении экрана пополам вертикально как раз влазит по 90 с небольшим символов - очень удобно редактировать, посматривая на что-то сопуствующее (старый код, документация, чат с кем-то в джаббере).

Внешней осью служит дебиан, на который сверху прилеплен xmonad - я перешёл на мозаичный менеджер окон примерно год назад и оказалось, что это очень удобно. В результате у меня на рабочих столах последовательно висят Емакс, Файрфокс (куда ж без него?) и три терминала. Три терминала - это для разработки, в одном ./manage.py runserver, в других - по необходимости шелл, шелл джанги, коннект к базе и тому подобное.

Ну и где-то ближе к концу (рабочих столов всего 9) висит Амарок - к сожалению, в линухе ничего лучше (и хотя бы близко приближающееся к foobar2000) я не нашёл. :( Правда, в отличие Лориена, у меня всё крутится вокруг моей музыки, а не интернет-радио - и коннект не позволяет, и подбирал же я эту самую музыку не зря? :)

Надеюсь, что это было интересно прочесть не только заказчегу, а я останавливать такие посты на своём блоге не собираюсь - мне было бы очень интересно прочесть, как всё организовано у Юры. :-)

Александр Соловьёв

Emacs tabbar

Какое-то время назад я писал про то, как я переключаю буферы в Emacs'е. Но в конце-концов меня задолбало отсутствие табов и я решил поставить и разобраться в таббаре (я его раньше ставил, но он раздражал своим внешним видом и странным поведением :)).

Самая неочевидная штука заключается в том, что брать его надо однозначно из CVS, потому что файлик, который лежит в виде релиза на SF, просто-напросто на 3 года старше CVS'ового.

Ну а дальше всё оказалось просто - надо его кинуть в диру к остальным *.el, и немного поднастроить под себя. Немного - у нового поведение в разбрасывании табов по группам куда более адекватное, чем у старого - он их раскидывает по основному режиму, что при редактировании в основном Питоновских файлов удобно - не приходится лазить по остальным, ненужным, буферам.

Вот настройки:

;;;;;;;;;
;; Tabbar

(require 'tabbar)

(global-set-key [C-S-tab] 'tabbar-backward-tab)
(global-set-key [C-tab] 'tabbar-forward-tab)

(set-face-foreground 'tabbar-default "LightSteelBlue")
(set-face-background 'tabbar-default "DarkSlateGray")
(set-face-foreground 'tabbar-selected "pale green")
(set-face-bold-p 'tabbar-selected t)
(set-face-attribute 'tabbar-button nil :box '(:line-width 1 :color "gray72"))

(setq tabbar-buffer-groups-function
      (lambda () 
        (list
         (cond
          ((find (aref (buffer-name (current-buffer)) 0) " *") "*")
          (t "All Buffers"))
         )))

(tabbar-mode)
;; tabbar end
;;;;;;;;;;;;;

tabbar-buffer-groups-function - раскидывает все буферы по двум группам: все, начинающиеся с пробела или астериска - в *, остальные - в All buffers. За функцию спасибо Хейзу, потому что я сам не осилил написать. ;)

Ну а тут лежит весь мой .emacs.

UPD. Функция группировки, конечно, порядочно усовершенствовалась со времени написания этого поста...

Александр Соловьёв

Emacs tabbar

Какое-то время назад я писал про то, как я переключаю буферы в Emacs'е. Но в конце-концов меня задолбало отсутствие табов и я решил поставить и разобраться в таббаре (я его раньше ставил, но он раздражал своим внешним видом и странным поведением :)).

Самая неочевидная штука заключается в том, что брать его надо однозначно из CVS, потому что файлик, который лежит в виде релиза на SF, просто-напросто на 3 года старше CVS'ового.

Ну а дальше всё оказалось просто - надо его кинуть в диру к остальным *.el, и немного поднастроить под себя. Немного - у нового поведение в разбрасывании табов по группам куда более адекватное, чем у старого - он их раскидывает по основному режиму, что при редактировании в основном Питоновских файлов удобно - не приходится лазить по остальным, ненужным, буферам.

Вот настройки:

;;;;;;;;;
;; Tabbar

(require 'tabbar)

(global-set-key [C-S-tab] 'tabbar-backward-tab)
(global-set-key [C-tab] 'tabbar-forward-tab)

(set-face-foreground 'tabbar-default "LightSteelBlue")
(set-face-background 'tabbar-default "DarkSlateGray")
(set-face-foreground 'tabbar-selected "pale green")
(set-face-bold-p 'tabbar-selected t)
(set-face-attribute 'tabbar-button nil :box '(:line-width 1 :color "gray72"))

(setq tabbar-buffer-groups-function
      (lambda () 
        (list
         (cond
          ((find (aref (buffer-name (current-buffer)) 0) " *") "*")
          (t "All Buffers"))
         )))

(tabbar-mode)
;; tabbar end
;;;;;;;;;;;;;

tabbar-buffer-groups-function - раскидывает все буферы по двум группам: все, начинающиеся с пробела или астериска - в *, остальные - в All buffers. За функцию спасибо Хейзу, потому что я сам не осилил написать. ;)

Ну а тут лежит весь мой .emacs.

UPD. Функция группировки, конечно, порядочно усовершенствовалась со времени написания этого поста...

Метки

.net .NET C# 1.2 2009 2010 404 error admin ajax amazon and apache api archlinux asp.net async asynchronous autocomplete bash blender blog blogengine blogs book bootstrap bot bpython buildout byteflow bzr C C++ cache cbv Chaco checkio chrome ci ckeditor class based views clojure closure cms cms с удобной админкой code coding style COM comet competition conference ConfigParser contest Context continuous integration CouchDB coverage CppCMS cpyext cpython csrf CSS curl custom model fields cython database db dbm dbqueries debian debug debugging decorator decorators deploy deployment descriptor design dev devconf developers development diveintopython Django django 1.2 django 1.3 django advent django framework django template django trunk django weblog django-admin-tools django-cms django-compressor django-hosts django-piston django-registration django-sphinx django.admin djangoadvent djangocms djangodash doc documentation drupal e-legion eclipse EGit emacs encoding Enthought epoll erlang event exception ExtJS fabric facebook fastcgi finaloption fixtures fonts forms formset fp framework freebsd freeswitch fs2web ftp fun funcparserlib functional gae gamin gandi generic views gettext gevent gil git github gitosis Google Google App Engine Google Translate google wave Google Web Toolkit grab greenlet gtd gui haskell hg hgshelve highlighter hosting how-to howto html html5lib Hudson humor i18n icfpc ide idiomatic image-scripting improvements Internet ipython ironpython izmenimsya.ru jabber java javascript jenkins jetbrains JIT job jquery json jstree jython kde kiev kiyv kyivpy l10n ldap library libs Life Links linux Linux & Unix LLVM logging lxml Mac OS X magic mail markdown Matplotlib Mayavi maybe mediavirus meetup memcache memory messages metaclass middleware migration mkd model models mod_wsgi mongodb monitoring mptt musicmans.ru musicx my-projects mysql netCDF networkx newforms newforms-admin news nginx Nhibernate nix nose NoSQL numpy oop open source OpenID openoffice opster optimization oracle orm os pagination parsing path pdf PDF-принтер PEP PEP8 performance perl personality php picture-driven computing PIL pinax pingback pip plasma plone plugin plugins postgresql programming psycopg2 py2exe pybb pybbm pycamp pycharm pycon pycow pycurl pydev pygtk pylons PyNGL pypy PyQt4 pyrad pyramid PySide Python Python 2.5 python 2.7 python 3 python-mssql python3 pywinauto Qt Qt4 queue rabbitmq radius raw sql re redis redsolution redsolution cms regexp regular expressions release repoze.bfg RequestContext reusable apps robokassa rss ru ruby ruby-on-rails sample satchmo scalability SciPy scraping screencast search selenium self.error seo server setattr settings setuptools shell sikuli sms snippet socket.io software sorting south sphinx sql sqlalchemy sqlite ssh startup subversion svn SyntaxHighlighter system tags tdd tddspry teh drama template templates templatetags test testing thinkpad threading threads tips tips and tricks tools tornadio tornado tornado server tricks tutorial tweepy twisted twitter typography uapycon Ubuntu ucsvlog uml Uncategorized unicode unit test UnitTest Unladen Swallow upload urllib urls utf-8 uwsgi validation vcs versioning video vim virtualenv Visual Studio voip wave web web-devel web-services web-разработка webdev webkit webpy webtest widget widgets Win API windows Wirbel work wrapper wsgi wxPython wxWidgets wysiwyg xapian xml xmonad xmpp xpath yandex youtube zip zomg zope автоматизация администрирование администрирование django админка алгоритмы архитектура базы данных Без рубрики безопасность библиотеки блоге бот видео Визуализация данных вконтакте Все записи гвидо ван россум граббер графика графы декоратор дескриптор дескрипторы документация заметки идея интересное киев Клиентам книги конференция личное математика метаклассы модели модули морфология мысли невозможное новости о облачные вычисления обо мне Обработка данных оптимизация Основная лента парсинг перевод Питон поебень поиск правила кодирования программирование Проектирование производительность работа рабочее размышлизмы Разное разработка приложений разработки регулярные выражения сайт событие события ссылки статьи тестирование тесты Тюмень фигня философия формы форум Хабрахабр хакинг шаблоны шаблоны проектирования эксперимент Эксперименты юмор Яндекс