Закомментировать блок в vim

10 сентября 2015. Комментарии .

Для комментирования блока я всегда использовал режим визуального выделения, который вызывается по ctrl+v (в gvim для windows по умолчанию ctrl+q).

Нужно поставить курсор, например, в начале строки наверху выделяемого блока, нажать ctrl+v, переместить курсор в конец параграфа, нажав }, затем нажать I (shift+i), ввести символ комментария (например, #) и нажать ESC. Читать подобные пассажи очень неудобно, поэтому обычно люди, рассказывая о последовательности действий в vim’e, пишут так (вместо ctrl обычно ставят шапку ^):

^v } I # <ESC>

Выглядит это так:

gif animation c-v

Конечно, вместо } можно несколько раз нажать j, или 10j, или использовать любую другую команду перемещения.

Потом я узнал, что выделить параграф можно, нажав v i p (Visual In Paragraph). Стал часто использовать, например, комбинацию > i p, чтобы передвинуть блок в питоне — там это частенько пригождается. Нажав точку . после выполнения > i p, можно повторить сдвиг. Очень удобно.

К сожалению, сочетание v i p I # <ESC> закомментирует только первую строку из всего выделенного блока. Погуглив, я нашёл устроившее меня решение на stackoverflow в пятом (на момент написания записи) по популярности ответе.

В ~/.vimrc я добавил такие строки:

1
2
vmap cc :norm i#<CR>
vmap uc :norm ^x<CR>

После этого надо сделать :source ~/.vimrc или :source %, если открыт .vimrc. В следующий раз после загрузки vim этого делать не надо.

Теперь комментирование блока выглядит очень шустро, например: v i p c c , а раскомментирование — v i p u c . Кстати, чтобы восстановить последнее выделение, можно нажать g v . Особенно удобно, что с помощью этих комманд можно закомментировать/раскомментировать блок из любого его места, хоть из середины.

Теперь получается так:

gif animation vip

Чтобы решётка ставилась не в начале строки, а перед первым непробельным символом, повесьте на cc следующую команду: vmap cc :norm ^i#<CR>

Сработает такая штука для строк, выделенных в любом из трёх режимов выделения vim: v (выделение символов), V (выделение строк) и ctrl+v (выделение блоков).

Также существует плагин NERD commenter и куча других, но у меня не возникло желания их пробовать, потому что найденное решение вполне устраивает. Когда я только начал осваивать vim, мне казалось, что гигантский файл настроек vimrc и куча плагинов — это круто, но теперь я считаю совсем наоборот.

P.S. gif-анимацию с экрана захватывал с помощью byzanz-gui скрипта. Инструкции по установке и использованию нашёл здесь (англ). Текст поверх кадров добавлял с помощью imagemagick и этих инструкций.