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