VIM как IDE для разработки на Python

от автора

image
Данная статья будет посвящена настройке vim, в которой я поделюсь своим «скромным» пониманием того, каким должен быть текстовый редактор, чтобы в нем было удобно/приятно/легко (нужное подчеркнуть) писать код также, как это сейчас возможно во всевозможных IDE типа PyCharm, SublimeText и т.п.
Весь процесс постараюсь описать как можно более подробно, чтобы вопросов по мере чтения для начинающих осваивать vim возникало как можно меньше.

Предыстория

Сам я знаком с vim не очень продолжительное время, однако, к его изучению и желанию использовать привело:

  • достаточное количество на хабре статей по vim
  • большое количество существующих плагинов
  • преимущественно, разработчики на Python занимаются написанием кода под Linux (хотя vim — кроссплатформенный)
  • собственное любопытство

В настоящее время я использую весьма часто vim как основной инструмент для разработки на Python и нисколько об этом не жалею. Если чего-либо нехватает, то проблема решается гуглением в течении пару минут. Поверьте, vim действительно стоит тех затраченных сил на его изучения. Это достаточно быстро себя «окупает». Было бы только желание и немножечко терпения.

Подготовительный этап

Итак. Перейдем непосредственно к подготовительному этапу. Нам понадобится:

  1. Vim версии 7.4 (получить нужное можно либо скачиванием из репозиториев, либо сборкой вручную)
  2. Python 2.7 (с установленным pip)
  3. Клиент для работы с git

После того, как вышеперечисленное у нас имеется, можно приступать непосредственно к настройке и «кастомизации».

Настройка

Самое первой проблемой для любого новичка, который решает обуздать vim, является vimscript. Vimscript — это скриптовый язык, предназначенный для vim. На нем мы будем описывать используемые плагины, горячие клавиши и все тому подобное, чтобы обеспечить себе простую и легкую работу в vim. Для ознакомления советую посетить вот этот и этот сайты. Там достаточно неплохо все описано, что, где, как, и почему.

Первым делом стоит рассказать о том, что конфигурационный файл vim находится в домашнем каталоге пользователя (~/) и называется .vimrc. В нем-то и будет расписываться моменты относительно того, какие шрифты, цветовая схема, хоткеи и т.п. будут использоваться.

Во-вторых, при настойке текстового редактора, иногда будет необходимо заходить в каталог .vim (это скрытый каталог, и он расположен также в домашнем каталоге юзера), в который будут помещен ряд необходимых файлов, рассортированных по каталогам.
Какие включает в себя подкаталоги исходный каталог .vim? Примерно такие:
.vim
|____after
|____autoload
|____colors
|____doc
|____ftplugin
|____indent
|____plugin
|____scripts
|____syntax

Однако, из всех вышеперечисленных каталогов нам понадобится лишь несколько:

  • colors — для цветовых схем/тем
  • indent — сюда будет скидывать файлы для работы с тегами HTML/XML и т.п.
  • scripts — для скриптов
  • syntax — файлы синтаксиса

В эти каталоги помещаем соответствующие файлы, взяв их, например, у меня.

До начала установки и работа с менеджером пакетов пропишем в консоли:

pip install pyflakes pep8 pylint ipython

В дальнейшем, эти библиотеки нам пригодятся для того, чтобы отслеживать за качеством своего кода: ошибки, соответствие его PEP8 и т.п. Последняя же в этом списке библиотека/пакет — ipython нам будет удобна для настройки своего «дебаггера».
Также нам еще необходимо установить Exuberant ctags. Скачать его можно отсюда либо поискать и установить через менеджер пакетов apt-get/aptitude/rmp/pacman/и т.п.

Менеджер плагинов

Для того, чтобы нам было проще с установкой и использованием плагином будем использовать Vundle. Vundle — это пакетный менеджер для Vim, способный:

  • настраивать и устанавливать плагины, указанные в. vimrc
  • обновлять плагины при необходимости
  • удалять неиспользуемые плагины

Однако прежде чем приступать к описанию необходимого набора плагинов в конфигурационном файле, сначала необходимо установить сам Vundle. Для этого делаем следующее:

git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

После выполнение этой команды Vundle будет установлен в ~/.vim/bundle/Vundle.vim

Теперь добавим следующую часть в свой новосозданный .vimrc если его еще нет:

set nocompatible              " be iMproved, required filetype off                  " required  "===================================================== " Vundle settings "===================================================== " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin()  Plugin 'gmarik/Vundle.vim'		" let Vundle manage Vundle, required  "---------=== Code/project navigation ===------------- Plugin 'scrooloose/nerdtree' 	    	" Project and file navigation Plugin 'majutsushi/tagbar'          	" Class/module browser  "------------------=== Other ===---------------------- Plugin 'bling/vim-airline'   	    	" Lean & mean status/tabline for vim Plugin 'fisadev/FixedTaskList.vim'  	" Pending tasks list Plugin 'rosenfeld/conque-term'      	" Consoles as buffers Plugin 'tpope/vim-surround'	   	" Parentheses, brackets, quotes, XML tags, and more  "--------------=== Snippets support ===--------------- Plugin 'garbas/vim-snipmate'		" Snippets manager Plugin 'MarcWeber/vim-addon-mw-utils'	" dependencies #1 Plugin 'tomtom/tlib_vim'		" dependencies #2 Plugin 'honza/vim-snippets'		" snippets repo  "---------------=== Languages support ===------------- " --- Python --- Plugin 'klen/python-mode'	        " Python mode (docs, refactor, lints, highlighting, run and ipdb and more) Plugin 'davidhalter/jedi-vim' 		" Jedi-vim autocomplete plugin Plugin 'mitsuhiko/vim-jinja'		" Jinja support for vim Plugin 'mitsuhiko/vim-python-combined'  " Combined Python 2/3 for Vim  call vundle#end()            		" required filetype on filetype plugin on filetype plugin indent on 

Как вы видите, места где указаны Plugin 'ссылка_до_плагина' представляет собой ссылки в интернете эти плагины, которые Vundle будет скачивать и в последствии устанавливать. Для себя, я разбивал эти плагины на «категории», но это уже дело вкуса. Сами плагины:

  • NERDTree — навигация по файловой/директориям
  • TagBar — навигация по классам/функциям/переменным
  • vim-airline — строка статуса/состояния
  • FixedTaskList — поиск в файле FIXME, TODO и т.п.
  • conque-term — используем для вызова дебаггера
  • vim-surround — автозакрытие тегов HML/XML/и т.п.
  • vim-snipmate — сниппеты
  • python-mode — рефакторинг, документация, дебаггер Python и т.п.
  • jedi-vim — автодополнение для Python
  • vim-jinja — поддержка синтаксиса шаблонов Jinja

В качестве руководства/гайд по использованию Vundle можно зайти сюда. Однако для наших целей будет предостаточно одной:

:PluginInstall

Эта команда сканирует файл .vimrc на наличие списка плагинов прописанных в виде Plugin 'ссылка_до_плагина'.
Для того, чтобы запустить установку набора плагинов, заходим в vim/gvim и прописываем :PluginInstall. Придется немного подождать, поскольку каждый плагин, указанный выше в конфиге, будет скачан с githuba либо еще откуда-то и настроен до установок «по умолчанию», подождите пару минут. Каждый выкачанный и настроенный плагин отмечается как "+". Как только увидите, что все из списка подсвечены "+" — значит, все готово. И для дальнейшего использования необходимо будет перезапустить vim. Однако на этом все еще не оканчивается статья — все необходимо «подкрутить», чтобы работать в vim’е было комфортно.

Общие настройки vim’а

Эти настройки для меня являются базовыми. Тут я указываю свои предпочтения относительно парочки плагинов, размера шрифтов, цветовой схемы, отображаемых элементов и т.п.
Добавьте эти строчки в конец своего .vimrc файла:

"===================================================== " General settings "===================================================== set backspace=indent,eol,start aunmenu Help. aunmenu Window. let no_buffers_menu=1 set mousemodel=popup  set ruler set completeopt-=preview set gcr=a:blinkon0 if has("gui_running")   set cursorline endif set ttyfast  " включить подсветку кода syntax on if has("gui_running") " GUI? устаналиваем тему и размер окна   set lines=50 columns=125   colorscheme molokai " раскомментируйте эти строки, если хотите, что NERDTree/TagBar автоматически отображались при запуске vim " autocmd vimenter * TagbarToggle " autocmd vimenter * NERDTree " autocmd vimenter * if !argc() | NERDTree | endif  " на маке vim? if has("mac")   set guifont=Consolas:h13   set fuoptions=maxvert,maxhorz else " дефолтный GUI   set guifont=Ubuntu\ Mono\ derivative\ Powerline\ 10 endif else " терминал?   colorscheme myterm endif  tab sball set switchbuf=useopen  " отключаем пищалку и мигание set visualbell t_vb=  set novisualbell         set enc=utf-8	     " utf-8 по дефолту в файлах set ls=2             " всегда показываем статусбар set incsearch	     " инкреминтируемый поиск set hlsearch	     " подсветка результатов поиска set nu	             " показывать номера строк set scrolloff=5	     " 5 строк при скролле за раз  " отключаем бэкапы и своп-файлы set nobackup 	     " no backup files set nowritebackup    " only in case you don't want a backup file while editing set noswapfile 	     " no swap files  " прячем панельки "set guioptions-=m   " меню set guioptions-=T    " тулбар "set guioptions-=r   "  скроллбары  " настройка на Tab set smarttab set tabstop=8  "  при переходе за границу в 80 символов в Ruby/Python/js/C/C++ подсвечиваем на темном фоне текст augroup vimrc_autocmds     autocmd!     autocmd FileType ruby,python,javascript,c,cpp highlight Excess ctermbg=DarkGrey guibg=Black     autocmd FileType ruby,python,javascript,c,cpp match Excess /\%80v.*/     autocmd FileType ruby,python,javascript,c,cpp set nowrap augroup END  " указываем каталог с настройками SnipMate let g:snippets_dir = "~/.vim/vim-snippets/snippets"  " настройки Vim-Airline set laststatus=2 let g:airline_theme='badwolf' let g:airline_powerline_fonts = 1 let g:airline#extensions#tabline#enabled = 1 let g:airline#extensions#tabline#formatter = 'unique_tail'  " TagBar настройки map <F4> :TagbarToggle<CR> let g:tagbar_autofocus = 0 " автофокус на Tagbar при открытии  " NerdTree настройки " показать NERDTree на F3 map <F3> :NERDTreeToggle<CR> "игноррируемые файлы с расширениями let NERDTreeIgnore=['\~$', '\.pyc$', '\.pyo$', '\.class$', 'pip-log\.txt$', '\.o$']    " TaskList настройки map <F2> :TaskList<CR> 	   " отобразить список тасков на F2  " Работа буфферами map <C-q> :bd<CR> 	   " CTRL+Q - закрыть текущий буффер 
Python-mode

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

  • рефакторинг
  • автодополнение
  • работа с дебаггером
  • автофикс PEP8 ошибок
  • и многое-многое другое…

Добавьте эти строчки в конец своего .vimrc файла:

"===================================================== " Python-mode settings "===================================================== " отключаем автокомплит по коду (у нас вместо него используется jedi-vim) let g:pymode_rope = 0 let g:pymode_rope_completion = 0 let g:pymode_rope_complete_on_dot = 0  " документация let g:pymode_doc = 0 let g:pymode_doc_key = 'K' " проверка кода let g:pymode_lint = 1 let g:pymode_lint_checker = "pyflakes,pep8" let g:pymode_lint_ignore="E501,W601,C0110" " провека кода после сохранения let g:pymode_lint_write = 1  " поддержка virtualenv let g:pymode_virtualenv = 1  " установка breakpoints let g:pymode_breakpoint = 1 let g:pymode_breakpoint_key = '<leader>b'  " подстветка синтаксиса let g:pymode_syntax = 1 let g:pymode_syntax_all = 1 let g:pymode_syntax_indent_errors = g:pymode_syntax_all let g:pymode_syntax_space_errors = g:pymode_syntax_all  " отключить autofold по коду let g:pymode_folding = 0  " возможность запускать код let g:pymode_run = 0 
Jedi-vim

Очень полезный плагин, предоставляющий отличные возможности автокомплита, go to definition, и т.п.
В своем конфиге добавьте в конец этот фрагмент:

" Disable choose first function/method at autocomplete let g:jedi#popup_select_first = 0 

Этой строчкой я отрубаю в автокомплите выбор первой строки из списка выбора метода/библиотека/класса автокомплита. Это связано с тем, что достаточно часто я выбираю не первую строку из нее, а автоматический выбор раздражает.

Хоткеи

Тут сложно что-либо посоветовать. У всех различное понимание того, какие хоткеи нужны, а какие-нет. Могу лишь сказать, что для желающих, найти/написать необходимые кусочки vimscript, переопределяющих поведение стандартных горячих клавиш — очень много.
Добавьте этот фрагмент в конец конфига:

"===================================================== " User hotkeys "===================================================== " ConqueTerm " запуск интерпретатора на F5 nnoremap <F5> :ConqueTermSplit ipython<CR> " а debug-mode на <F6> nnoremap <F6> :exe "ConqueTermSplit ipython " . expand("%")<CR> let g:ConqueTerm_StartMessages = 0 let g:ConqueTerm_CloseOnEnd = 0 " проверка кода в соответствии с PEP8 через <leader>8 autocmd FileType python map <buffer> <leader>8 :PymodeLint<CR>  " автокомплит через <Ctrl+Space> inoremap <C-space> <C-x><C-o>  " переключение между синтаксисами nnoremap <leader>Th :set ft=htmljinja<CR> nnoremap <leader>Tp :set ft=python<CR> nnoremap <leader>Tj :set ft=javascript<CR> nnoremap <leader>Tc :set ft=css<CR> nnoremap <leader>Td :set ft=django<CR> 
Отступы, табы, пробелы для разных языков

Это связано с тем, что в том же Python табы не рекомендуется к использованию. Поэтому будем заменять их на пробелы. Один таб = 4 пробелам. Плюс ко всему необходимо помнить, что всегда нужно сделать переход на следующую строку + отступ, чтобы было соответствие операторам for/if/while/и т.п.
Для других языков предостаточно будет указать размер Таба, и замены их на пробелы.
Добавьте этот фрагмент в конец своего конфига:

"===================================================== " Languages support "===================================================== " --- Python --- "autocmd FileType python set completeopt-=preview " раскомментируйте, в случае, если не надо, чтобы jedi-vim показывал документацию по методу/классу autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=8 \ formatoptions+=croq softtabstop=4 smartindent \ cinwords=if,elif,else,for,while,try,except,finally,def,class,with autocmd FileType pyrex setlocal expandtab shiftwidth=4 tabstop=8 softtabstop=4 smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class,with  " --- JavaScript --- let javascript_enable_domhtmlcss=1 autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS autocmd BufNewFile,BufRead *.json setlocal ft=javascript  " --- HTML --- autocmd FileType html set omnifunc=htmlcomplete#CompleteTags  " --- template language support (SGML / XML too) --- autocmd FileType html,xhtml,xml,htmldjango,htmljinja,eruby,mako setlocal expandtab shiftwidth=2 tabstop=2 softtabstop=2 autocmd bufnewfile,bufread *.rhtml setlocal ft=eruby autocmd BufNewFile,BufRead *.mako setlocal ft=mako autocmd BufNewFile,BufRead *.tmpl setlocal ft=htmljinja autocmd BufNewFile,BufRead *.py_tmpl setlocal ft=python autocmd BufNewFile,BufRead *.html,*.htm call s:SelectHTML() let html_no_rendering=1 let g:closetag_default_xml=1 let g:sparkupNextMapping='<c-l>' autocmd FileType html,htmldjango,htmljinja,eruby,mako let b:closetag_html_style=1 autocmd FileType html,xhtml,xml,htmldjango,htmljinja,eruby,mako source ~/.vim/scripts/closetag.vim  " --- CSS --- autocmd FileType css set omnifunc=csscomplete#CompleteCSS autocmd FileType css setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4 
Подведение итогов

После прохождения столь длительного процесса настройки у нас получился достаточно гибкий инструмент для работы с Python. При этом, последующая установка, на другие ПК будет представлять только доустановки необходимых библиотек, переноса соответствущего конфига и установку плагинов.

Если кому-либо нужен больший функционал (например поддержка автокомплита для любых иных языков), то могу посоветовать лишь поискать необходимые плагины на
GitHub’е или на офицальном сайте сайте vim’a.

Полезные ссылки:

Раздел script сайта vim.org — тут
wikia по vim’у — тут
OpenVim: уроки по азам в vim — тут

Мой конфиг для vim на GitHub

ссылка на оригинал статьи http://habrahabr.ru/post/224979/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *