VIM. Введение. Примеры эффективной работы

Автор: Nikolay shurph Saskovets

Введение

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

В любом случае, мы открываем привычный уже нам текстовый редактор и начинаем набирать текст. Для кого-то этим редактором является Kate, или Jed, или Joe. А может быть это даже emacs и OpenOffice.org.

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

В этом небольшом, но, надеюсь, познавательном докладе о нем и пойдет речь.

Принципы работы

Для начала ознакомлю вас с принципами его работы. Ведь VIM, в отличие от многих других редакторов, имеет не один, а несколько режимов работы, что может привести в замешательство неподготовленного пользователя.

Режимы работы

VIM имеет несколько режимов работы. Из них три — основные:

  • Командный режим (NORMAL);
  • Режим редактирования (INSERT)
  • Режим выделения текста (VISUAL)

Существует еще режим совместимости с VI и режим, эмулирующий поведение обычных Windows редакторов. Но эти два режима, думаю, рассматривать не стоит, т.к. вместо эмуляции VI, в Linux можно запустить и сам vi, а режим Windows редакторов по отзывам является достаточно скудным.

Режимом по умолчанию является режим NORMAL, поэтому все переходы происходят через него. Для перехода между тремя основными режимами существует несколько способов:

  • i (Insert) — переход в режим INSERT. Кнопка Insert также переключает режимы вставки/замены;
  • a — вставка текста после текущего символа (подсвеченного курсором);
  • o — вставка новой строки после курсора и переход в режим INSERT;
  • O — вставка новой строки перед курсором и переход в режим INSERT;
  • cc, S — очистка строки и переход в режим INSERT;
  • C — удалить правую часть строки и переход в INSERT;
  • s — удалить подсвеченный символ и переход в режим INSERT;
  • v — режим выделения текста (с точностью до знака);
  • V — режим выделения текста (с точностью до строки);
  • Ctrl+V, Ctrl+Q — режим выделения прямоугольной области текста;
  • gv — возврат к области, выделенной в прошлый раз;
  • LeftMouse — прекращает выделение или начинает новое;
  • RightMouse — продолжает выделять область;
  • ESC — выход в режим NORMAL;
  • Ctrl+O — кратковременный выход в режим NORMAL для выполнения одной команды, после чего осуществляется автоматический возврат в режим INSERT.

Открытие, сохранение, выход

Открытие

Все операции по открытию, сохранению файла осуществляются из режима NORMAL.

Для того, чтобы открыть файл следует выполнить команду: :edit.

Эта команда может принимать некоторые параметры. В частности это имя файла, режим перекодирования (актуален для русскоговорящих), режим конца строки. Например, очень часто будут полезны параметры:

++enc=koi8-u
++enc=cp1251
++enc=utf8

А также:

  • ++ff=unix — строки заканчиваются символом <NL>;
  • ++ff=dos — строки заканчиваются символом <CR><NL>;
  • ++ff=mac — строки заканчиваются символом <CR>.

Сохранение

С открытием, надеюсь, все достаточно понятно. Теперь поговорим о сохранении. Сохранять файл можно несколькими способами.

Можно просто указать команду: :w. И изменения будут сохранены в текущий открытый файл. Если же файл защищен от записи, то его можно сохранить форсированно, добывив к команде восклицательный знак: :w!. Для сохранения содержимого под новым именем существует две команды: :w filename и :sav filename.

Первая просто сохраняет содержимое в новый (или не совсем ) файл. Вторая же сохраняет буфер под новым именем, причем имя текущего буфера тоже меняется. А предыдущее имя используется как альтернативное.

Для сохранения всех открытых буферов следует использовать команду: :wa.

Выход

Вот мы и добрались до столь значимой функции редактора как «Выход». Да, с одной стороны, может показаться смешно, что этому моменту уделяется столько внимания, однако, помня некоторые казусы, не упомянуть о нем я не могу.

Выход осуществляется по команде: :q.

При этом, если вы хотите выйти, не сохранив уже измененный файл, то опять же воспользуйтесь “!”: :q!.

Комбинирование.

Некоторые команды в VIM могут подвергаться комбинированию. Например, для того, чтобы выйти, сохранив файл, следует использовать команду: :wq. И опять же, не забывайте о “!”.

Навигация по тексту

Чтобы нормально редактировать текст, по нему, естественно, следует перемещаться. Для этого в vim используются клавиши h влево, j вниз, k вверх, l вправо. Однако это только в режиме NORMAL, да и эффективно их использовать смогут только люди, достаточно хорошо владеющие «слепым» методом печати.

Для обычных же людей вполне сойдут и курсорные клавиши, тем более они работают и в режиме INSERT.

Конечно же, бегание курсорными клавишами по всему тексту — это не верх возможностей VIM’а. Существует множество команд, позволяющих легко и быстро переместиться в нужную позицию в тексте.

Ниже приведен небольшой список этих команд.

В любых режимах:

  • HOME — переход в начало строки;
  • END — переход в конец строки;
  • Ctrl+HOME — переход в начало документа;
  • Ctrl+END — переход в конец документа.

В режиме NORMAL:

  • f{символ} — поиск указанного символа в текущей строке вправо;
  • F{символ} — поиск указанного символа в текущей строке влево;
  • % — переход к парной скобке;
  • {nn}G или {nn}gg — переход к строке nn, если номер строки не указан, то G переход в конец, а gg в начало документа.;
  • CTRL+O — возврат на предыдущую позицию (при переходах по документам с помощью меток, именованных меток, ссылок или с помощью команд gg и G);
  • * — поиск слова, на котором в данный момент стоит курсор, далее по тексту;
  • # — аналогична предыдущему, но в обратном направлении;
  • ) — переход на начало следующего предложения;
  • ( — переход на начало предыдущего предложения;
  • } — переход на начало следующего параграфа;
  • { — переход на начало предыдущего параграфа;
  • [* — переход назад к началу блока комментария (”/*”);
  • ]* — переход вперед к концу блока комментария (”*/”);
  • CTRL+] — переход по ссылке.

Также достаточно полезными могут оказаться именованные метки. Для работы с ними следует использовать такие команды (в NORMAL):

  • m{имя} — установить метку с именем {имя}. Именем метки может быть любая (одна) буква;
  • '{имя} — переход к строке с указанной меткой;
  • `{имя} — переход в конкретное место (строка и столбец) помеченное меткой;
  • :marks — показать все определенные метки;
  • ' — позиция курсора до перемещения (метка, ссылка, поиск …);
  • " — позиция курсора во время последнего редактирования;
  • [ — начало последнего изменения;
  • ] — конец последнего изменения.

Редактирование

Редактирование текста можно осуществлять во всех трех основных режимах. В режиме VISUAL осуществляются изменения выделенного участка текста. В режиме NORMAL в качестве объекта редактирования выступает текущая строка, слово или символ. Корректура собственно текста осуществляется непосредственно в режиме INSERT, в котором вы можете добавлять новые символы, удалять или заменять старые.

Форматирование и редактирование

В каждом из режимов есть свои сочетания клавиш. Вот они:

Режим VISUAL:

  • ~ — изменить регистр выделенного фрагмента текста;
  • c [x] — удалить выделенный участок в регистр x и перейти в режим вставки;
  • > — сдвинуть выделенный фрагмент вправо;
  • < — сдвинуть выделенный фрагмент влево;
  • ! — отфильтровать выделенные строки с помощью внешней программы.

Режим NORMAL:

  • DEL, x — удалить символ правее курсора;
  • X — удалить символ левее курсора;
  • dd — удалить текущую строку;
  • u — отмена последнего действия;
  • CTRL + R — вернуть исправления;
  • D — удалить до конца строки;
  • . — повторить последнее действие;
  • r — заменить символ подсвеченный курсором;
  • ~ — поменять регистр символа под курсором.

Режим INSERT:

  • DEL — удаляет следующий символ;
  • CTRL + A — вставляет текст, который был введен в прошлый insert-сеанс;
  • CTRL + W — удаляет предыдущее слово;
  • CTRL + N — автоматическое завершение слова с поиском вперед по тексту;
  • CTRL + P — автоматическое завершение слова с поиском назад по тексту;
  • CTRL + T — вставить табуляцию в начало текущей строки;
  • CTRL + D — удалить табуляцию из начала текущей строки;
  • CTRL + Q — вставляет символ, код которого следует за нажатием комбинации;
  • CTRL + X — переходит в дополнительный режим, в котором вы можете выполнять автозавершение или другие полезные действия. Подробнее этот режим рассмотрен далее;
  • CTRL + E — вставляет символ, который находится в той же позиции, что и курсор, но ниже;
  • CTRL + Y — вставляет символ, который находится в той же позиции, что и курсор, но выше.

Подрежим CTRL + X

Достаточно интересным является дополнительный режим, в который можно перейти из режима INSERT, нажав комбинацию клавиш CTRL + X.

В этом режиме действуют следующие сочетания:

  • CTRL + E — сдвиг окна на одну строку вверх (курсор остается на месте);
  • CTRL + Y — сдвиг окна на одну строку вниз (курсор остается на месте);
  • CTRL + L — автоматическое завершение целой строки с поиском в обратном направлении;
  • CTRL + K — автоматическое завершение слова из файла, указанного в параметре ‘dictionary’;
  • CTRL + T — автоматическое завершение слова из файла, указанного в параметре ‘thesaurus’;
  • CTRL + I — автоматическое завершение слова с поиском в текущем файле и всех подключаемых файлах;
  • CTRL + ] — автоматическое завершение тэгов;
  • CTRL + F — автоматическое завершение имени файла.

Работа с буферами (регистрами)

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

Режим VISUAL:

  • ab — выделить фрагмент ограниченный символами ( и ) включительно;
  • ib — выделить фрагмент ограниченный символами ( и );
  • aB — выделить фрагмент ограниченный символами { и } включительно;
  • iB — выделить фрагмент ограниченный символами { и };
  • ap — выделить параграф;
  • a[ — выделить фрагмент ограниченный символами [ и ] включительно;
  • i[ — выделить фрагмент ограниченный символами [ и ];
  • a< — выделить фрагмент ограниченный символами < и > включительно;
  • i< — выделить фрагмент ограниченный символами < и >;
  • : — выполнить команду для выделенного фрагмента;
  • ["x] D — удалить выделенные строки в регистр х;
  • ["x] Y — скопировать выделенный фрагмент в регистр х;
  • ["x] p — заменить выделенный фрагмент содержимым регистра х;
  • u — установить для выделенного фрагмента нижний регистр;
  • U — установить для выделенного фрагмента верхний регистр.

Режим NORMAL:

  • ["x] p — вставить текст из регистра х после курсора;
  • ["x] P — вставить текст из регистра х до курсора;
  • ["x] y — копировать текущую строку в регистр х.

Режим INSERT:

  • CTRL + R — вставляет содержимое регистра. При нажатии этой комбинации в место вставки впечатывается символ кавычек и ожидается ввод идентификатора регистра. В качестве последнего могут выступать следующие символы: 0-9, a-z, ", %, #, *, +, :, ., -, =.

Вместо "x можно использовать следующие регистры:

  • безымянный регистр "";
  • 10 нумерованных регистров от "0 до "9;
  • регистр малого удаления "-;
  • 26 именованных регистров от "a до "z или от "A до "Z;
  • 4 регистра, доступных только для чтения: ":, "., "%, "#;
  • регистр выражения "=;
  • регистры выделения "* и "+:
  • регистр Черная дыра "_;
  • последний шаблон поиска "/.

Безымянный регистр используется при всех операциях копирования или удаления, если только в качестве целевого регистра не указана Черная дыра. В последнем случае удаленный фрагмент не копируется ни в дин из регистров. Если при вставке текста не указан регистр-источник, то в качестве источника используется безымянный регистр. Если в качестве целевого регистра при копировании указать безымянный регистр, то запись осуществляется в регистр 0.

Нумерованные регистры заполняются скопированными или удаленными фрагментами текста. При этом регистр 0 содержит последний скопированный фрагмент, если не было указано целевого регистра. Регистр 1 содержит последний удаленный фрагмент, если только не было указано другого регистра и если удаленный фрагмент содержит более одной строки текста. При удалении фрагментов размером менее строки, он копируется в регистр -. При каждом успешном удалении фрагмент из регистра 1 переносится в регистр 2, из 2 в 3 и так далее. Содержимое регистра 9 безвозвратно теряется.

Именованные регистры записываются только по прямому указанию пользователя. При этом если указывается строчная буква, то фрагмент будет перезаписан, а если заглавная, то фрагмент будет добавлен.

Назначение остальных регистров очевидно по названию:

  • " — безымянный регистр, содержащий последний удаленный или скопированный текст;
  • % — имя редактируемого файла;
  • # — альтернативное имя файла;
  • * — содержимое буфера обмена (X11 непосредственное выделение);
  • + — содержимое буфера обмена;
  • / — последний ключ поиска;
  • : — последняя команда;
  • . — последний вставленный текст;
  • - — последнее короткое удаление (меньше строки);
  • = — регистр выражения: вас попросят ввести выражение, результат вычислений будет вставлен в текст.

Многооконность

Каждый открытый файл может либо отображаться, либо быть скрытым. Мы пропустим описание скрытых файлов, так как чаще всего встречается ситуация, когда необходимо именно отображать несколько файлов. Для этого мы должны рабочее окно разделить на два. По умолчанию в новое окно грузится тот же файл. Это может быть полезно, если необходимо иметь визуальный доступ к нескольким частям одного и того же документа. Однако вы можете в одно из окон загрузить новый файл. Интересной особенностью является то, что рабочее окно может быть разделено по вертикали или по горизонтали.

Для разделения окна можно использовать команды:

  • :sp — разделить текущее окно на два по горизонтали, в результате вы имеете два вида на один файл (первоначальное окно делится пополам);
  • :vs — разделить текущее окно на два по вертикали, в результате вы имеете два вида на один файл (первоначальное окно делится пополам);
  • :new — создает новое окно (горизонтальное разделение), в котором начинается редактирование пустого (нового) файла;
  • :vne — создает новое окно (вертикальное разделение), в котором начинается редактирование пустого (нового) файла;
  • CTRL + W + курсорная клавиша — перейти в другое окно.

Поиск. Замена. Основы макросостроения. Аббревиатуры

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

VIM имеет очень мощные средства для поиска и замены текста. Эти механизмы основаны на так называемых регулярных выражениях. Если читатель знаком с этой технологией, то мои объяснения будут излишни, если нет то это тема для отдельной статьи. Рассмотри наиболее употребляемые варианты. Простой поиск осуществляется с помощью команды / или ? в нормальном режиме для поиска вперед или назад по тексту соответственно. После символа команды необходимо указать шаблон для поиска. Для повторного поиска необходимо нажать соответствующую команду (без шаблона). Удобной особенностью поиска является автоматическая подсветка найденных слов.

Кроме этого, есть очень удобная функция поиска слова на которое указывает курсор. Для этого необходимо в нормальном режиме установит курсор на требуемое слов и нажать # или * для поиска назад или вперед соответственно.

Для замены одного фрагмента текста (шаблон) на другой (новый текст) необходимо использовать следующую форму записи команды:

[range]s/шаблон/новый текст/[i][g][c]

где [range] указывает где именно необходимо осуществить операцию замены.

Возможны следующие варианты этого параметра:

  • % — весь текст;
  • 1 — первая строка;
  • . — текущая строка;
  • $ — последняя строка;
  • .,$ — от текущей строки и до конца файла, и так далее.

Параметры в конце команды определяют ее поведение следующим образом:

  • i — игнорировать регистр;
  • g — заменять все слова в строке, иначе заменяется только первое найденное слово;
  • c — подтверждать каждую замену.

Если вы вызвали команду замены из режима VISUAL, и опустили первый параметр, то замена будет осуществляться только в выделенной области.

Макросы

VIM имеет очень мощные средства автоматизации работы. Для выполнения рутинных операций в текущем или группе файлов имеется встроенный язык. Этот язык достаточно функционален. Есть готовые решения создающие на базе VIM дневник с календарем или даже игру (Тетрис). Однако, описание встроенного языка выходит далеко за рамки данного труда и уж никак не относится к простым приемам редактирования. Этот раздел добавлен с единственной целью немного приоткрыть штору скрывающую внутреннюю мощь этого текстового редактора.

Есть и более простой способ для повторения простых действий линейный алгоритм, без ветвлений. Этот так называемые сложные повторения или записи. Эти макросы записываются непосредственно в именованные регистры. Для начала записи необходимо в режиме NORMAL нажать q и имя того регистра, в который необходимо осуществить запись. Окончание записи осуществляется повторным нажатием q. Для повтора записанных действий в режиме NORMAL используется команда @ + имя регистра, а в режиме INSERTCTRL+R + имя регистра.

Автозамена

Есть еще один метод быстрой подстановки фиксированных слов (словосочетаний или даже целых выражений). Этот метод использует так называемые аббревиатуры. Для описания своей аббревиатуры необходимо выполнить команду :iabbrev за которой следует аббревиатура и ее расшифровка соответственно. Пример: :iabbrev M$ Microsoft. После выполнения этой команды, если вы введете “M$” с последующим пробелом, то автоматически будет подставлена соответствующая расшифровка “Microsoft”.

Автор: Nikolay shurph Saskovets

При составлении статьи использовались материалы работы Ялового Ильи Викторовича — Путь к VIM (Ver. 0.5, 2003-04-18 ). Этот документ может распространятся и изменяться в соответствии с требованиями GNU General Public License. Копия GPL доступна по адресу www.gnu.org/copyleft/gpl.html.