Все знают, какая хорошая штука 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 и работающих только при наличии выделения:
s1,s2,s3— заголовки<h1>,<h2>,<h3>соответственноsb,si— выделение<strong>и<em>(бывшие bold и italic)sp,sd— блоки<p>и<div>sq— кавычки-«ёлочки»«…»sa— ссылка<a href="">
Все они оставляют редактор в командном режиме, кроме 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«<C-R>z»<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 \& &
inoremap \< <
inoremap \> >
inoremap \. …
inoremap \- —
inoremap \<Space>
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.