.vimrc, который всегда со мной

VIM*
Моему .vimrc уже больше восьми лет. Он помнит времена PentiumII, Debian Potato и gcc настолько древнего, что я уже и не помню его версии. Он развивался с пятой версии Vim, приобретал полезные фрагменты и избавлялся от ненужных. И вот внезапно захотелось поделиться с вами его содержимым. Весь файл я показывать пока не буду, лишь пройдусь по некоторым, на мой взгляд, интересным моментам.

Сохранность и доступность

Последнее время я храню его в svn на одном из своих хостов. На нужной мне машине я просто достаю его из репозитория и работаю:
$ cd ~
$ svn ls svn+ssh://svn.example.com/var/svn/repo/trunk/profile ./
.vimrc
vimrc
$ svn co svn+ssh://svn.example.com/var/svn/repo/trunk/profile ./

Раз и навсегда добавляем удобных настроек

Настроим кол-во символов пробелов, которые будут заменять \t
set tabstop=4
set shiftwidth=4
set smarttab

set et — включим автозамену по умолчанию

set wrap — попросим Vim переносить длинные строки

set ai — включим автоотступы для новых строк
set cin — включим отступы в стиле Си

Далее настроим поиск и подсветку результатов поиска и совпадения скобок
set showmatch
set hlsearch
set incsearch
set ignorecase


set lz — ленивая перерисовка экрана при выполнении скриптов

Показываем табы в начале строки точками
set listchars=tab:··
set list


Порядок применения кодировок и формата файлов

set ffs=unix,dos,mac
set fencs=utf-8,cp1251,koi8-r,ucs-2,cp866


Взаимодействие и элементы интерфейса

Я часто выделяю мышкой содержимое экрана в Putty, но перехват мышки в Vim мне иногда мешает. Отключаем функционал вне графического режима:
if !has('gui_running')
set mouse=
endif


Избавляемся от меню и тулбара:
set guioptions-=T
set guioptions-=m

В разных графических системах используем разные шрифты:
if has('gui')
colorscheme darkblue
if has('win32')
set guifont=Lucida_Console:h12:cRUSSIAN::
else
set guifont=Terminus\ 14
endif
endif


Пытаемся занять максимально большое пространство на экране. Как водится, по-разному на разных системах:
if has('gui')
if has('win32')
au GUIEnter * call libcallnr('maximize', 'Maximize', 1)
elseif has('gui_gtk2')
au GUIEnter * :set lines=99999 columns=99999
endif
endif


Опять же, системы сборки для разных платформ могут быть переопределены:
if has('win32')
set makeprg=nmake
compiler msvc
else
set makeprg=make
compiler gcc
endif


:wq
+59
27 июля 2009, 22:58
90
oletorr 28,1

комментарии (69)

+1
LeNsTR #
Спасибо, для ленивых :)
+2
n3m0 #
Вам почетное уважение, за то, что на протяжении такого срока пользуетесь этим редактором! Я бы так не смог, возможно из-за того, что не привык!
+5
illotum #
как раз дольше пользуясь начнешь и привыкать )
судя с моего опыта — пары-тройки недель терпения достаточно, потом уже в кайф
+1
flaresun #
Я сперва тоже не особо хотел им пользоваться, но при правке скриптов удалённо приходилось пользовать именно vim, дальше и локально стал его иногда использовать, подстроил под себя. Всё-таки это очень хороший редактор, просто надо его настроить под себя и научиться им пользоваться. «Порог вхождения» в него не самый низкий, но оно того стОит…
+1
SMiX #
Спасибо, узнал много нового, снова левелап :)

set listchars=tab:··
set list
Что-то не хочет работать…
+1
Paul #
А если set encoding=utf8 в самом начале и .vimrc в нём же сохранить?
0
SMiX #
хм, никак. Оно должно работать в консоли? В том же .vimrc в блоках if…
+1
Paul #
По идее да. А если не в .vimrc писать, а после запуска эти опции выставить — тоже не работает?
0
SMiX #
Не работает, только в том же .vimrc в конце некоторых строк пишет. Видимо, он действительно обрабатывает только реальные \t, как написали ниже.
+1
Paul #
Ну да, только табуляции подсвечиваются. Если табуляция развернулась в пробелы — это уже не табуляция, а пробелы Вим к сожалению подкрашивать не умеет, только неразрывные.
+3
Remm #
Интересный конфиг, совсем недавно дополнял свой, и как раз искал, что-то подобное.
Если можно, возможно-ли увидеть Ваш полный конфиг?
0
91koff #
Как раз в новом проекте начал активно использовать VIM. Спасибо за статью — как нельзя кстати!
0
oletorr #
set listchars=tab:··
работает в файлах с настоящими символами \t, например, откройте Makefile от любого вашего проекта.
для мейкфайлов не забывайте set noet или вводите в мейкфайлах реальные табы как Ctrl-V-TAB.
:retab в открытом буфере причешет табы к текущим настройкам.
НЛО прилетело и опубликовало эту надпись здесь
0
nerezus #
А как писать мейкфайлы, если таб ставит 4 пробела?
nmake с этим ладит, а вот make…
0
oletorr #
для табов внутри мейкфайлов можно следовать рекомендации :h et
«To insert a real tab when 'expandtab' is on, use CTRL-V»

но я для Мейкфайлов ввожу :set noet
+4
res #
au FileType crontab,fstab,make set noet ts=8 sw=8
+1
vovanishe #
Могу сходу добавить полезную строчку:

set paste #При копипасте корректно проставляются все отступы
+1
oletorr #
да, это удобная опция. но я ее не сохранил в самом конфиге по причине того, что она портит автоотступы. ввожу ее по мере необходимости.
+3
vovanishe #
на этот случай можно вписать так:
set pastetoggle=
0
oletorr #
не знал. спасибо.
–18
Vasily_Pupkin #
Блин. Ну за столько лет ведь можно было понять, что использование vim — бестолковое занятие, и зайузать емакс ^__^
+2
Flcn #
ок. неиспользуй.
–1
John_Minority #
Блин. Ну за столько лет ведь можно было понять, что использование емакс — бестолковое занятие, и зайузать NotePad ^__^
+2
oletorr #
я вижу многих заинтересовала проблема табов в мейкфайлах. вспомнил, что в нашем проекте мы используем
# vim: set tabstop=4 shiftwidth=4 noexpandtab:
комментарии в конце файлов с тегами(modeline), которые вим умеет парсить при открытии:
:h modeline или :h vim:

это потрясающая штука, хранить некоторые настройки для вима в самих исходных кодах проекта.
+1
d0z #
Так и не смог привыкнуть к VIM, но не могу не отдать дань уважения, поскольку весьма мощный и гибкий редактор. В руках умелых превращается в удобный и незаменимый инструмент. Автору спасибо за вариант «для ленивых»)
+1
Karsonito #
спасибо, я как раз искал курсы джедаев
+1
Paul #
set ignorecase
Я ещё добавляю set smartcase — Vim ищет игнорируя регистр если искомое выражение не содержит большие буквы, в противном случае учитывает регистр.
0
buru #
Отличный .vimrc :) Я ещё всегда использую такие настройки:
set number — показывает номера строк; для программирования очень полезно.
syntax on — активирует syntax highlighting для огромного числа языков программирования, это число можно ещё увеличить с помощью плагинов.
0
kevit #
на самом деле номера строк не особенно нужны. vim позволяет в нормальном режиме перейти к нужной строке
можно сразу при открытии файла параметром к vim передать номер строки, на которую перевести курсор
0
oletorr #
кстати да. не все знают, что запуск в коммандлайне vim file.txt +123 сразу после открытия переместит курсор в нужную строчку
0
buru #
Оно-то да, но когда номера в явном виде показываются, как-то нагляднее. Например, если файл большой, сразу видно какой приблизительно сегмент редактируешь.
Хотя, возможно, у меня это просто дань привычке со времен Eclipse/Visual Studio.
0
Paul #
А кстати, почему вы не используете set encoding=utf8? Из-за корявой работы русской langmap в этом случае, или по какой-то другой причине?
+1
Scorpil #
А может все же выложите весь файл? Он у вас прокомментирован надеюсь? :)
0
oletorr #
он мутант, да и по своему опыту знаю, что лучше создать с нуля, на основе вот таких вот кусочков, чем взять сразу чей-то. для любителей затюненого сразу вима я бы посоветовал обратить внимание на cream for vim.
+1
Mishail #
Я, возможно, не прав, но у Вас ошибка в опции fencs — кодировка ucs-2 указана после восьмибитных кодировок, а согласно докам:

vimdoc.sourceforge.net/htmldoc/options.html#%27fencs%27
An entry for an 8-bit encoding (e.g., «latin1») should be the last, because Vim cannot detect an error, thus the encoding is always accepted.

И чуть ниже даны примеры ошибочных значений.

А максимизировать окно в win32 по-моему проще через стандартную команду:
au GUIEnter * simalt ~x

0
Paul #
А максимизировать окно в win32 по-моему проще через стандартную команду:
Не сработает в винде с русским интерфейсом.
0
Mishail #
Не сработает в винде с русским интерфейсом.

А вот этого не знал, спасибо.
+1
Paul #
Эта штука эмулирует нажатие <Alt+Space>, а потом клавиши x, которая является шорткатом для Maximize. Но это работает только в англоязычном интерфейсе. Можно наверное попробовать туда вместо x правильную русскую букву подложить, но мне негде проверить. Да и в конфиге прийдется определять язык системы каким-то образом.
0
Paul #
Правда я в винде максимизирую с помощью set lines=999 columns=999, не знаю зачем автор извернулся с вызовом функции из дллки.
0
oletorr #
что-то меня там не устроило под винду, поэтому пришлось делать так. раньше тоже был simalt ~x
0
oletorr #
хм, с ucs-2 действительно ошибка. но мне не мешает абсолютно. пока будет так. спасибо.
0
Boiler #
Народ, скажите как правильно в виме вставлять фрагмент кода из буфера. При включенном set ai при вставке текста он лесенкой сдвигается вправо. Каждый раз делать set noai напрягает, а в некоторых случаях еще и не помогает.
Может есть какой-то известный способ?
0
monsterzz #
:set pastetoggle=<F2>
и перед вставкой нажать F2.
0
ukko #
habrahabr.ru/blogs/vim/65518/#comment_1833859

или в конфиге пропишите
set pastetoggle=Теперь когда нужно что-то вставить из буфера, жмёте Ф10, вставили, нажали ещё раз и вернули в прежний режим.
+1
Allen #
Перед вставкой часто забываешь нажать pastetoggle, поэтому есть другое решение. Можно нажимать после вставки (если табы разъехались) кнопку, на которую забита следующая последовательность:

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

В данном случае это Ctrl-u
0
torkve #
set pastetoggle=
0
torkve #
Упс, меня не только опередили, но еще и хабраразметка моё <F5> зажевала.
В общем-то я хотел предложить то же, что и monsterzz чуть выше.
0
dmitryttt #
Спасибо большое за статью
+3
ivlad #
Давайте, я тоже пару моментов добавлю:

set backspace=2 — что бы нажатие клавиши Backspace и через конец строки и отступы.
set wrapmargin=5 — отступ от правой границы окна, где надо начинать перенос. Удобнее textwidth, если размеры окна изменяются.
set tildeop "~" в vim используется для изменения регистра текущего символа. Строго говоря, эта операция нарушает идеологию vi о том, что для каждой операции можно добавлять movement. Эта опция включает такую возможность, теперь, например, "~W" изменит регистр до конца слова.
set scrolloff=3 — сколько строк вверху и внизу экрана показывать при скроллинге. Очень удобно.

Еще я себе ставлю set laststatus=2 но автор, насколько я понимаю, стремится, наоборот, сохранить рабочее поле экрана. YMMV.

Вообще, первая команда, которую надо поставить в vim — set nocompatible и отключить (нужную только олдовым хакерам BSD 4.4-Lite) совместимость с vi Билла Джоя. Он сразу станет удобней работать.
0
oletorr #
спасибо большое за scrolloff.
set nocompatible конечно же есть. last status и статусная строка имеют вид
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [ASCII=\%03.3b]\ [HEX=\%02.2B]\ [POS=%04l,%04v][%p%%]\ [LEN=%L]
set laststatus=2 " always show the status line
0
Paul #
nocompatible устанавливается автоматически, если есть .vimrc или .gvimrc.
Для опции backspace я бы указал set backspace=indent,eol,start, так правильнее, нагляднее и понятнее, поддержка set backspace=2 оставлена из соображений совместимости.
0
Aineko #
а фолдингом не пользуемся?
:set foldenable
*жмет :wq вместо кнопки «написать»*
0
ganqqwerty #
вот бы такую штуку, чтобы он предлагал фолдинги — как kate и другие редакторы.
В смысле, есть вот у меня пара скобочек { и } — а вимчик отображает на левых полях какую-нить кнопоку типа «свернуть в фолд». Такое не знаете как сделать?
+1
Mishail #
Можно замапить команду
zfa}
и вызвать ее внутри блока. Оно создаст фолд между {} и закроет его

vim.wikia.com/wiki/Folding#Manual_folding
+1
Paul #
set foldmethod=syntax
set foldcolumn=3

Слева появится колонка шириной в 3 символа, обозначающая где какие фолдинги и какого уровня. По ней можно будет кликать для сворачивания-разворачивания. Но кликать мышкой в Vim — это как-то не очень правильно с идеологической точки зрения, быстрее делать всё с клавиатуры.
0
Mishail #
set foldmethod=manual
и использование
zf%
с установленным matchit для меня более подходяще. а вот за наводку на foldcolumn спасибо
0
ganqqwerty #
класс, спасибо! Гы-гы, открываешь новый файл — а там все в закрытых складках… поищу опцию, чтобы были открытые
0
Paul #
foldlevel
0 — все фолды закрыты. 1 — открыт один уровень, все остальные закрыты. И т.д.
+1
ganqqwerty #
да, у меня похожий vimrc. Там еще строчек сто настроек всяких плагинов, скриптиков, которые выполняют ctags и прочего. Однажды покорпел над созданием компактного файла системных тегов и добавил set tags+=~/.vim/systags
Спасибо за
set listchars=tab:··
set list

Еще у меня такая штука есть:
set statusline=%t\ %y%m%r[%{&fileencoding}]%<[%{strftime(\"%d.%m.%y\",getftime(expand(\"%:p\")))}]%k%=%-14.(%l,%c%V%)\ %P — делает очень информативную статус-строку
Очень доставляет также
set wildmenu — менюшки в консольке
Использование иксового клипборда:
set clipboard+=unnamed

0
Xitsa #
Мимо меня когда-то прошла конфигурация, в которой цветом строки статуса показывался текущий язык.
Как это можно сделать?
0
Paul #
Я знаю только как цветом курсора показать текущий язык ввода, если для ввода на другом языке используется keymap. Для этого нужно задать разный цвет для highlight групп Cursor и lCursor.

А так, чтобы строку статуса менять — не видел. Если найдёте — расскажи́те.
0
Mishail #
Спасибо за
set listchars=tab:··
set list

Я использую такие значения:
set listchars=tab:»\ ,trail:·,eol:¶

Тогда получается совсем как в популярных IDE
0
ganqqwerty #
Парсер — нехороший человек. А можете как-нибудь читаемей написать?
+1
Mishail #
set listchars=tab:<CTRL-K>>>\ ,trail:<CTRL-K>.M,eol:<CTRL-K>PI

vimdoc.sourceforge.net/htmldoc/digraph.html#digraph-table

Т.е. диграфы >>, .M и PI. Вводятся через Ctrl+K
+1
coldFlame #
По-моему, основная мораль статьи — важные конфиги надо класть в VCS
+3
simonoff #
вот если что мой — github.com/simonoff/vimrc/blob/efa0d8f03c0d5a72daed4eb973cb4126e4bdfaf7/.vimrc
вимом пользуюсь наверное уже лет 8…
+1
Servn #
Еще иногда полезна подсветка строки и столбца курсора
:set cursorline
:set cursorcolumn
0
jenich #
Дополнительно set wrap удобно включить:

Если вам не хочется, чтобы перенесенные строки мешались с номерами строк.
set showbreak=\ \ \ \ \ \ >

Символ > будет зеленый
hi NonText guifg=#0030ff ctermfg=green

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.