Expertus metuit
Памятка по VIm
Опубликовано 2010-01-29 в 13:02

Базовые команды и некоторые скрипты и конфиги для редактора VIm. Дырявая память заставила это всё написать.

Введение

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

Термины и обозначения

Сначала я хотел обойтись без этого раздела, однако позднее понял, что не получится.

Режим вставки — это когда вы нажимаете клавиши, а редактор не пищит и не портит текст. В этом режиме в статусной строке отображается текст «-- INSERT --», а при нажатии клавиш в главной рабочей области появляются изображённые на клавиашах символы.

Командный режим — это режим ввода команд, например, команд поиска или замены.

Обозначения клавиш. Далее в тексте физические клавиши отображаются в виде названия клавиши моноширинным шрифтом заглавными буквами в угловых скобках, например, <TAB> означает клавишу табуляции, а <CTRL-C> — комбинацию клавиш «Ctrl» и «C». Последовательность команд обозначается просто подряд идущими обозначениями клавиш/сочетаний.

Обозначения команд. Команды даются моноширинным шрифтом, предполагается, что для ввода команды нужно переключиться в умолчальный режим (в котором VIm портит текст и бибикает). Как правило для этого достаточно два раза подряд нажать <ESC>. После чего можно набирать команды, набирать прямо так, как указано; если понадобится перейти в командный режим, это обеспечит символ двоеточия («:») в начале строки команд. Команды регистрозависимы и текст нужно набирать точно так, как написано, то есть если написана команда G, то типичная последовательность нажатых клавиш будет такая: <ESC><ESC><SHIFT-G>.

Базовые установки

Здесь описываются базовые установки в конфиг-файле, у меня это ~/.vimrc.

Чтобы отключить стартовый экран про голодающих детей, добавляем в ~/.vimrc следующее:

set shm+=I

Установки табуляции и отступов, добавляем в ~/.vimrc (символ «"» начинает строковой комментарий):

set tabstop=4       " размер табуляции в символах
set shiftwidth=4    " на сколько пробелов сдвигать текст при (авто)отступе
set expandtab       " использовать пробелы вместо табуляции, нажимайтей <C-v><Tab> для вставки символа табуляции
set smarttab        " «умное» поведение клавиши Backspace 
                    " (то есть удалять пробелы как если бы на их месте стоял символ табуляции)

Отключаем вызов справки при нажатии на F1:

imap <F1> <C-o>:echo<CR>
nmap <F1> :echo<CR>

Назначаем функции на клавиши. F2 — сохранение файла, F4 — отключение подсвеченных результатов поиска, F10 — включение/отключение линейки с номерами строк:

" F2
imap <F2> <C-o>:w<CR>
nmap <F2> :w<CR>

" F4
imap <F4> <C-o>:noh<CR>
nmap <F4> :noh<CR>

" F10
imap <F10> <C-o>:set number!<CR>
nmap <F10> :set number!<CR>

Всегда показываем статусбар и заодно указываем, что в этом статусбаре отображать:

set laststatus=2
set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

Включаем bash-like дополнение имён файлов по нажатию на Tab:

set wildmode=longest,list

Работа с текстом

Базовые команды и опции

Курсор по тексту перемещаем стрелками.

Для перехода на 38 строку используем команду :38.

Для перемещения в начало строки: Home или ^. Для перемещения в конец: End или $.

В начало текста перемещаемся командой gg или :0 (двоеточие, затем нуль).

В конец текста перемещаемся командой G или :$.

Для отмены последнего действия (Undo) используем команду u. Нажимая u несколько раз, откатываемся на столько же шагов в истории измненений текста. Для возврата изменений используем сочетание <CTRL-R>.

Для скроллинга текста в режиме вставки нажимаем <CTRL-X>, а затем <CTRL-Y> для скролл на одну строку вниз или <CTRL-E> на одну строку вверх. В статусной строке при этом отображается что-то типа «-- (insert) Scroll (^E/^Y)».

Поиск и замена текста

Стандартная команда поиска:

/searchstring

Стандартная замена (заменить все вхождения строки «AA» на строку «BB» во всех строках):

:%s/AA/BB/g

Вместо «/» можно использовать любой символ, например, эквивалентная предыдущей команда:

:%s!AA!BB!g

Заменить все вхождения строки «A» на строку «D» в текущей строке (т.е. на которой курсор):

:.s/A/D/g

Заменить все вхождения строки «F» на строку «R» во всех строках, начиная с текущей и до конца файла:

:.,$s/F/R/g

Переход ко следующему вхождению поисковой строки — n, к предыдущему — N.

Вставка спецсимволов

В режиме вставки нажать <CTRL-V>, а затем нажать нужную клавишу для ввода спецсимвола. Например, последовательность <CTRL-V><CTRL-M> вставит символ перевода строки, а <CTRL-V><TAB> вставит символ табуляции (даже если у вас включен режим expandtab). Аналогичные действия работают также и в командном режиме.

Также можно вводить символы по их кодам, за подробностями во встроенную справку (:help i_CTRL-V_digit).

Автодополнение

В данном фрагменте используется слово «матчить» (варианты: «заматченный») для обозначения процесса поиска текста по образцу. Адекватного русского аналога словам «match» и «matched» я не знаю, поэтому пишу так.

Автодополнение словами из текста

Переключаемся в режим вставки, затем нажимаем <CTRL-N>, чтобы подставить следующее заматченное слово, <CTRL-P> — предыдущее заматченное слово. Матчинг производится для фрагмента слова, стоящего непосредственно перед курсором. Если заматченных слов больше одного, показывается меню, по пунктам которого можно перемещаться указанными выше комбинациями клавиш. Выбор нужного варианта подтверждается комбинацией <CTRL-Y>, после её нажатия подставляется выбранный пункт меню, а само меню закрывается.

За подробностями в справку (:h complete).

Автодополнение имён файлов

Вводим первые буквы файла, затем жмём <CTRL-X> <CTRL-F>. Если вариантов несколько, появляется меню, навигация по меню сочетаниями клавиш <CTRL-P> и <CTRL-N>, подтверждение выбора — <CTRL-Y>, закрытие меню без выбора — <CTRL-E>. Можно также во время отображения меню нажимать <CTRL-F> для перехода к следующему варианту в меню.

Проблема длинных строк

В VIm есть следующая проблема: если строка текста слишком длинная и автоматически переносится на следующую (:set wrap), то клавиши перемещения курсора вверх и вниз на строчку будут перемещать не по физическим, а по логическим строкам. Это неудобно, поэтому добавим в конфиг ~/.vimrc следующее (Tip 38):

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

Комментарии

Гость: Mikhail | 2010-04-24 в 01:36

Заметил пару опечаток:

  1. после слов "например, эквивалентная предыдущей команда:" команда ":%s!AA!BB!g" отображается просто текстом, без применения стиля, использованного во всех остальных примерах команд.
  2. в следующем абзаце говорится "заменить все вхождения строки «A» на строку «D»" - а в самой команде "A" заменяется на "B", а не на "D".
Sergey Stolyarov | 2010-04-25 в 23:00

Спасибо, исправил.

Текст комментария (допустимая разметка: *курсив*, **полужирная**, [ссылка](http://example.com) или <http://example.com>) Посетители-анонимы, обратите внимение, что более чем одна гиперссылка в тексте (включая оную из поля «веб-сайт») приведёт к блокировке комментария для модерации. Зайдите на сайта с использованием аккаунта на twitter, например, чтобы посылать комментарии без этого ограничения.
Имя (обязательно, 50 символов или меньше)
Опциональный email, на который получать ответы (не будет опубликован)
Веб-сайт
© 2006—2024 Sergey Stolyarov | Работает на pyrengine