Мой .vimrc

Все знают, какая хорошая штука Vim? Лёгкий, быстрый консольный тестовый редактор — что тут ещё добавить… Идеально сочетается с «лёгкой» средой вроде Fluxbox. Жизненно необходим на серверах и вообще везде, куда доступ есть лишь по ssh. Swiss army knife. Но и обращения требует аккуратного.

А если вы с Vim'ом незнакомы, попробуйте vimtutor.

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

syntax on             " включить подсветку синтаксиса
set ts=4              " у меня табуляция 4 символа
set autoindent
set background=dark   " весьма важная штука! :)
set lbr
set showcmd
set nocompatible      " обойдёмся без стандартного vi
set backspace=indent,eol,start

Терпеть не могу «резервных копий» в рабочем каталоге. Я про файлы, имя которых заканчиваются на «~». Предпочитаю или отключать создание резервных копий совсем, или держать где-нибудь в отдельном месте.

set nobackup
" set backup
" set backupdir=$HOME/.vim/backups
" set directory=$HOME/.vim/temp

При редактировании файлов с длинными строками курсор часто «скачет» и передвигается не туда, куда хотелось бы. Сделаем, чтобы поведение курсора было похоже на обычные текстовые редакторы (вроде KWrite):

nnoremap j gj
nnoremap k gk
vnoremap j gj
vnoremap k gk
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk

Так как мы включили autoindent, то вставка текста с отступами (из буфера обмена X Window или screen) будет «глючить» — отсупы будут «съезжать». К счастью, это легко исправить — нажав Ctrl+U сразу после вставки.

inoremap <silent> <C-u> <ESC>u:set paste<CR>.:set nopaste<CR>gi

Надоело набирать chmod +x script.sh после создания нового скрипта? Пусть этим займётся Vim — все файлы, начинающиеся с !#/bin/sh или чего-то подобного автоматически будут сделаны исполняемыми:

function ModeChange()
  if getline(1) =~ "^#!"
    if getline(1) =~ "/bin/"
      silent !chmod a+x <afile>
    endif
  endif
endfunction
au BufWritePost * call ModeChange()

«Горячие клавиши»

Некоторые сочетания клавиш запоминаются прямо-таки спинным мозгом. В частности, ещё со времён DOS'а помню F2 (сохранить файл) и F10 (выйти). Кроме того, я в KDE привык, что F11 включает-выключает нумерацию строк:

imap <F11> <Esc>:set<Space>nu!<CR>a
nmap <F11> :set<Space>nu!<CR>
nmap <F2> :w<cr>
vmap <F2> <esc>:w<cr>i
imap <F2> <esc>:w<cr>i
nmap <F10> :q!<cr>
vmap <F10> <esc>:q!<cr>i
imap <F10> <esc>:q!<cr>i

Есть ещё вкладки, которыми я пользуюсь нечасто. Ctrl+T — новая вкладка, Shift+Tab — перейти к следующей вкладке, Ctrl+Tab — перейти к предыдущей вкладке:

map <S-tab> :tabprevious<cr>
nmap <S-tab> :tabprevious<cr>
imap <S-tab> <ESC>:tabprevious<cr>i
map <C-tab> :tabnext<cr>
nmap <C-tab> :tabnext<cr>
imap <C-tab> <ESC>:tabnext<cr>i
nmap <C-t> :tabnew<cr>
imap <C-t> <ESC>:tabnew<cr>

Поддержка кириллицы

Мне иногда приходится работать с файлами в разных кириллических кодировках. Зоопарк кодировок. Основная кодировка в моей системе — UTF-8, но всё же мне регулярно приходится работать с файлами в кодировках 1251, 866 и KOI8-U. Приходится переключать кодировки на лету, нажимая F8:

set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set wildmenu
set wcm=<Tab>
menu Encoding.CP1251   :e ++enc=cp1251<CR>
menu Encoding.CP866    :e ++enc=cp866<CR>
menu Encoding.KOI8-U   :e ++enc=koi8-u<CR>
menu Encoding.UTF-8    :e ++enc=utf-8<CR>
map <F8> :emenu Encoding.<TAB>

Поддержка HTML и PHP

Для PHP у меня есть несколько довольно простых сокращений. Например, набираю if_ (и пробел), а получается целая конструкция — с круглыми и фигурными скобками, причём курсор стоит там, где надо — посреди круглых скобок (как раз чтобы удобно было ввести условие).

Есть сокращения для определения класса, функции, ветвления (if и if-else), циклов (for, foreach и while):

abb func_ function <Esc>mai() {<CR><CR>}<Esc>`ai
abb if_ if( <Esc>mai ) {<CR><CR>}<Esc>`ai
abb for_ for( <Esc>mai; ; ) {<CR><CR>}<Esc>`ai
abb foreach_ foreach( <Esc>mai as $key=>$value ) {<CR><CR>}<Esc>`ai
abb while_ while( <Esc>mai ) {<CR><CR>}<Esc>`ai
abb class_ class <Esc>mai {<CR><CR>}<Esc>`ai
abb ifelse_ if( <Esc>mai ) {<CR><CR>} else {<CR><CR>}<Esc>`ai
abb <? <?php <Esc>mai ?><Esc>`ai

Теперь штука посложнее. Часто возникает необходимость какой-то (выделенный) блок текста «завернуть» в определённый HTML-тег. Для этого у меня определено несколько сочетаний клавиш, начинающихся с клавиши s и работающих только при наличии выделения:

Все они оставляют редактор в командном режиме, кроме sa (там логично было бы ввести адрес):

vnoremap s1 "zdi<h1><C-R>z</h1><ESC>
vnoremap s2 "zdi<h2><C-R>z</h2><ESC>
vnoremap s3 "zdi<h3><C-R>z</h3><ESC>
vnoremap sb "zdi<strong><C-R>z</strong><ESC>
vnoremap si "zdi<em><C-R>z</em><ESC>
vnoremap sq "zdi&laquo;<C-R>z&raquo;<ESC>
vnoremap sp 1"zdi<p><C-R>z</p><ESC>
vnoremap sd 1"zdi<div><C-R>z</div><ESC>
vnoremap sa "zdi<a href="<esc>maa"><C-R>z</a><ESC>`aa

Quanta+ при вводе тега сразу же дописывает парный ему закрывающий тег. Эту функциональность тоже неплохо бы воплотить, хотя бы для некоторых тегов:

inoremap <h1> <h1><esc>maa</h1><esc>`aa
inoremap <h2> <h2><esc>maa</h2><esc>`aa
inoremap <h3> <h3><esc>maa</h3><esc>`aa
inoremap <ul> <ul><cr><tab><li><esc>maa</li><cr><backspace></ul><esc>`aa
inoremap <ol> <ol><cr><tab><li><esc>maa</li><cr><backspace></ol><esc>`aa
inoremap <li> <li><esc>maa</li><esc>`aa
inoremap <p> <p><esc>maa</p><esc>`aa
inoremap <div <div<esc>maa></div><esc>`aa
abb <a <a<space>href="<esc>maa"></a><esc>`aa

Обратная косая черта (backslash) часто используется для экранирования символов. У меня при редактировании HTML она служит для похожих целей:

function MapHTMLKeys()
  if &filetype == "html" || &filetype == "php" || &filetype == "tpl"
    inoremap \\ \
    inoremap \& &amp;
    inoremap \< &lt;
    inoremap \> &gt;
    inoremap \. &hellip;
    inoremap \- &mdash;
    inoremap \<Space> &nbsp;
    imap <C-Space> \<Space>
    autocmd! BufLeave * call UnmapHTMLKeys()
  endif
endfunction
function UnmapHTMLKeys()
  iunmap \\
  iunmap \&
  iunmap \<
  iunmap \>
  iunmap \.
  iunmap \-
  iunmap \<Space>
  autocmd! BufLeave *
endfunction
autocmd BufEnter * call MapHTMLKeys()

Само собой, по мере необходимости добавляются новые конструкции. Такая вот хорошая штука — Vim.

© 1999–2012, Дмитрий КолесниковКарта сайта • Размещено на «Бункере»Valid XHTML & CSS