В продолжение статьи о рабочем окружении (С чего начать?©), по просьбам трудящихся и во благо партии пишу о текстовом редакторе Vim.
Думаю в лишнем представлении Vim не нуждается, это очень популярный редактор, которым пользуется огромное количество программистов. Посмотрим, чем он так хорош:
Реально же круто писать код в консоле, не отвлекаясь на X окна!? Пишешь код,
тут же смотришь логи сервера, тут же запускаешь тесты, дебажишь, комитишь, ну и
т.д. Что бы бысто выйти в консоль из vim можно нажать Ctr^z, вернуться
выполнив команду fg. Или можно ввести команду :sh в Vim, что бы
вернуться просто закрыть консоль командой exit. Для бОльших благ есть
tmux.
В Vim настройки хранятся в файле ~/.vimrc, а плагины в директории
~/.vim. Для начальных настроек добавьте в ваш ~/.vimrc:
"""" " Other settings " " подстройка под разные типы файлов filetype plugin indent on " Use <leader>l to toggle display of whitespace nmap <leader>l :set list!<CR> " And set some nice chars to do it with set listchars=tab:»\ ,eol:¬ " automatically change window's cwd to file's dir set autochdir " I'm prefer spaces to tabs set tabstop=4 set shiftwidth=4 set expandtab " Backspace key won't move from current line set backspace=indent,eol,start " folding set foldenable set foldmethod=indent set foldlevel=99 " disable F1 imap <F1> <nop> nmap <F1> <nop> " 256 colors syntax on if $COLORTERM == 'gnome-terminal' set t_Co=256 endif " Подсветка 80й колонки в *.py файлах autocmd FileType python setlocal colorcolumn=80 " отключаем режим совместимости с Vi set nocompatible filetype off set mousehide "Спрятать курсор мыши когда набираем текст set mouse=a "Включить поддержку мыши set termencoding=utf-8 "Кодировка терминала set novisualbell "Не мигать set t_vb= "Не пищать! (Опции 'не портить текст', к сожалению, нету) " Курсор set cuc cul highlight CursorLine cterm=none ctermbg=235 highlight CursorColumn cterm=none ctermbg=235
Здесь думаю все понятно, объясню разве что фолдинг. Он у меня включен, но по
умолчанию все развернуто. Что бы сфолдить/разфолдить я иногда пользуюсь
командой za.
vim имеет множество дополнений, раньше приходилось их скачивать и рассовывать файлы по папкам вручную, сейчас есть VundleVim/Vundle.vim (а ещё лучше junegunn/vim-plug) пакетный менеджер который делает это за вас, аля apt-get (для любителей экзотики egalpin/apt-vim).
Установка:
$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
Настройка (~/.vimrc):
"""" " Vundle - packages control " set rtp+=~/.vim/bundle/vundle/ call vundle#rc() " let Vundle manage Vundle " required! Bundle 'gmarik/vundle'
Теперь посмотрим в действии, перезагрузим конфиг открытого vim:
:source $MYVIMRC
Установим все пакеты:
:BundleInstall
Обновим пакеты:
:BundleUpdate
Через директиву Bundle добавляются пакеты, причем ищутся они автоматически
на github или vimscripts.
для перемещения, удаления файлов и директорий я использую
lpenz/VimCommander, это аналог MidnightCommander. Мне удобнее
прямо в vim нажать <F9> (открыть VimComander), выделить файлы и
нажать <F5> или <F8>, чем переключаться в другое окно и запускать
mc.
VimCommander
Конфиг:
"""" " VimCommander " Bundle 'lpenz/vimcommander' noremap <silent> <F9> :cal VimCommanderToggle()<CR>
Установка:
:BundleInstall
Левое окошко на картинке выше это scrooloose/NERDTree, в нем можно
перемещаться по каталогам, открывать файлы в текущем буфере или в виде вкладки
итд. Вкладки и файлы можно тыкать мышью. Что бы открыть файл в текущем окне,
просто кликните по нему мышью или нажмите <ENTER> или o. Для открытия в
новой вкладке нажмите t. Для отображения скрытых файлов (начинаются с
точки), нажмите Shift+i. Для доп. информации ?.
Конфиг:
"""" " NerdTree " Bundle 'scrooloose/nerdtree' "map <F2> :NERDTreeToggle<CR> " Автоматическое закрытие с последним окном autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif " Убираем в табах путь у файлу (только название файла) set tabline=%!MyTabLine() function! MyTabLine() let s = '' for i in range(tabpagenr('$')) " select the highlighting if i + 1 == tabpagenr() let s .= '%#TabLineSel#' else let s .= '%#TabLine#' endif " set the tab page number (for mouse clicks) let s .= '%' . (i + 1) . 'T' " the label is made by MyTabLabel() let s .= ' %{MyTabLabel(' . (i + 1) . ')} |' endfor " after the last tab fill with TabLineFill and reset tab page nr let s .= '%#TabLineFill#%T' """""""" " right-align the label to close the current tab page if tabpagenr('$') > 1 let s .= '%=%#TabLine#%999X X' endif "echomsg 's:' . s return s endfunction function! MyTabLabel(n) let buflist = tabpagebuflist(a:n) let winnr = tabpagewinnr(a:n) let numtabs = tabpagenr('$') " account for space padding between tabs, and the "close" button let maxlen = ( &columns - ( numtabs * 2 ) - 4 ) / numtabs let tablabel = bufname(buflist[winnr - 1]) while strlen( tablabel ) < 4 let tablabel = tablabel . " " endwhile let tablabel = fnamemodify( tablabel, ':t' ) let tablabel = strpart( tablabel, 0, maxlen ) return tablabel endfunction """" " NerdTree-Tabs " Bundle 'jistr/vim-nerdtree-tabs' map <F2> :NERDTreeTabsToggle<CR> let NERDTreeIgnore = ['\.pyc$']
jistr/vim-nerdtree-tabs нужен для зацикленного открытия/закрытия по
<F2>.
отличная штука которая подсвечивает ошибки, следит за PEP 8, позволят делать
breakpoint'ы для дебага, ну и еще многое другое.
Конфиг:
"""" " Python mode " Bundle 'klen/python-mode' " Python-mode " Activate rope " Keys: " K Show python docs " <Ctrl-Space> Rope autocomplete " <Ctrl-c>g Rope goto definition " <Ctrl-c>d Rope show documentation " <Ctrl-c>f Rope find occurrences " <Leader>b Set, unset breakpoint (g:pymode_breakpoint enabled) " [[ Jump on previous class or function (normal, visual, operator modes) " ]] Jump on next class or function (normal, visual, operator modes) " [M Jump on previous class or method (normal, visual, operator modes) " ]M Jump on next class or method (normal, visual, operator modes) let g:pymode_rope = 0 let g:pymode_lint_ignore = "E501,C0110,W0102,F0401,C0301" " Documentation let g:pymode_doc = 1 let g:pymode_doc_key = '<F1>' "Linting let g:pymode_lint = 1 let g:pymode_lint_checker = "pyflakes,pep8" " Auto check on save let g:pymode_lint_write = 1 " Support virtualenv let g:pymode_virtualenv = 1 " Enable breakpoints plugin let g:pymode_breakpoint = 1 let g:pymode_breakpoint_key = '<leader>b' " syntax highlighting 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 " Don't autofold code let g:pymode_folding = 0 " replace pdb to ipdb iab ipdb import ipdb; ipdb.set_trace()
Для создания breackpoint'а нажимаем <leader>b, остальное думаю и так
понятно по коментам.
для автодополнения я использую davidhalter/jedi-vim и Valloric/YouCompleteMe.
../../../_images/ycm.gifКонфиг:
" Jedi - autocomplete " Bundle 'davidhalter/jedi-vim' let g:jedi#show_call_signatures = 1 """" " YouCompleteMe " Bundle 'Valloric/YouCompleteMe' """" " SuperTab " Bundle 'ervandew/supertab'
Установка:
$ pip install jedi
YoCompleteMe требует минимум 7.3 версию Vim, поэтому его нужно
будет пересобрать. Это очень просто, инструкция здесь.
ervandew/SuperTab включает дополнение по <Tab>.
majutsushi/tagbar это правое окошко на рисунке:
../../../_images/tagbar.pngПо сути это навигация по классам и функциям, очень удобно переходить к классу просто по нему кликнув. На рисунке видно что он подсвечивает функцию в которой я нахожусь.
Конфиг:
"""" " TagBar " Bundle 'majutsushi/tagbar' nmap <F8> :TagbarToggle<CR>
"""" " Color " Bundle 'jonathanfilip/vim-lucius' color lucius map <F5> :call ToggleBg()<CR> set bg=dark function! ToggleBg() if &background == 'dark' set bg=light else set bg=dark endif endfunc
Тема jonathanfilip/vim-lucius. Можно по <F5> переключаться с светлой, на
темную :)
Подсветка различных типов:
"""" " Syntax file " Bundle 'me-vlad/python-syntax.vim' """" " sophacles / vim-bundle-mako " Bundle "sophacles/vim-bundle-mako" au BufNewFile,BufRead *.mako set ft=mako """" " tmux syntax " Bundle "tejr/vim-tmux" """" " Vim-Jinja2 " Bundle 'Glench/Vim-Jinja2-Syntax' au BufRead,BufNewFile *.jinja2 set filetype=jinja """" " Jinja2 " " Works with http://www.vim.org/scripts/script.php?script_id=2075 " indent/htm.vim Bundle "lepture/vim-jinja" au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm,*.jinja2 set ft=jinja au FileType jinja setl sw=2 ts=2 et nu au FileType jinja hi link htmlLink NONE autocmd Filetype jinja :normal gg=G
я не использую swp файлы для восстановления файлов, вместо этого файл
автосохраняется каждую секунду.
Конфиг:
"""" " Autosave " Bundle "vim-auto-save" let g:auto_save = 1 " enable AutoSave on Vim startup set noswapfile
aperezdc/vim-template имеет заготовки для разных типов файлов.
Например для файлов *.py, Makefile и т.д. Если я создам новый файл
my.py, то у меня сразу появится следующий текст в нем:
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2013 uralbash <root@uralbash.ru> # # Distributed under terms of the MIT license. """ """
Или Makefile:
# # Makefile # uralbash, 2013年11月23日 01:01 # all: @echo "Makefile needs your attention" # vim:ft=make #
Конфиг:
"""" " Template " Bundle 'aperezdc/vim-template' let g:email = 'root@uralbash.ru'
В непустой файл можно добавить шапку так:
:Template py
Божественно красивая статусная строка, как установить powerline шыкарно
описано здесь.
Но я рекомендую bling/vim-airline, в нем больше фич, в частности совместимость с
популярными плагинами.
Конфиг:
"""" " Powerline - status bar " " Bundle 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'} " Powerline setup " http://askubuntu.com/questions/283908/how-can-i-install-and-use-powerline-plugin " set encoding=utf-8 " Necessary to show Unicode glyphs " set rtp+=$HOME/.local/lib/python2.7/site-packages/powerline/bindings/vim/ " Always show statusline " set laststatus=2 " set t_Co=256v " set guifont=DejaVu\ Sans\ Mono\ for\ Powerline\ 9 " let g:Powerline_symbols = 'fancy' " set laststatus=2 Bundle 'bling/vim-airline' let g:airline_theme='powerlineish' let g:airline_powerline_fonts
airblade/vim-gitgutter отображает текущую ветку и показывает внесенные изменения по сравнению с предыдущим коммитом.
../../../_images/vim_git1.png ../../../_images/vim_git2.pngКонфиг:
"""" " A Vim plugin which shows a git diff in the 'gutter' (sign column). " Bundle 'airblade/vim-gitgutter'
Есть еще огромное количество плагинов, которые невозможно описать в одной
статье. Если вы настроите то что я описал, то вам не составит труда добавить
что то самостоятельно. Например мой :BundleList.
" My Bundles Bundle 'gmarik/vundle' Bundle 'bling/vim-airline' Bundle 'airblade/vim-gitgutter' Bundle 'tpope/vim-fugitive' Bundle 'scrooloose/nerdtree' Bundle 'jistr/vim-nerdtree-tabs' Bundle 'klen/python-mode' Bundle 'davidhalter/jedi-vim' Bundle 'spf13/vim-colors' Bundle 'tpope/vim-vividchalk' Bundle 'morhetz/gruvbox' Bundle 'jonathanfilip/vim-lucius' Bundle 'flazz/vim-colorschemes' Bundle 'majutsushi/tagbar' Bundle 'aperezdc/vim-template' Bundle 'me-vlad/python-syntax.vim' Bundle 'ervandew/supertab' Bundle 'lpenz/vimcommander' Bundle 'Glench/Vim-Jinja2-Syntax' Bundle 'lepture/vim-jinja' Bundle 'vim-auto-save' Bundle 'sophacles/vim-bundle-mako' Bundle 'tejr/vim-tmux' Bundle 'lyokha/vim-xkbswitch' Bundle 'vim-scripts/vim-punto-switcher'
В этом году вышли аж 2 книги на русском языке:
../../../_images/vi_book.jpg ../../../_images/vim.jpgдля практики конечно же vimtutor, для фана следующие ресурсы:
Таких заметок как эта несчетное множество и все равно они вызывают интерес, потому что в мире нет двух одинаковых конфигов Vim. Вы можете подсмотреть здесь какие-то идеи, но ваша конфигурация не будет один в один совпадать, у вас наверняка есть разногласия со мной и вы захотите сделать Vim удобным для себя. Тем самым конфиг Vim’а является отображением стиля программирования. По этой причине я не выкладываю свой конфиг в чистом виде, для типовых вещей есть IDE - это как костюм пошитый на заказ по вашим размерам и пеплос 52 размера купленный на рынке.