Python

индекс
250,37

Настраиваем Vim под Python

Сегодня я хочу рассказать вам, как я настраивал любимый всеми редактор Vim (который в одном режиме пищит, а в другом — все портит) для написания кода на Python. Статья расчитана на начинающих виммеров.
У меня получилась такая картинка:


.vimrc


Для начала, нужно установить некоторые параметры в ~/.vimrc. Привожу весь файл целиком, может кому-то будет полезно.

"Вырубаем режим совместимости с VI:
set nocompatible

"Включаем распознавание типов файлов и типо-специфичные плагины:
filetype on
filetype plugin on

"Настройки табов для Python, согласно рекоммендациям
set tabstop=4
set shiftwidth=4
set smarttab
set expandtab "Ставим табы пробелами
set softtabstop=4 "4 пробела в табе
"Автоотступ
set autoindent
"Подсвечиваем все что можно подсвечивать
let python_highlight_all = 1
"Включаем 256 цветов в терминале, мы ведь работаем из иксов?
"Нужно во многих терминалах, например в gnome-terminal
set t_Co=256

"Настройка omnicomletion для Python (а так же для js, html и css)
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS

"Авто комплит по табу
function InsertTabWrapper()
let col = col('.') - 1
if !col || getline('.')[col - 1] !~ '\k'
return "\"
else
return "\<c-p>"
endif
endfunction
imap <c-r>=InsertTabWrapper()"Показываем все полезные опции автокомплита сразу
set complete=""
set complete+=.
set complete+=k
set complete+=b
set complete+=t

"Перед сохранением вырезаем пробелы на концах (только в .py файлах)
autocmd BufWritePre *.py normal m`:%s/\s\+$//e ``
"В .py файлах включаем умные отступы после ключевых слов
autocmd BufRead *.py set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class

""""Дальше мои личные настройки,
""""в принципе довольно обычные, может кому надо

"Вызываем SnippletsEmu(см. дальше в топике) по ctrl-j
"вместо tab по умолчанию (на табе автокомплит)
let g:snippetsEmu_key = "<C-j>"

" Копи/паст по Ctrl+C/Ctrl+V
vmap <C-C> "+yi
imap <C-V> "+gPi

colorscheme wombat256 "Цветовая схема
syntax on "Включить подсветку синтаксиса
set nu "Включаем нумерацию строк
set mousehide "Спрятать курсор мыши когда набираем текст
set mouse=a "Включить поддержку мыши
set termencoding=utf-8 "Кодировка терминала
set novisualbell "Не мигать
set t_vb= "Не пищать! (Опции 'не портить текст', к сожалению, нету)
"Удобное поведение backspace
set backspace=indent,eol,start whichwrap+=<,>,[,]
"Вырубаем черточки на табах
set showtabline=0
"Колоночка, чтобы показывать плюсики для скрытия блоков кода:
set foldcolumn=1

"Переносим на другую строчку, разрываем строки
set wrap
set linebreak

"Вырубаем .swp и ~ (резервные) файлы
set nobackup
set noswapfile
set encoding=utf-8 " Кодировка файлов по умолчанию
set fileencodings=utf8,cp1251 " Возможные кодировки файлов, если файл не в unicode кодировке,
" то будет использоваться cp1251


Плагины


Чтобы ощутить Power of Vim, необходимо воспользоваться плодами трудов предшественников-первопроходцев.
Для начала, если вы не сделали раньше, нужно поставить плагин Vimball - велосипедный архиватор для вимовских плагинов. Без этого велосипеда нам не поставить многих полезных плагинов. Качаем и распаковываем в ~/.vim/

Далее. Нам нужна клевая подсветка синтаксиса вместо дефолтной - для Python (и для Django - если хотите). Качаем и сливаем в ~/.vim/syntax/ (здесь и далее - если папки в вашей домашней директории нету, создавайте ее)

Автодополнение тоже лучше не дефолтное - качаем pythoncomplete.vim и заливаем в ~/.vim/autoload/. В .vimrc мы уже настроили комплит на Tab.

Если мы что то написали, мы должны это запустить?.. Качаем runscript.vim и кидаем его в~/.vim/plugin/. Он с кривыми концами строк, мы должны его поправить:
sudo apt-get install tofrodos #в бубунте
dos2unix ~/.vim/plugin/runscript.vim


Теперь открываем его в Vim и правим настройки:

"Путь к питону, исправляем виндовый
let s:PathToExecutable = '/usr/bin/python'

" Map keys to function calls
"Выполнить скрипт, который назначен "Главным"
if !hasmapto('Runscript')
nmap Executescript
endif
"Назначить скрипт в буфере Главным
if !hasmapto('SetMainscript')
nmap SetMainscript
endif
"Сбросить назначение Главного скрипта
if !hasmapto('ClearMainscript')
nmap <S-F11> ClearMainscript
endif
"Показать/скрыть окно вывода
if !hasmapto('ToggleOutputWindow')
nmap ToggleOutputWindow
endif

Можно конечно настройки скрипта и в .vimrc прописать, но скрипт все равно кривой и его ковырять пришлось.

Теперь самое вкусное - SnippletsEmu - снипплеты. Это маленькие заготовки языковых конструкций. Вводишь for, нажимаешь кнопку (у меня в .vimrc ctrl-j), получается:

Нажимаешь еще раз кнопку, курсор перескакивает к следующему полю... Так очень удобно добавлять функции, классы, циклы, что угодно.
Ставится это добро (оно, кстати, очень похоже на функционал Textmate) из двух vba архивов: с плагином и с готовыми снипплетами. Открываем архив в vim, набираем:
:source %

И все, поставилось. Повторить со вторым архивом

Можно и свои снипплеты создавать, коммандой типа:
:Snippet клевоимячко Меня зовут <{фамилия}> <{имя}>. Зови меня <{имядлядрузей}>.


И исспользовать, набрав клевоимячко и нажав назначенную комбинацию.
Но функционал SnippletEmu велик, и это тема для следующей статьи

Так, вроде все есть, только не хватает - темы! Лично я рекоммендую desert256, но если не нравится - могу посоветовать поставить плагин ScrollColor.vim и сборник лучших тем.
Затем вызываем плагин коммандой
:COLOR

И выбираем тему.
+61
3 ноября 2009, 00:22
186

комментарии (60)

+6
EvilShadow #
Спасибо за статью. Чем мне подобные статьи нравятся — практически всегда среди знакомых вещей найдешь что-то новенькое и полезное.
–5
stas_agarkov #
у меня коряво работает тупое применение всего что вы описали
+6
darvin #
Вы знакомы с Vim? Если да, то что конкретно не работает? Если нет, что вы тут делаете?
+1
Benderlidze #
а нельзя никак сделать своего рода свою сборку и выложить?
–10
sigizmund #
Зайка, это не Миранда и не Квип. Тебе сюда.
0
stas_agarkov #
конечно знаком
вечерком попробую еще раз, может вчера ночью что-то пропустил
0
chabanenko #
зачем же тупо-применять — острее нужно мыслить! :)
НЛО прилетело и опубликовало эту надпись здесь
+1
darvin #
да, есть. плагинами или вручную написать
www.vim.org/scripts/script.php?script_id=934 вот
или вот www.vim.org/scripts/script.php?script_id=2424 для мака
подробней не скажу, не пользуюсь. не представляю целей использования ftp, когда есть contol version systems разные и ssh для остального
НЛО прилетело и опубликовало эту надпись здесь
0
naryl #
Есть, но ИМХО лучше это делать через curlftpfs.
0
coldFlame #
Замечательно есть на любой виртуальной файловой системе, например, GVFS. Монтируешь себе FTP в наутилусе и работаешь.
0
coldFlame #
Хотя gedit для этих целей все-таки удобнее — он показывает прогрессбар при сохранении.
+2
StopDesign #
Давно хочу попробовать поработать в vim. Именно над рабочими проектами, чтобы сразу понять, удобно или нет. Но не могу этого сделать, т.к. «порог вхождения» довольно высок — клавиатурные сокращения непривычные, где брать всякие плагины и модули — тоже не очень понятно… Тот же эклипс или Idea я запросто освоил за несколько дней, а vim — не получается.

Что мне хотелось бы:
— готовый файл (файлы) с настройками клавиатурных сокращений, приведенных к традиционному для редакторов виду (они же там настраиваются, ведь правда?);
— нужные слова про подсветку синтаксиса, сниппеты, организацию проектов и т.д.;
— инструкции, написанные понятным для новичка языком, не больше 20 килобайт текста;
— скриншоты с тем, что я получу, выполнив все инструкции.

С чем мне хотелось бы работать:
— python, html, css, js
— svn, git, ftp

На хабре многие пользуются этим редактором, многие хвалят…
Наверняка у кого-нибудь найдутся ссылки на такую информацию (пусть на английском). Спасибо.
0
darvin #
нету такого.
по виму книжки пишут толстые
это ide которую каждый точит под себя
eclipse хорош, просто подходы совершенно разные
+2
TimTowdy #
Первое время не спешите настраивать хоткеи. Сначала разберитесь что к чему, возможно окажется что стандартные вимовские удобнее тех к которым вы привыкли.
Со сниппетами/проектами/VCS опять-таки спешить не надо, для начала важно просто освоиться. Иначе можете потратить кучу времени чтобы разобраться в каком-то плагине, и в конце концов понять что он вас не устраивает.
Инструкции — сначала vimtutor, потом пару коротких книжек, типа таких:
www.swaroopch.com/blog/a-free-book-on-vim/
vim.runpaint.org/
Всё сразу запомнить не получится, возможно имеет смысл делать для себя небольшой cheat-sheet по ключевым вещам, и периодически перечитывать его. Также полезно читать хелп, даже по уже известным командам.
Ещё, несмотря на обилие плагинов, возможно некоторые мелкие вещи придётся написать самому (что в общем-то не особо сложно, т.к. писать можно почти на любом языке).
+1
naryl #
> — готовый файл (файлы) с настройками клавиатурных сокращений, приведенных к традиционному для редакторов виду (они же там настраиваются, ведь правда?);

Этого делать крайне не рекомендуется. Более того, если хотите научиться продуктивно работать в vim, забудьте про существование нампада и стрелочек.
+1
AlanKochev #
Прелесть вима в скорости, т.е. выучив хоткеи вы можете не отрываясь от привычных клавиш «фыва олдж» и не смотря на клавиатуру сделать что-то(копирование/удаление/поиск и тд). А если добавить свои хоткеи(у меня хоткеи только на сохранение и компиляция кода) и пользоваться мышкой, то смысл теряется и зачем тогда нужно настраивать вим если есть эклипс?
+1
naryl #
Используемые мной хоткеи:
F11 — открыть/зыкрыть VimCommander, двухпанельный файловый менеджер с классическими хоткеями (F5/F6 — копировать/переместить и т.д.)

F5/F6 — предыдущий/следующий буфер. Помогает MiniBufExplorer.

F10 — закрыть текущий буфер.

C-0/C-i — предыдущий/следующий тег (для тех кто использует ctags и им подобные).

\f — рекурсивный поиск слова под курсором во всех файлах, начиная с текущего каталога. ( map <LocalLeader>f :vimgrep /.*\<<c-r>=expand("")<cr>\> ../**/*<cr> )

{} — предыдущий/следующий элемент из QuickFix, содержащий строки с ошибками компиляции после make или с вхождением искомого слова после vimgrep (см пред. пункт)

; — поиск и замена слова под курсором в текущем файле ( nmap ; :%s/\<<c-r>=expand("<cword>")<cr>\>/ )

И на закуску автоматическая вставка закрывающей фигурной скобки: imap {<CR> {<CR>}<Esc>O

Здесь всё в куче: stashbox.org/683702/.vimrc
0
SMiX #
Скажите, а какой у вас настроен шрифт?
+2
darvin #
consolas из висты )
+8
r0b1n #
я раньше из Vim reset'ом выходил…
+3
darvin #
а я в свою молодость переключался на другую виртуальную консоль )
+1
damnerd #
^z + killall vim :)

А теперь на работе и дома — только vim, и Python, и PHP, и C++. И не так уж и сложно оно мне далось, главное не бояться.
0
naryl #
Приостановленный процесс так не убьёшь. Либо killall vim; fg, либо killall -9 vim
0
damnerd #
Не придирайтесь. :)
0
dimavs #
У меня ругается на imap <c-r>=InsertTabWrapper(), говорит — No mapping found
Я в vim совсем некопенгаген, хотя и нравится :-).
0
AllySanders #
наверно вместо = должен быть пробел.
0
kewgram #
1) У меня была проблема — не мог на виндах вязать гвим и питон 3.x.
2) Когда же апдейтнут vim

p.s.: gvim на винде — не извращение
0
hellomax #
Это у вас там меню на панельке с активного приложения, типа мак? Это что за аплет такой?
0
darvin #
gnome-globalmenu
+1
MagNet #
Кто — нибудь может уже исправленный runscript.vim выложить?
0
icCE #
Очень хорошо, есть вопросик, а как быть с кросплатформенностью? те подойдут ли конфиги одного vim из под linux в win версию? или macos?
Просто часто надо бегать с машины на машину.
Еще возникает вопрос, можно как то организовать доступ по sshfs+sudo на запись файлов?
И может еще и терминал отдельно (да да, я знаю что хочу фантастиш) Но для админство и питоноводство был бы просто класс.
0
meako #
С кросспластформенностью проблем нет. Конфиги взаимозаменимы. Лучше юзать gvim.
ssh+sudo это скорее вопрос к операционной системе. В линухе и маках можно, в винде наверное тоже можно извернуться. Вполне возможно что есть плагин для вима, но все же лучше ОС.
0
MagNet #
В общем с runscript.vim ничего не получилось, если править этот файл как в статье, то vim выдаёт вот это:
«Привязки не найдены
Привязки не найдены
Привязки не найдены»,
нашёл другой способ для запуска python скриптов:
в .vimrc прописать следующее
imap <special><F5> <ESC>:w\|!python %<CR>
nmap <F5> :w\|!python %<CR>

после этого скрипты будут выполняться по F5
0
damnerd #
Он с кривыми концами строк, мы должны его поправить:
sudo apt-get install tofrodos #в бубунте
dos2unix ~/.vim/plugin/runscript.vim


А я думал через Vim проще:
:set fileformat=unix
:%s/^M//g

Кто не знает, чтобы написать ^M, надо нажать Ctrl+V Ctrl+M.
0
Paul #
Можно вместо ^M писать \r в s///.
0
darvin #
но до этого режим концов строк нужно переключить
0
damnerd #
Для этого первой строчкой и идёт
:set fileformat=unix
0
Stepler #
извините, что не в тему, но подскажите пожалуйста, а что за шрифт на картинке. мне так понравился. приятно работать. я под виндой.
+1
Paul #
Потрудитесь прочитать комментарии внимательно, их не так много.
+1
Stepler #
огромное спасибо за содержательный ответ.
0
zzerf #
Лично я кроме тутора по Vim ничего не проходил, да и тот скорее из любопытства, да и тот давненько. Но остался открытым вопрос к ви-айм-гурам — ведь все эти хитрые команды предназначены для реального повышения скорости работы — набора и/или правки текста. Но основной режим редактора — ввод команд, поэтому при быстрой работе на клавиатуре промах мимо нужной кнопки (считай вместо одной команды ввел другую) весьма чреват, ну как минимум Esc+u. Как гуры достигают баланса между вводом команд где нельзя путать кнопки и быстротой работы. Как ни крути, а получается, что скорость из-за этого не настолько сильно и повышается. И вообще хотелось бы поглядеть видео как чел работает в Vim действительно эффективно, сам на ютубе не нашел.

На самом деле давно хочется перейти на некий редактор, в котором вообще на 100% не требуется возить мышкой и при этом комфорт не теряется, но вот мотивации именно на Vim пока не хватает. На Vim'е, как я понял (под виндузами), до сих пор надо что-то допиливать, чтобы он понимал команды в русской раскладке и чтобы сохранял текст в UTF-8, но могу и ошибаться.

И еще есть такое вот (наверное вообще еретическое пожелание) — немоноширинный шрифт он может отображать/использовать? Не люблю я их и все тут -)
0
Vodkin #
www.vim.org/scripts/script.php?script_id=386 еще плагин вам в коллекцию
python_match
0
linx56 #
Вопрос к Vim'оводам. Хочется перейти, но до жути не удобно со стандартными комбинациями. Может для начала посоветуете приближенную к реалиям gui-редакторов раскладку?

Основные хотелки: перемещение стрелками, выделение с шифтом, буфер обмена — ctrl+c/ctrl+v или сtrl+ins/shift+ins, поиск по ctrl+f, сохранение по F2 или ctrl+s, желательно табы по ctrl+tab/ctrl+shift+tab, поддержка кодировок.

Пробовал mswin.vim — как-то не помогло :(
+3
naryl #
habrahabr.ru/blogs/python/74128/#comment_2138350

Попробуйте vimtutor и жёсткую дисциплину ;)
+1
naryl #
Табы есть с MiniBufExpl. habrahabr.ru/blogs/python/74128/#comment_2138350
Переключение на что угодно вешается: habrahabr.ru/blogs/python/74128/#comment_2138468
+1
naryl #
Первая ссылка должна была быть www.vim.org/scripts/script.php?script_id=159. Но лучше сначала убедиться что его нет в менеджере пакетов.
0
linx56 #
Спасибо за ссылки.

Я пробую переходить на его хоткеи… Но мне это непривычно и я не понимаю куда можно улучшать мои навыки, я же не собираюсь сдавать нормы секретаря машинистки. Просто вышеописанные хоткеи уже рефлекторно работают, а слепую печать я тоже пока не осилил.
0
darvin #
ctrl+c/ctrl+v я описал, остальное не нужно.
Какие вам кодировки понадобились?
+1
burgua #
0
mendizabal #
darvin, скажите, а как вы в убунте вынесли меню программы на верхнюю панель, как в Маке?
0
darvin #
очень просто — code.google.com/p/gnome2-globalmenu/
не поленитесь, проголосуйте за него тут brainstorm.ubuntu.com/idea/3136/
скоро буду писать статью про затачивание gnome-based линукса удобными маковскими штучками (не скинизацию, как тысяча статей написана, а именно под юзабельность)
0
mendizabal #
ну, вы просто герой :) отличное дело делаете.

спасибо за ссылки, буду вас читать.
0
darvin #
некоторые умники считают, что если нравятся несколько интерфейсных решений эппл, ты обязан покупать Мак с анальным стимулятором
0
korsakov #
Парочка уточнений:

В основном конфиге:
i
map <c-r> InsertTabWrapper() (без знака = )

И при правке runscript.vim нужно не забыть указать хоткеи:

if !hasmapto('Runscript')
nmap Executescript
endif
«Назначить скрипт в буфере Главным
if !hasmapto('SetMainscript')
nmap SetMainscript
endif
»Сбросить назначение Главного скрипта
if !hasmapto('ClearMainscript')
nmap <S-F11> ClearMainscript
endif
«Показать/скрыть окно вывода
if !hasmapto('ToggleOutputWindow')
nmap ToggleOutputWindow
endif

Ну и касательно настройки под FreeBSD:

порт с утилитой перекодировки: converters/unix2dos
расположение бинарника с питоном(для runscript.vim): /usr/local/bin/python
0
korsakov #
И да, если с опцией

set t_vb=

вим не перестает мерзко пищать, нужно поменять строку эту на

set t_vb="|40f"
0
Satyrius #
У меня не работают спипеты для django. Открывают *.py файл, пиноновские снипеты, например def работает, django — нет. Если сделать set filetype=django_model, то снипеты работают, а подсветка синтаксиса пропадает. Как можно решить эту проблему?
0
Dukobpa3 #
Что-то тут не тут. У меня функция автокомплита не по табу а по C-r плюс она не выполняется, а просто название функции вставляется.

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