- PVSM.RU - https://www.pvsm.ru -

Vim — уникальный по своей гибкости редактор, который при должной настройке может едва ли не идеально удовлетворять все пожелания работающего с ним. Правда эта настройка может продолжаться месяцы, а то и годы, что является и достоинством, и недостатком vim’а. Существует множество статей и туториалов по использованию Vim для разработки на Python и Django, надеюсь мне удастся рассказать что-то новое. В своей статье я постараюсь по минимуму упоминать плагины общего назначения, вроде NERDTree или surround.vim и опишу несколько более специализированных расширений и настроек, которые существенно упростили процесс работы на Python.
Настроить Vim под Django оказалось делом довольно непростым, в отличие от использования с тем же Rails, для которого rails.vim [1] решает 80% всех проблем. Но к сожалению Tim Pope ничего подобного для питона не написал, поэтому пришлось собирать все по частям. Вкратце, о чем пойдет речь:
Все ниженаписанное было опробовано в gVim для Linux.
Просто низкий поклон Кириллу Клёнову, разработчику данного расширения. Отлично устанавливается и с помощью 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, дополняющий ключевые слова на основе большого файла словаря. У данного плагина очень много плюсов:
Минус по большому счету только один, но очень существенный на мой взгляд — Pydiction не подхватывает ключевые слова из текущего файла, а это часто бывает гораздо нужнее, чем функции Питона, которые и так знаешь.
Другой способ — использовать neocomplcache. Кроме установки плагина, нужно задать omnifunc для питоновских файлов:
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
Neocomplcache несколько хуже справляется с дополнением из модулей, зато дополняет не только ключевые слова из текущих файлов, но и просто строки. Кроме того присутствует опция автоматически всплывающего дополнения, которое включается с помощью задания настройки:
let g:neocomplcache_enable_at_startup = 1
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
let NERDTreeIgnore=['.pyc$']
iab ipdb import ipdb; ipdb.set_trace()
iab utf! # -*- coding: utf-8 -*-
set completeopt-=preview
1. python-mode
github.com/klen/python-mode [5]
2. Tagbar
github.com/majutsushi/tagbar [6]
3. Pydiction
github.com/rkulla/pydiction [7]
4. Neocomplcache
github.com/Shougo/neocomplcache [8]
Автор: rsludge
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vim/29853
Ссылки в тексте:
[1] rails.vim: https://github.com/tpope/vim-rails
[2] darkspectrum: http://www.vim.org/scripts/script.php?script_id=2215
[3] gruvbox: https://github.com/morhetz/gruvbox
[4] Lucius: https://github.com/jonathanfilip/vim-lucius/
[5] github.com/klen/python-mode: https://github.com/klen/python-mode
[6] github.com/majutsushi/tagbar: https://github.com/majutsushi/tagbar
[7] github.com/rkulla/pydiction: https://github.com/rkulla/pydiction
[8] github.com/Shougo/neocomplcache: https://github.com/Shougo/neocomplcache
[9] Источник: http://habrahabr.ru/post/173473/
Нажмите здесь для печати.