Настройка VIM

Так уж случилось, что Vim я пользую уже почти три года - он отлично подходит в виде IDE для 80% проектов, он бесподобен в роли "читалки" для разнообразных текстов, он отлично справляется с редактированием разных конфигов, а иногда я даже пишу в нем письма - короче говоря, Vim - мое все. И замечательно, что он консольный и кроссплатформенный.

Вот так мой vim выглядит (пишу небольшой эмулятор микропроцессора):


Vim умеет, кроме всего прочего, следующие вещи:
  • Проверка орфографии для русского языка (с помощью aspell)

  • Работа с ctags (навигация по классам/функциям/макросам открытых файлов с исходным кодом) через удобное окно (плагин taglist.vim - с корректной установкой документации для этого плагина пришлось повозиться - я изменил taglist.txt на taglist2.txt и проделал то же внутри файла (первая строка))

  • Работа с метками с помощью вспомогательной панели (плагин showmarks.vim)

  • Удобное автодополнение (плагин supertab.vim)

  • Работа с X-вым буфером обмена и буфером обмена gpm'а (средняя кнопка мыши)

  • Подсветка синтаксиса для огромного количества языком и конфигов (даже мой любимый erlang не забыли)

  • Метки - локальные и глобальные

  • Механизм сессий (тьфу, меня аж покоробило)

  • ...
* Перед использованием vim в slackware 12.1 перекомпилируйте его - для включения возможности работы с X-вым буфером - эта возможность достигается уже на N-ом уровне компиляции

** Немного в сторону - aspell и настроенная в нем поддержка русского языка моментально делает жизнь в KDE намного приятнее. Хоты бы в kmail или kopete

Для начала - мой vimrc:

" Кодировка скрипта - utf-8
scriptencoding utf-8

"Отключаем режим совместимости с vi
set nocompatible
" Отключаем backup'ы
set nobackup
" При поиске - игнорировать регистр
set ic
" Нумерация строк
set nu
" Не выгружать буфер при переходе на другой файл
set hidden
" Умолчательная кодировка
set termencoding=utf-8
" do incremental searching
set incsearch
" keep 50 lines of command line history
set history=50
" show the cursor position all the time
set ruler
" display incomplete commands
set showcmd
" Время обновления окна = 0 миллисекунд (делаем из vim "редактор реального времени")
set updatetime=0
" Отключение звукового сигнала (на всякий случай - системный динамик у меня всегда отключен уже в ядре)
set novisualbell

" Кое-какие автозамены
iabbrev ### ############################################################################
iabbrev --- ----------------------------------------------------------------------------

" Автовставка моих копирайтов
com AMV call amv#amv_copyright()
com VERZHAK call amv#verzhak_copyright()
com GPLv3 call amv#gplv3()
map :call amv#amv_copyright()
map :call amv#verzhak_copyright()
map :call amv#gplv3()

" Проверка орфографии
" - включить/выключить проверку
map :call amv#toggle_spell()

" Убрать из режима вставки
" (Теперь будет вставляться )
imap < F1>

" Копирование/вставка в/из буфер обмена X
" (этот буфер называется +)
map "+y
map "+p

" Автозавершение скобок
imap { {}O
imap [ []
imap ( ()

" Отключаем детей Уганды
set shortmess+=I

" statusline
set laststatus=2
" Первый вариант statusline
" set statusline=%<%f\ -\ Буффер:\ %2n[%M%R%W]\ \|\ Под\ курсором\ -\ %3b[0x%2B]\ \|\ Строка\ -\ %5l[%3p%%]\ Колонка\ -\ %2c
" Второй вариант statusline (рабочий)
set statusline=%<%f\ -\ Буффер:\ %2n[%M%R%W]\ \|\ Строка\ -\ %5l[%3p%%]\ Колонка\ -\ %2c\ \|\ %{Tlist_Get_Tagname_By_Line()}

" Исправление отступов после вставки gpm'ом (и т.п.)
inoremap u:set paste.:set nopastegi

" Найти ту-ду во всех неудаленных буферах
com TODO call amv#is_have_string_in_buffer("TODO")
map :TODO

" Открыть все файлы из текущей папки
com OpenAll call amv#open_all()

" Вывести список всех локльных/глобальных/локальных_и_глобальных отметок
" (Интересно, можно ли сделать проще?)
com LM marks qazxswedcvfrtgbnhyujmkiolp
com GM marks QAZXSWEDCVFRTGBNHYUJMKIOLP
com AM marks qazxswedcvfrtgbnhyujmkiolpQAZXSWEDCVFRTGBNHYUJMKIOLP
com LMarks LM
com GMarks GM
com AMarks AM

" Быстрое сохранение сессии
map :mks!

" Открыть окно тегов по
nnoremap :TlistToggle
" Окно тегов не открывается автоматически
let Tlist_Auto_Open=0
" Если кроме окна тегов более не открыто ни одного окна - покинуть vim
let Tlist_Exit_OnlyWindow=1
" Окно тегов располагается справа
let Tlist_Use_Right_Window=1

" Отображать панель с marks по умолчанию (plugin/showmarks.vim)
let showmarks_enable=1

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Поддержка мыши

set mouse=a
set mousemodel=popup

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Подсветка синтаксиса

" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Отступы - если автокоманды поддерживаются, то одним способом, иначе - другим

" Only do this part when compiled with support for autocommands.
if has("autocmd")

" Enable file type detection.
" Use the default filetype settings, so that mail gets 'tw' set to 72,
" 'cindent' is on in C files, etc.
" Also load indent files, to automatically do language-dependent indenting.
filetype plugin indent on

" Put these in an autocmd group, so that we can delete them easily.
augroup vimrcEx
au!

" For all text files set 'textwidth' to 78 characters.
autocmd FileType text setlocal textwidth=78

" When editing a file, always jump to the last known cursor position.
" Don't do it when the position is invalid or when inside an event handler
" (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif

augroup END

else

set autoindent " always set autoindenting on

endif " has("autocmd")

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Кое-что еще (разные другие настройки из vimrc.orig, которые я не стал удалять)

" allow backspacing over everything in insert mode
set backspace=indent,eol,start

" Don't use Ex mode, use Q for formatting
map Q gq
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


amv.vim

Кроме разнообразных чужих плагинов у меня есть один самопальный - собственно, в него я складирую все свои функции (amv.vim лежит в ~/.vim/plugin). Вот его содержимое:


" Открыть все файлы из текущей папки
" Не спускаясь при этом рекурсивно в папки (!)

function amv#open_all()
         let fl = split(system("ls"),'\n')
         for x in fl
                 exe "new ".x
         endfor
         bfirst
         only
         ls
endf

" Данная функция проверяет все существующие (неудаленные) буферы на
" нахождение в них подстроки из str
function amv#is_have_string_in_buffer(str)
         for bf in range(1,bufnr("$"))
                 let name = bufname(bf)
                 let num = 0
                 let sp = []
                 if bufloaded(bf)
                         let sp = getbufline(bf,1,"$")
                 else
                         if buflisted(bf) && filereadable(name)
                                 let sp = readfile(name)
                         endif
                 endif
                 for x in sp
                         if match(x,a:str) > -1
                                 let num = num + 1
                         endif
                 endfor
                 if num > 0
                         echo "Buffer: ".bf." (file ".name.") содержит ".a:str." ".num." раз(а)"
                 endif
         endfor
endf

" Toggle проверку орфографии

function amv#toggle_spell()
         if &spelllang == "ru"
                 set nospell spelllang=
         else
                 set spell spelllang=ru
         endif
endf

function amv#amv_copyright()
         a
         " Здесь мой копирайт для amv
.
endf

function amv#verzhak_copyright()
         a
         " Здесь мой копирайт для verzhak
.
endf

function amv#gplv3()
         a
         " Здесь лежит GPLv3
.
endf


Собственно, vim содержит в себе мощный язык программирования, способный автоматизировать не только эти - примитивные - действия. Кстати, vim поддерживает возможность написания plugin'ов для себя на других яп - c, python, ruby.

3 комментария:

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

Да VIM хорош, почти как emacs ;)

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

а у вас ус отклеился!
как правильно вставлять код в блоггер можете почитать у меня в блоге, как раз для виммеров совет.

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

It is very interesting for me to read the blog. Thank you for it. I like such topics and anything connected to them. I definitely want to read more on that blog soon.
Alex
Mobile phone blockers