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

imageДанная статья будет посвящена настройке vim, в которой я поделюсь своим «скромным» пониманием того, каким должен быть текстовый редактор, чтобы в нем было удобно/приятно/легко (нужное подчеркнуть) писать код также, как это сейчас возможно во всевозможных IDE типа PyCharm, SublimeText и т.п.Весь процесс постараюсь описать как можно более подробно, чтобы вопросов по мере чтения для начинающих осваивать vim возникало как можно меньше.Предыстория Сам я знаком с vim не очень продолжительное время, однако, к его изучению и желанию использовать привело: достаточное количество на хабре статей по vim большое количество существующих плагинов преимущественно, разработчики на Python занимаются написанием кода под Linux (хотя vim — кроссплатформенный) собственное любопытство В настоящее время я использую весьма часто vim как основной инструмент для разработки на Python и нисколько об этом не жалею. Если чего-либо нехватает, то проблема решается гуглением в течении пару минут. Поверьте, vim действительно стоит тех затраченных сил на его изучения. Это достаточно быстро себя «окупает». Было бы только желание и немножечко терпения.Подготовительный этап Итак. Перейдем непосредственно к подготовительному этапу. Нам понадобится: Vim версии 7.4 (получить нужное можно либо скачиванием из репозиториев, либо сборкой вручную) Python 2.7 (с установленным pip) Клиент для работы с 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 : TagbarToggle let g: tagbar_autofocus = 0 » автофокус на Tagbar при открытии

» NerdTree настройки » показать NERDTree на F3 map : NERDTreeToggle «игноррируемые файлы с расширениями let NERDTreeIgnore=['\~$', '\.pyc$', '\.pyo$', '\.class$', 'pip-log\.txt$', '\.o$']

» TaskList настройки map : TaskList » отобразить список тасков на F2

» Работа буфферами map : bd » 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 = '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 : ConqueTermSplit ipython », а debug-mode на  nnoremap : exe «ConqueTermSplit ipython » . expand (»%») let g: ConqueTerm_StartMessages = 0 let g: ConqueTerm_CloseOnEnd = 0 » проверка кода в соответствии с PEP8 через 8 autocmd FileType python map 8: PymodeLint

» автокомплит через  inoremap

» переключение между синтаксисами nnoremap Th: set ft=htmljinja nnoremap Tp: set ft=python nnoremap Tj: set ft=javascript nnoremap Tc: set ft=css nnoremap Td: set ft=django Отступы, табы, пробелы для разных языков Это связано с тем, что в том же 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='' 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

© Habrahabr.ru