Всё о Vim

пятница, 21 декабря 2007 г.

Vim + Python

Итак, для начала надо определиться - чего мы хотим добится от Вима в качестве среды для разработки приложений на питоне. С учетом моего пусть и не большого но всё же опыта, могу сказать, что:

  1. Удобный текстовый редактор
  2. Нормальная подсветка синтаксиса, максимально учитывающая язык
  3. Базовая настройка вима для работы с питоном (~/.vim/ftplugin/python.vim)
  4. Хорошее автодополнение, в том числе аналог "intellisense"
  5. Удобная работа с проектами
  6. Показ структуры кода
  7. Удобный запуск приложения, отслеживание ошибок
  8. Шаблоны базовых языковых конструкций
  9. Интеграция с системами контроля версий
  10. Удобное комментирование текста
Удобный текстовый редактор Тут всё понятно, перед нами наверное лучший текстовый редактор в мире :) И его возможностей должно с лихвой хватить. Нормальная подсветка синтаксиса, максимально учитывающая язык С вимом поставляется схема синтаксиса питона, но я всё же рекомендую почаще её обновлять самостоятельно python.vim : Enhanced version of the python syntax highlighting script. Зачем спросите вы? Просто отдельно эта схема синтаксиса выходит чаще релизов вима, и у вас будет всегда наиболее полная подсветка синтаксиса. Рекомендую "поиграться" с теми опциями , которые существуют в этой схеме. Я для себя выставил:
let python_highlight_all = 1
то есть подсвечиваться всё, что возможно. Базовая настройка вима для работы с питоном (~/.vim/ftplugin/python.vim) Базовые настройки выставляем в соотвествии с Style Guide for Python Code и по рекомендациям Useful VIM Settings for working with Python Помимо настроек форматирования (в основном найстройки работы с табами и пробелами) здесь можно увидеть:
  • Быстрый запуск текущего скрипта, если хотите более гибкого запуска, то можно обратить внимание на runscript.vim : Plugin for running Python scripts.
  • Подключение словаря зарезервированных слов питона (keyword.kwlist)
  • Включаем полную подсветку синтаксиса
" Insert spaces instead of character when the key is pressed. " This is also the prefered method of Python coding, since Python is especially sensitive to problems " with indenting which can occur when people load files in different editors with different tab settings, " and also cutting and pasting between applications (ie email/news for example) can result in problems. " It is safer and more portable to use spaces for indenting. set expandtab " A four-space tab indent width is the prefered coding style for Python (and everything else!), " although of course some disagree. This page generally assumes you want 4-space indents.set tabstop = 4 set tabstop = 4 "This allows you to use the < and > keys from VIM's visual (marking) mode to block indent/unindent regions set shiftwidth = 4 "Use the \"shiftwidth\" setting for inserting s instead of the \"tabstop\" setting, when at the beginning of a line. "This may be redundant for most people, but some poeple like to keep their tabstop=8 for compatability "when loading files, but setting shiftwidth=4 for nicer coding style. set smarttab " People like using real tab character instead of spaces because it makes it easier " when pressing BACKSPACE or DELETE, since if the indent is using spaces " it will take 4 keystrokes to delete the indent. Using this setting, " however, makes VIM see multiple space characters as tabstops, " and so does the right thing and will delete four spaces (assuming 4 is your setting). set softtabstop = 4 " Very painful to live without this (especially with Python)! " It means that when you press RETURN and a new line is created, the indent of the new line will match that of the previous line. set autoindent " Run python on this program when pressing F9 nmap <silent> <F9> :w<CR>:!%:p<CR> vmap <silent> <F9> <esc>:w<CR>:!%:p<CR> imap <silent> <F9> <esc>:w<CR>:!%:p<CR> " Set Python dic set dictionary=~/.vim/dic/python let python_highlight_all = 1
Наверное немногие заглядывали в общий файл ftplugin/python.vim, который идет вместе с вимом и у меня он расположен вот здесь: /usr/share/vim/vimcurrent/ftplugin/python.vim Так вот в Убунте/Дебиане там есть несколько приятных мелочей как то:
  • Установка быстрой помощи по K для слова под курсором с помощью pydoc: setlocal keywordprg=pydoc
  • Быстрый переход по классам и функциям:
    nnoremap <silent> <buffer> ]] :call <SID>Python_jump(\'/^\\(class\\\\|def\\)\')<cr> nnoremap <silent> <buffer> [[ :call <SID>Python_jump(\'?^\\(class\\\\|def\\)\')<cr> nnoremap <silent> <buffer> ]m :call <SID>Python_jump(\'/^\\s*\\(class\\\\|def\\)\')<cr> nnoremap <silent> <buffer> [m :call <SID>Python_jump(\'?^\\s*\\(class\\\\|def\\)\')<cr>
Хорошее автодополнение, в том числе аналог "intellisense" Работает "из коробки", а omni completion заметно лучше, чем для того же PHP. Кстати говоря, файл pythoncomplete я тоже рекомендую обвновлять почаще: pythoncomplete : Python Omni Completion Вообще, завершение слов и строк в виме сделано достачтоно хорошо, и он может дополнять из тегов, текущего буффера, словаря и так далее по разным сочетаниям клавиш. Дабы не заморачиваться на их все, можно всё это (ну почти всё) счастье повесить на таб, как в популярхын IDE:
" Tab autocompletion function InsertTabWrapper() let col = col('.') - 1 if !col || getline('.')[col - 1] !~ '\k' return "\<tab>" else return "\<c-p>" endif endfunction imap <tab> <c-r>=InsertTabWrapper()<cr> set complete="" set complete+=. set complete+=k set complete+=b set complete+=t set completeopt-=preview set completeopt+=longest
В данном случае мы "говорим" виму, что дополянть по табу надо только из: текущего буффера, словаря, других уже загруженых буфферов, тегов. Убираем опцию предпоказа прототипа. Как показала практика, это наиболее удобный и быстродействующий подход и потом всегда можно завершить каким пожелаете способом с помощью отдельных клавиаутурных сочетаний. Удобная работа с проектами Реализуется за счет одного из самых популярных плугинов к виму, а именно project.tar.gz: Organize/Navigate projects of files (like IDE/buffer explorer) (обзор). Показ структуры кода taglist.vim : Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) Основной его минус - это не совсем логичная группировка тегов - не по классам, а по типу: классы, переменные, функции. Автор вроде как обещает это как-то исправить в будущем:
12. Todo 1. Group tags according to the scope and display them. For example, group all the tags belonging to a C++/Java class
Для более удобной работы с этим плугином рекомендую следующие настройки: Пока струтуры только одного файла и передача фокусу фрейму плугина после его открытия
" Tag list settings let g:Tlist_Show_One_File = 1 let g:Tlist_GainFocus_On_ToggleOpen = 1
Шаблоны базовых языковых конструкций В состав snippetsEmu : An attempt to emulate TextMate's snippet expansion (обзор) входит в том числе и файл шаблонов для питона, кстати достаточно неплохой. Не забудьте переназначить его главную гор. клавишу:
let g:snippetsEmu_key = "<C-l>"
Интеграция с системами контроля версий vcscommand.vim : CVS/SVN/SVK integration plugin (обзор) Удобное комментирование текста Плугинов-комментаторов для вима сущестувует великое множество. Я остановился на The NERD Commenter : A plugin that allows for easy commenting of code for many filetypes. Он умеет комментировать/разкомментировать всё что надо и как надо. Вот пожалуй и все, а большее мне потребвалось по ходу разработки на питоне. Кстати говоря, многое из выше перечисленного уже есть в готовой IDE для питона под названием PIDA, которая по умолчанию использует вим в качестве редактора, предоставляя более удобные, чем его плугины средства характерные для IDE. Например тот же браузер кода там группирует теги логически, а не по типам. Но я остался верен виму :) P.S. Гугля на тему "vim python" набрел на интересную презентацию Python and vim: Two great tastes that go great together, Sean Reifschneider, в которой приводятся примеры скриптинга на питоне в виме (вим должен быть собран с поддержкой питона)

15 коммент.:

voldmar комментирует...

Omni-completion как-то странно работает — я с ним поигрался, но в работе использовать не стал.

Остальное почти всё использую.

marivn комментирует...

"Удобный запуск приложения, отслеживание ошибок" - так и остался не реализованным...жалко.
Но в остальном большое спасибо =)

slav0nic комментирует...

я ещё такую штуку юзаю:
http://dumpz.org/493/

чтоб не парится с этим омни) а то пока нажмёшь комбинацию...
зы: ф-ция для автодополнения после точки по табу
также стоит глянуть на конфиги к виму из официального питона (в 2.5 где-то в доках лежат) + авторы pida выкладывали свои настройки

lorien комментирует...

Ещё одна полезная штука: http://www.vim.org/scripts/script.php?script_id=1218

Комментирует строчку или выделенный блок. Знает большое количество форматов файлов, в том числе и python, конечно. Очень удобный инструмент )

Pento комментирует...

marvin, ну вообще в тексте это есть :) а поповоду отладки - я ей не часто пользуюсь, но могу порекомендовать ту же связку gdb (python-dbg) + ddd
SlavOnic,
У меня есть такая фишка с табом..забыл её запостить..просто уже была статья по поводу Vim2IDE для PHP там это тоже упоминалось. Кстати я таки рекомендую можернизировать этот таб, а именно, что бы он не все дополнял - так будет быстрее работать..чуть позже допишу в статью как. Ну и омни - всё таки удобная штука :) А насчёт Pida..да надо глянуть будет.

lorien, этим я тоже пользуюсь и забыл упомянуть это в статье. Спасибо, добавлю попозже :)

PhoeniX комментирует...

конкурент? http://trsewn.com/117.html

PhoeniX комментирует...

м, кстати. а обзоров про вим плюс руби не предвидится?

Pento комментирует...

PhoeniX, скорее другое нехорошее слово :) И ведь не коммент там не оставишь не мыло админа нет. Но спасибо за ссылку. По поводу Руби..пока что наврядли..в виду того, что я его просто не знаю :)

ze0n комментирует...

Pento, не мог бы выложить свой vimrc и цветовую схему?

Pento комментирует...

ze0n,
http://dotfiles.org/~pento/.vimrc

spec@baza ~/download % cat ~/.gvimrc | grep color
colorscheme rdark
"colorscheme slate

ze0n комментирует...

pento, спасибо.

shaman-sir комментирует...

Огромное спасибо за статью. Одно маленькое и возможно локальное дополнение: для моей версии функцию InsertTabWrapper необходимо было перегрузить (видимо она конфликтовала с каким-то из плагинов): function! InsertTabWrapper. Если вдруг кто-то из посетителей использует windows-версию редактора - не без использования вашей статьи я написал статью о перекомпиляции Vim с поддержкой Python для Windows.

Dark Proger комментирует...

а почему может не работать taglist для кода на питоне?

habamax комментирует...

Написал про проблемы вима с отступами для питона:
Indenting Python With Vim 2

На английском, потому что я его тренирую :).

temoto комментирует...

У вас все куски кода в одну строку. Используйте тег pre.

Архив блога

Copyright Creative Commons License