Пользователь
0,0
рейтинг
19 марта 2013 в 23:24

Разработка → Настройка Vim для работы с Python и Django



Vim — уникальный по своей гибкости редактор, который при должной настройке может едва ли не идеально удовлетворять все пожелания работающего с ним. Правда эта настройка может продолжаться месяцы, а то и годы, что является и достоинством, и недостатком vim’а. Существует множество статей и туториалов по использованию Vim для разработки на Python и Django, надеюсь мне удастся рассказать что-то новое. В своей статье я постараюсь по минимуму упоминать плагины общего назначения, вроде NERDTree или surround.vim и опишу несколько более специализированных расширений и настроек, которые существенно упростили процесс работы на Python.

Настроить Vim под Django оказалось делом довольно непростым, в отличие от использования с тем же Rails, для которого rails.vim решает 80% всех проблем. Но к сожалению Tim Pope ничего подобного для питона не написал, поэтому пришлось собирать все по частям. Вкратце, о чем пойдет речь:
  • python-mode
  • tagbar
  • pydiction
  • neocomplcache
Все ниженаписанное было опробовано в gVim для Linux.

Python-mode

Просто низкий поклон Кириллу Клёнову, разработчику данного расширения. Отлично устанавливается и с помощью vundle, и через pathogen и так же отлично работает.

Python-mode устанавливает свои настройки для питон-файлов. Если вас это не устраивает (мне например не нужен set number, который он добавляет), допишите необходимые настройки в .vimrc. Вот пример моих настроек:

let g:pymode_options = 0
let g:pymode_lint_write = 0 “не проверять при каждом сохранении
let g:pymode_folding = 0 “мне не нужен авто-фолдинг
let g:pymode_rope_vim_completion = 0 “не использовать автодополнение rope

Как можно увидеть, я не использую автоматический фолдинг кода, также мне не нужна проверка pylint'ом при каждом сохранении файла(let g:pymode_lint_write = 0), вместо чего можно использовать команду :PyLint, повесив на нее какой-нибудь хоткей. К автодополнению вернемся позже.

Плагин предоставляет несколько удобных хоткеев для перемещения по объектам в питон-коде:
Сочетание клавиш Команда
K Показать документацию
<C-c>g Перейти к определению
\r Запустить код
[[ Перейти к предыдущему классу или функции
]] Перейти к следующему классу или функции
aC C Выполнить действие для класса. (vaC, daC, dC, yaC, yC, caC, cC)
iC То же, находясь внутри класса. (viC, diC, yiC, ciC)
aM M Выполнить действие для функции. (vaM, daM, dM, yaM, yM, caM, cM)
iM То же, находясь внутри функции. (viM, diM, yiM, ciM)
Отдельно хотелось бы отметить возможность использовать Rope, в частности команды :RopeGoToDefinition, :RopeFindOccurrences и другие возможности по поиску кода и рефакторингу. просмотреть полный список команд Rope и сокращения к ним можно с помощью :help RopeKeys. Кроме того по умолчанию включена поддержка virtualenv, что значит, что с помощью того же :RopeGoToDefinition вы можете спокойно перейти к определнию функции любой библиотеки, установленной в site-packages вашего virtualenv’а.

Просмотр кода

Хотя самым популярным плагином для этого является Taglist, мне больше нравится Tagbar, также основанный на ctags(которые нужно установить перед использованием плагина). Вешаем :TagbarToggle на какой-нибудь хоткей, например:
nnoremap <F8> :TagbarToggle<CR>
Выглядит это примерно так:



Пара дополнительных настроек:

let g:tagbar_autofocus = 1
let g:tagbar_sort = 0 "tagbar shows tags in order of they created in file
let g:tagbar_foldlevel = 0 "close tagbar folds by default

Кроме того можно настроить, с какой стороны будет появляться окно тагбара, какими будут отступы, иконки и т.д. Обо всем этом можно узнать через :help tagbar.

Автодополнение

Один из плагинов, который я мог бы посоветовать — Pydiction, дополняющий ключевые слова на основе большого файла словаря. У данного плагина очень много плюсов:
  • автодополнение происходит по клавише Tab, не нужно запоминать всякие комбинации с Ctrl
  • абсолютно никаких конфликтов, можно одновременно использовать Pydiction с omnicomplete
  • автодополнение не затрагивает другие типы файлов
  • умеет дополнять импортированные объекты
  • довольно легко можно добавить в словарь собственные модули: python pydiction.py module_name
Минус по большому счету только один, но очень существенный на мой взгляд — Pydiction не подхватывает ключевые слова из текущего файла, а это часто бывает гораздо нужнее, чем функции Питона, которые и так знаешь.

Другой способ — использовать neocomplcache. Кроме установки плагина, нужно задать omnifunc для питоновских файлов:
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete

Neocomplcache несколько хуже справляется с дополнением из модулей, зато дополняет не только ключевые слова из текущих файлов, но и просто строки. Кроме того присутствует опция автоматически всплывающего дополнения, которое включается с помощью задания настройки:
let g:neocomplcache_enable_at_startup = 1

Шаблоны Django

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

fun! DetectTemplate()
  let n = 1
  while n < line("$")
    if getline(n) =~ '{%' || getline(n) =~ '{{'
      set ft=htmldjango
      return
    endif
    let n = n + 1
  endwhile
  set ft=html "default html
endfun

которую нужно запускать при открытии файла с раширением .html:
autocmd BufNewFile,BufRead *.html call DetectTemplate()

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

Случайные настройки


  • Питоновские отступы:
    autocmd FileType python setlocal ts=4 sts=4 sw=4
    

  • Если вы пользуетесь NERDTree, стоит добавить .pyc в список игнорируемых файлов:
    let NERDTreeIgnore=['\.pyc$']
    

  • простое сокращение для вставки дебаггера ipdb в код
    iab ipdb import ipdb; ipdb.set_trace()
    

  • сокращение для задания кодировки в начале файла:
    iab utf! # -*- coding: utf-8 -*-
    

  • убрать раздражающие всплывающие окна с документацией для omnicompletion:
    set completeopt-=preview
    

  • пара цветовых схем:darkspectrum, gruvbox, Lucius

Дополнительные ссылки

1. python-mode
github.com/klen/python-mode
2. Tagbar
github.com/majutsushi/tagbar
3. Pydiction
github.com/rkulla/pydiction
4. Neocomplcache
github.com/Shougo/neocomplcache
@rsludge
карма
36,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

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

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

  • +1
    Есть еще jedi-vim. Я его у себя использую для автокомплита параллельно python-mode.
  • +1
    Супер! Только на днях решил разобраться с этим вопросом. Очень полезный пост.
  • –1
    В свое время долго игрался с настройками вима, ставил разные сборки (в том числе от упомянутого klen'a)
    В итоге пришел вот к такому вот конфигу

    sy on
    set ts=4 sts=4 sw=4 et ai si
    
  • 0
    Уж никак не думал, что именно у Python'а, языка, на котором так много современных плагинов для Vim'а пишется, не всё так просто с поддержкой в самом Vim'е.
  • 0
    Мне всегда нравился и нравится vim. Мощный редактор, если довести настройку до ума, то можно все, что угодно на нем делать. А то меня тут на днях обломали, говорят, что nano по сравнению с vim просто монстр, а vim курит в сторонке… Даже всплакнуть захотелось…
    • +7
      > говорят, что nano по сравнению с vim просто монстр
      Зовите их сюда, наша армия вимеров быстро научит их бикать и портить файлы
    • +2
      > nano по сравнению с vim просто монстр
      (setq sarcasm-mode 1)
      (message "Это тот, в котором нужен специальный ключик, чтобы undo\redo работало?")
      (setq sarcasm-mode 0)
      

  • 0
    Другой способ — использовать neocomplcache. Кроме установки плагина, нужно задать omnifunc для питоновских файлов:
    Зачем? Эта настройка задаётся в python-mode-klen. В вашем варианте вы используете поставляующуюся с Vim.
  • –7
    Добавил в избранное, плюсануть пока не могу :( Новичок-с…
  • +3
    Полностью осознавая возможную реакцию на подобный вопрос, я все-таки спрошу:

    Ребята, а как вы работаете с редактором кода, который не понимает контекст? Мощность и удобство Vim-а правда перевешивают возможности современных IDE (например PyCharm), которые показывают в автокомплите те, и только те методы/свойства, которые там могут быть в данном контексте?
    • +2
      Я использую PyCharm с IdeaVIM. Раздражает, что IdeaVIM периодически глючит (последние версии реже), и местами работает не как vim, например cw ставит курсор не там, где vim, но привыкнуть можно.

      Допиливать emacs или vim до уровня PyCharm — практически невыполнимая задача, требующая месяцев, думаю. Мне надоело.
      • 0
        emacs знает о контексте и показывает в автокомплите то что нужно
        • +1
          Помимо автокомплита, который я вообще не считаю такой уж полезной и необходимой возможностью, в PyCharm есть миллион других фишек, которые впилить в Emacs/Vim будет нелегко. Впрочем, с выхода первой версии PyCharm я перестал пользоваться vim/emacs (точнее, еще пользуюсь иногда vim) и следить за их развитием. Но во времена выпуска первой версии PyCharm попытка настроить подобное окружение в Emacs казалась мне почти невыполнимой задачей. Что-то удавалось соорудить, но все работало коряво, ненадежно и очень медленно.

          Кроме того, автокомплит в PyCharm работает и в шаблонах (в том числе, он знает о тегах и фильтрах проекта), и в Javascript. Вообще, лучшей поддержки Javascript, чем в Idea/PyCharm я не встречал, хотя перепробовал многое.
    • +2
      С чего вы решили, что в VIM нет автодополнения в контексте? Все есть и работает не хуже PyCharm.
      • 0
        У вас есть опыт работы с PyCharm? Повторюсь — мне сложно судить про Vim, т.к. нет достаточного опыта работы с ним, но есть, например, PyDev, в котором тоже вроде как автокомплит и вроде как контекст. Но работает оно в 10 раз хуже. Vim в этом плане правда настолько круче Eclipse + PyDev?
        • +1
          Я с PyDev не работал, но по памяти впечатления от Eclipse неприятные. PyCharm уважаю, хоть в нём и присутствует такое же Java послевкусие как и в Eclipse. Я бы ушел на PyCharm, если бы эта большая, платная IDE дала мне хоть что-то, чего я не могу получить в VIM. Отладка, рефакториг, дополнение по контексту, инспекция и автопроверка кода и тд, все есть в VIM. Если что-то мне еще понадобится я напишу расширение для него на python, tcl, ruby, vimlang или вообще на shell, а попробуйте написать расширение для PyCharm. И что немаловажно на любом удаленном сервере я в 2 команды смогу поднять VIM со своей конфигурацией и получить такую же ID прямо в терминале. С Vim у тебя вся система на кончиках пальцев, с PyCharm ты привязан к паутине менюшек.

          Но PyCharm не будет конкурировать с Vim, скорее с вещами наподобие Sublime, куда уже мигрируют косяки апологетов PyCharm уставшие от хищного оскала Java выглядывающего из ее окошек. Vim же останется пререгативой джедаев, особой консольной магией :)
          • 0
            С любым удаленным сервером я работаю из PyCharm просто как с удаленным сервером. :) Я джва года мечтал о такой фиче, и вот где-то в версии 2.5 ее внедрили, а в текущей версии полностью довели до ума — теперь после настройки проекта PyCharm знает об используемой на удаленном сервере версии Python, доступных библиотеках (virtualenv замечательно поддерживается), может выполнять код удаленно, доустанавливать библиотеки в удаленное окружение и т.п.

            Проблем у него, конечно, тоже хватает (и с юзабилити — слишком уж в нем много всего, чтобы можно было это организовать без явных косяков в некоторых местах, и глюки случаются неприятные), но при всем этом он экономит очень много времени и нервов таким не-джедаям, как я. Полностью соглашусь с вами, что Vim-у он не конкурент. :)
          • 0
            Отладка, рефакториг, дополнение по контексту, инспекция и автопроверка кода и тд, все есть в VIM.

            Напишите, пожалуйста, какими плагинами пользуетесь, что у Вас в vimrc?
          • 0
            Уже ли VIM может поменять имя класса во всех файлах проекта? (а, стоп, в VIM же нет проектов). Или поменять имя параметра в методе. Или импорты оптимизировать. Может там ещё и одним хоткеем коммит+пуш?)
            • 0
              Я чувствую сарказм в вашем комментарии. Но самое смешное всё что вы перечислили в VIM есть :)
              • 0
                Никакого сарказма, действительно было интересно. Есть вообще что-нибудь, чего нет в VIM? (понимаю, что можно написать любой плагин, но тот же pycharm из коробки имеет очень крутые штуки типа conditional breakpoint или watches)
                • 0
                  Если говорить про breakpoints то лично я в VIM ставлю/убираю хоткеем ipdb прерывание и прекрасно выпадаю в консоль на брекпоинте где могу исследовать стек фрейм и любые объекты в нём. Даже и не знаю, как это можно улучшить, вроде бы есть плагины и в этом направлении, но мне хватает за глаза того, что я описал.
    • 0
      Guido van Rossum:
      > I tried PyCharm today… In the end, I'll probably use it for the occasional extreme debugging session but my main development tool will remain Emacs plus pdb. The combination of the «old» python-mode (the one by Tim & Barry & company) with Ken Manheimer's pdbtrack still works pretty well.
      https://profiles.google.com/115212051037621986145/buzz/CGh9MoWU53V

      Matz, если не ошибаюсь, тоже на emacs пишет.

      Примерно как-то так так… работают же люди…

      Лично мне Vim нравится, особенно расширение Клёнова. Но уже просто привык к Emacs, который, в принципе, всем устраивает. Особенно, если учитывать, что 99,9% работы делается через консоль на удаленных серверах.
      • 0
        Когда я вижу подобные выводы, каждый раз у меня складывается впечатление, что люди смотрели PyCharm только очень поверхностно, и не успели понять, что происходит. :) Ну, или же («выступает мальчик с феееноменальною памятью!») для них не проблема помнить в подробностях все функции и методы своего кода и используемых в проекте библиотек.

        Я не настолько крут, и мне гораздо комфортнее работать, когда IDE понимает код почти так же хорошо, как я. К сожалению, не могу объективно сравнивать PyCharm с Vim-ом (т.к. не имею достаточного опыта работы со вторым), но могу с полной уверенностью сказать, что другие «большие» IDE (NetBeans, Aptana, Eclipse) на его фоне смотрятся очень и очень бледно.
        • 0
          Люди просто 20 лет работают в Emacs и менять основной инструмент просто нет смысла, какими бы киллер фичами он не обладал (даже Emacs-like комбинациями клавиш). Просто не получится оставаться таким же продуктивным и получать тоже удовольствие от редактирования. Мне очень понравилась фраза Линуса по этому поводу, которую я встретил в комменте к первому коммиту uemacs: My fingers cannot be retrained.

          Я тоже практически всю разработку веду в Emacs (C/C++, python, Haskell, etc.), и пересаживаюсь с трудом. Только с java (и, отчасти, со Scala) это достаточно сложно, и IntelliJ IDEA выручает.
        • 0
          Удивительно было услышать о Guido van Rossum как о поверхностном человеке. Полагаю, вы знаете, кто это такой.

          Скорее наоборот. Люди подходят поверхностно к изучению «ropevim» и «ropemacs».

          Кстати, в Emacs используется python.el от fgallina с ревизии 108614. А у него автокомплит из ipython. Таким образом, последние версии Emacs подсказки для автокомплита получают от самого интерпритатора. Мне сложно вообразить более «контекстные» подсказки.

          Лично у меня любой проприетарный редактор на внутреннем уровне вызывает отторжение. Я не могу чувствовать себя программистом, если у меня нет возможности программировать даже свой редактор. Это как с подрезанными крыльями, что-ли… сложно описать.

          У нас вообще, не консольные редакторы ласково именуются «мягкотелыми». Консольные редакторы используются преимущественно по причине разработки на серверах, ввиду специфики проекта и определенных сложностей локальной инсталляции.
          • 0
            Не передергивайте — поверхностно ознакомиться с IDE, которая кардинально отличается от привычных инструментов, это не то же самое, что быть поверхностным человеком, OK?
            • 0
              Скажем так. Если последнее утверждение верно, то такой занятый человек как Гвидо, нашел в своем графике время для написания поста о том как он «поверхностно» изучил PyCharm. Что-то не сходится. Это равносильно тому, что он поверхностный человек, ибо как еще можно назвать человека, который на весь мир трезвонит о своем поверхностном мнении?

              Тут уместен иной вопрос, а с чего вы взяли, что они изучил PyCharm поверхностно? Только потому что его мнение не совпадает с Вашим? Или Вам беспокоит то, как вы будете выглядеть со своим мнением на фоне авторитета Гвидо?

              Лично я благодарен ему за то что он не продал свое личное мнение, и говорит о вещах с позиции своего искреннего мнения. А ведь мог ради денег и торгонуть своими принципами.
              • –1
                Видите ли, у разных людей — разные потребности. Кому-то комфортно помнить 100500 комбинаций клавиш и программировать свой редактор. А кто-то предпочитает заплатить $100 за инструмент, который позволяет просто писать код (точнее, заниматься только приятной частью этого процесса, поручая всю рутину IDE).

                Очевидно, Гвидо относится к первым никогда не будет использовать Windows и PyCharm. А я — ко вторым, и никогда не познаю радость программирования своего редактора.

                Проблемы?
                • 0
                  > помнить 100500 комбинаций клавиш

                  — Вот Вы снова даете оценочное суждение, совершенно не владея вопросом. Откуда такая цифра? Эта тедненция может завести Вас в нехорошую ситуацию, не раз приходилось такое наблюдать. Старайтесь придерживаться истины.

                  Не даром гласит народная мудрость «Сказанное сто рублей стоит, несказанному и цены нет».

                  Справедливости ради, можете попробовать подсчитать количество перемешений и кликов мышки, а так же перемещений руки от клавиатуры к мышке, при использовании графических ИДЕ. А то как-то однобоко получается. Но ведь вопрос не в этом.

                  Гвидо относится к творческим личностям, которые не терпят ограничений, потому что ограничения не вписываются в их образ мыслей. Именно потому он стал тем, кем стал, — создателем языка хорошего программирования (предлагаю не начинать дебатов относительно языков программирования).

                  Если человек следует «путем творца», — он не приемлет над собой контроля. Исходя из этого он и выбирает себе инструменты. Это внутреннее мироощущение, а не финансовый рассчет.

                  Вы посмотрите на свои слова со стороны. Ребята обсуждают настройки Vim. Появляетесь Вы, и говорите, что не понимаете Vim, и начинаете рекламировать PyCharm (бескорыстно ли?). При этом Вы открыто признаете, что соверешенно не осведомлены о возможностях консольных редакторов. Но это незнание не мешает делать Вам негативных выводов (тогда на основании чего?). Но ведь тема-то не о PyCharm, а о том, как настроить Vim.
                  • –1
                    Я больше никогда не буду вступать в дискуссии с фанатами Vim.
  • +1
    А вот я считаю дополнение по Tab в редакторе злом. Tab — табуляция, а не дополнение, Ctrl-N/P для дополнения, как мне кажется, больше подходит.
    • +1
      Я так понимаю, вы не работаете в линуксовой/юниксовой командной строке?
      • 0
        Работаю, постоянно, потому так и говорю. Командная строка и редактор — две разные вещи. В командной строке табулировать что-то приходится редко, в редакторе — наоборот. Потому в командной строке Tab для дополнения вполне подходит, а в редакторе — нет.
        • 0
          В таком случае, дело привычки, КМК. Если вы начинаете набирать название функции/метода/ключевое слово, табуляция в середине нужна довольно редко ;) А автодополнение для многих (линуксоидов) в этом случае выглядит привычно и органично.
          • 0
            Как редактор может знать, что это середина слова? А если это новый идентификатор, после которого я хочу отступ? Да мало ли, зачем. Переназначение клавиш по ходу ввода текста — зло, а выключение табуляции насовсем тоже не подходит. Автодополнение органично в командной строке; оно у меня, кстати, настроено по Tab в командной строке вима тоже. В редакторе — ни в коем случае.
            • 0
              > Как редактор может знать, что это середина слова? А если это новый идентификатор, после которого я хочу отступ?

              Из примера вначале статьи — return Group.o — оригинальные у вас идентификаторы.

              Хотя в целом ваша точка зрения мне понятна, конечно. Я просто пытаюсь вам объяснить, что табулятор в качестве автодополнения — хорошая для многих идея.

              Кстати, а ESC разве не убирает автодополнение и не возвращает ТАВ-у его первоначальное значение? Просто интерессно, поскольку упомянутые расширения раньше не использовал, а попробовать время будет только вечером.
  • +1
    Мне кажется, что стандартный вимовский completion вполне достаточен.Плагины кроме tagbar практически повторяют стандартный функционал вима «из коробки».Они не нужны.

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