четверг, 6 сентября 2007 г.

Немного о VIM

Вот уже около недели я в качестве основного текстового редактора и среды разработки использую VIM. Не скажу, что я уже нашел в нем все, что мне необходимо, чтобы не ощущать никакого дискомфорта при работе, но то, что я найду ответы на все вопросы, я не сомневаюсь - просто это дело времени.

Когда я приступил к знакомству с VIM'ом, я первым делом полез в документацию с твердым намерением всю ее прочитать. Но довольно быстро я понял, что это не самый лучший способ изучить его. Если распечатать всю документацию по VIM'у, то она займет около 1000 страниц. И дело не в том, что у меня не хватит терпения всю ее прочитать - даже если я все прочитаю, то в голове у меня вряд ли останется и пара процентов от прочитанной информации.

Поэтому я решил, что на начальном этапе обучения следует обратить свое внимание на различные HOWTO. В сети подобных руководств можно найти довольно много, и, прочитав даже одно из них, вы уже вполне сможете комфортно работать в VIM (не забывайте про замечательный VIM Tutor, который поставляется вместе с VIM и переведен на русский язык). Свой конфигурационный файл вы будете формировать тоже, скорее всего, глядя на чужие конфигурационные файлы и выбирая из них интересные для вас опции.

Поэтому я решил выложить свои конфигурационные файлы сюда - вдруг кому-нибудь пригодится. Также, в процессе чтения различных HOWTO я выписывал для себя команды, которые могут оказаться полезными для меня, и в результате у меня получился свой собственный MiniHOWTO :), который я тоже выложу, но чуть позднее, когда приведу его в читабельный вид. В данной заметке я выложу свои конфигурационные файлы и приведу пару интересных, на мой взгляд, ссылок по VIM.

Хочу заметить, что все вышесказанное не означает, что я отговариваю вас читать официальное руководство. Сам я его обязательно прочту, но не сейчас, а где-нибудь через пол года или год. К тому времени я как раз получу достаточный опыт в работе с VIM'ом и накоплю список вопросов, на которые мне стоит по-внимательней обратить внимание в руководстве. Вам я советую поступить также.

Так что удачи вам и терпения. Затраченное на обучение время обязательно окупится.

~/.vim/gvim_developer_rc.vim:
set number " Включает отображение номеров строк
set autoindent " Копирует отступ от предыдущей строки
set nowrap " Отключить перенос строк
set noignorecase " Не игнорировать регистр букв при поиске
set list " Включить подсветку невидимых символов
set listchars=tab:·\ ,trail:· " Настройка подсветки невидимых символов

" Комментирование строк
map <F9> ^i//<Esc>
imap <F9> <Esc>^i//<Esc>
vmap <F9> "cdi/**/<Esc>h"cP

" Запуск winmanager-plugin
:WMToggle

~/.gvimrc:
set cursorline " Подсветка текущей строки

~/.vimrc:
set tabstop=4 " Размер табуляции
set shiftwidth=4 " Размер сдвига при нажатии на клавиши < и >
syntax on " Включаем подсветку синтаксиса
set hlsearch " Включаем подсветку выражения, которое ищется в тексте
set incsearch " При поиске перескакивать на найденный текст в процессе набора строки
set nobackup " Не создавать бэкапы
set noswapfile " Отключает создание swap файлов
"set dir=~/.vim/swp " Все swap файлы будут помещаться в эту папку
set ignorecase " Не игнорировать регистр букв при поиске
set undolevels=100 " Размер истории для отмены
set fileencodings=utf-8,cp1251,koi8-r,cp866 " Список кодировок файлов для автоопределения
set visualbell " Включает виртуальный звонок (моргает, а не бибикает при ошибках)
set nowrapscan " Останавливать поиск при достижении конца файла
set whichwrap=b,s,<,>,[,],l,h " Перемещать курсор на следующую строку при нажатии на клавиши вправо-влево и пр.
set fdm=syntax " Метод фолдинга - по синтаксису
set foldlevel=9999999 " Разворачиваем все свернутые фолдингом группировки
set statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\ enc=%{&encoding}\ %b\ 0x%B\ %l,%c%V\ %P
set laststatus=2 " Отображать статусную строку для каждого окна


" Очистить подсветку последнего найденного выражения
nmap <F2> :nohlsearch<CR>


" Более привычные Page Up/Down, когда курсор остаётся в той же строке,
" а не переносится вверх/вниз экрана, как при стандартном PgUp/PgDown.
" Поскольку по умолчанию прокрутка по C-Y/D происходит на полэкрана,
" привязка делается к двойному нажатию этих комбинаций.
nmap <PageUp> <C-U><C-U>
imap <PageUp> <C-O><C-U><C-O><C-U>
nmap <PageDown> <C-D><C-D>
imap <PageDown> <C-O><C-D><C-O><C-D>


" Проверка орфографии
if version >= 700
" По умолчанию проверка орфографии выключена.
setlocal spell spelllang=
setlocal nospell
function ChangeSpellLang()
if &spelllang =~ "en_us"
setlocal spell spelllang=ru
echo "spelllang: ru"
elseif &spelllang =~ "ru"
setlocal spell spelllang=
setlocal nospell
echo "spelllang: off"
else
setlocal spell spelllang=en_us
echo "spelllang: en"
endif
endfunc

" Горячая клавиша для переключения языка 
map <F11> <Esc>:call ChangeSpellLang()<CR>
endif


" Меню смены кодировок
set wildmenu
set wcm=<Tab>
menu Encoding.utf-8 :e ++enc=utf8 <CR>
menu Encoding.windows-1251 :e ++enc=cp1251<CR>
menu Encoding.koi8-r :e ++enc=koi8-r<CR>
menu Encoding.cp866 :e ++enc=cp866<CR>
map <F6> :emenu Encoding.<TAB>


" Смена кодировок
" http://www.opennet.ru/base/rus/vim_rus_text.txt.html

" <F7> меняет по очереди формат концов строк (dos - <CR> <NL>, unix - <NL>, mac - <CR>)
map <F7> :execute RotateFileFormat()<CR>
vmap <F7> <C-C><F7>
imap <F7> <C-O><F7>
let b:fformatindex=0
function! RotateFileFormat()
let y = -1
while y == -1
let encstring = "#unix#dos#mac#"
let x = match(encstring,"#",b:fformatindex)
let y = match(encstring,"#",x+1)
let b:fformatindex = x+1
if y == -1
let b:fformatindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":set fileformat=".str
endif
endwhile
endfunction

" <F8> переоткрывает файл в разных кодировках через :e ++enc=кодировка
map <F8> :execute RotateEnc()<CR>
vmap <F8> <C-C><F8>
imap <F8> <C-O><F8>
let b:encindex=0
function! RotateEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:encindex)
let y = match(encstring,"#",x+1)
let b:encindex = x+1
if y == -1
let b:encindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":e ++enc=".str
endif
endwhile
endfunction

" <Shift+F8> тоже что и <F8>, но предварительно меняет внутреннюю
" кодировку vim на равную кодировке файла. Это нужно когда vim умничает и
" команда :e ++enc=кодировка для него не указ. Минус этого метода в том,
" что когда внутренняя кодировка равна 8bit-cp866, то vim некоторые
" русские буквы показывает неверно, но именно показывает, поскольку если
" конвертировать, то ничего не портится (сравнить можно с результатом
" работы <F8>).
map <S-F8> :execute ForceRotateEnc()<CR>
vmap <S-F8> <C-C><S-F8>
imap <S-F8> <C-O><S-F8>
let b:encindex=0
function! ForceRotateEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:encindex)
let y = match(encstring,"#",x+1)
let b:encindex = x+1
if y == -1
let b:encindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
:execute "set encoding=".str
return ":e ++enc=".str
endif
endwhile
endfunction

" <Ctrl+F8> меняет кодировку файла, то есть после его сохранения он будет
" конвертирован
map <C-F8> :execute RotateFEnc()<CR>
vmap <C-F8> <C-C><C-F8>
imap <C-F8> <C-O><C-F8>
let b:fencindex=0
function! RotateFEnc()
let y = -1
while y == -1
let encstring = "#koi8-r#cp1251#8bit-cp866#utf-8#ucs-2le#"
let x = match(encstring,"#",b:fencindex)
let y = match(encstring,"#",x+1)
let b:fencindex = x+1
if y == -1
let b:fencindex = 0
else
let str = strpart(encstring,x+1,y-x-1)
return ":set fenc=".str
endif
endwhile
endfunction

Свою среду разработки я запускаю так:
gvim -c "source ~/.vim/gvim_developer_rc.vim"

Полезные ссылки:
Почему - VIM?
Vim - кратко обо всем
Тонкая настройка vim
Настройка проверки орфографии в vim
Vim home page

5 комментариев:

Анонимный комментирует...

Я добавил в .vimrc ещё две строки

set gfn=-monotype-andale\ mono-book-r-monospaced-*-*-140-*-*-m-*-koi8-r
colorscheme desert

Большое спасибо за статью. Сэкономил много времени.

_______________

FLUF

Unknown комментирует...

Очень рад, что статья кому-то пригодилась.

энерджи комментирует...

Благодарю за set dir=~/.vim/swp и set visualbell, кто бы знал, как меня доставал этот писк! Но всё же и он был побеждён %)

Unknown комментирует...

Спасибо, полезная статья!

Анонимный комментирует...

Спасиба за статью