Блог ИТ склеротика. Vim: необходимый минимум знаний

Страницы

Расширенный поиск в статьях блога

13 марта 2012 г.

Vim: необходимый минимум знаний

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

Вообще, когда вы работаете на сервере с Vim (который по сути является клоном редактораVi), скорее всего, вы будете иметь дело в «vim-tiny» — урезанной версией Vim, в которой оставлен только  набор функций «классического» редактора Vi.

Режим вставки

Первая вещь, на которую вы должны обратить внимание — это то, что Vim может работать в различных режимах:  командном режиме, режиме вставки режиме «последней строки» (известном ещё как «ex mode»). Непосредственно после запуска, Vim находится в командном режиме. В этом режиме весь ввод с клавиатуры будет воспринят как команды редактору, а не редактирование текста. Чтобы переключиться в режим вставки, нажмите 'i', после чего вы получите возможность редактировать текст. При помощи нажатия на Esc вы можете затем вернуться в командный режим, а введя ':' в командном режиме, вы попадаете в ex-режим.

Командный режим

Команды, которые могут использоваться в командном режиме, можно перечислять очень долго. Но пока что мы ограничимся лишь самым необходимым. Давайте начнём с перемещения по тексту:
  • 'h' — перемещение на один символ влево;
  • 'l' — перемещение на один символ вправо;
  • 'j' — перемещение на один символ вниз;
  • 'k' — перемещение на один символ вверх;
Можно смещать курсор не на один символ, а на слово целиком: 'w' перемещает на слово вперёд, а 'b' — на слово назад. Словом в Vim считается любая последовательность алфавитно-цифровых символов. Например, «word» — это слово, а «one-year» — это уже два слова, поскольку они разделены дефисом.
Удаление выполняется при помощи команд 'd' или 'x'. Если вам нужно удалить один символ, поставьте курсор над этим символом и нажмите 'x'. Для удаления слова под курсором используйте 'dw', а для удаления предыдущего слова — 'db'.
Если требуется удалить целую строку, используйте команду 'dd'. При помощи команды 'd$'можно удалить часть строки от позиции курсора до конца строки, а командой 'd^' (или'd0') — от текущей позиции курсора до начала строки.

Копирование и вставка

Копирование и вставку текста в Vim можно выполнять невероятно быстро. Чтобы переключиться в режим выделения текста, используйте команду 'v', 'V' или 'Ctrl+v'. После переключения в режим выделения вы можете выделять текст, перемещая курсор клавишами h, l, j, k или же клавишами со стрелками. В режиме 'v' — будет происходить «обычное» выделение, в режиме 'V' — выделение целых строк, а в режиме 'Ctrl+v' — блочное выделение, с его помощью можно выделять вертикальные блоки.
После того, как вы выделите нужный текст, используйте команду 'y' для того, чтобы скопировать выделенный фрагмент в буфер.
Далее, при помощи команды 'p' или 'P' можно вставить скопированный текст из буфера. 'p'вставит текст после курсора, а 'P' — перед ним.

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

Чтобы переключиться в режим поиска используйте команду '/' — для поиска в прямом направлении, или команду '?' — в обратном; затем введите шаблон поиска.
Поиск и замена в тексте выполняется при помощи команды ':s' с заданной областью поиска и замены. Например, чтобы найти «old» и заменить на «new», используйте следующую команду:
:%s/old/new/

Символ процента перед 's' означает глобальную область поиска. Вместо глобальной области вы можете определить диапазон строк, например:
:1,15s/old/new/

Имейте ввиду, что указанные выше команды заменяют только первое найденное вхождение. Часто бывает нужно найти и заменить все найденные вхождения в тексте. Для этого можно воспользоваться «глобальной» заменой, добавив к команде букву 'g':
:%s/old/new/g

Приведённая выше команда заменит все найденные «old» на «new». Дополнительно вы можете заставить Vim запрашивать у вас подтверждение перед выполнением замены:
:%s/old/new/gc

Откат действий


Что делать, если вы внесли изменения, которые не нужно было вносить? Воспользуйтесь командой 'u', которая отменит последнее изменение, сделанное вами. Если же после отката на действие назад вы снова передумали и решили «отменить отмену», вам поможет команда'Ctrl+r', которая делает откат в обратную сторону.
Имейте ввиду, что если ваш Vim работает в режиме совместимости с Vi, то вы не можете откатиться более, чем на один шаг назад. В своём же «родном» режиме Vim «помнит» и позволяет откатываться на большое количество шагов.

Сохранение и выход


Один из вопросов, который возникает у новичков, первый раз работающих с Vim, звучит примерно: «как мне выйти из него?». Действительно, глядя на экран с редактором, догадаться как именно это делается, невозможно. Это нужно просто знать.
Если вы хотите сохранить внесённые в файл изменения, используйте команду ':w', а чтобы сохранить изменения и покинуть редактор — команду ':wq'. Не хотите сохранять внесённые исправления? Бывает и такое. При помощи команды ':q!' можно выйти из Vim, при этом не сохраняя текущий файл.
Также, если нужно, вы можете сохранить редактируемый текст в другой файл при помощи команды ':w имя_файла'.

Что дальше


Такое вот кратенькое руководство получилось. Надеюсь, оно поможет многим начать работу с Vim и приобщиться к этому мощному инструменту, зачастую незаменимому в некоторых ситуациях. Если у вас возникнет желание дальше изучать возможности, предлагаемые этим редактором, обязательно почитайте руководство Vim, которое можно запустить из командной строки вызовом vimtutor. Ко всему прочему, документацию по Vim можно почитать из самого редактора, воспользовавшись командой ':help'.

Автозавершение слов


Хотя изучение Vim и может показаться сложной задачей на первых этапах, будьте уверены в том, что в будущем умение работать с ним сэкономит вам немало времени. Одним из способов, которыми Vim поможет сэкономить вам время, является автозавершение слов. Эта возможность Vim часто используется разработчиками и системными администраторами при редактировании исходных кодов программ или конфигурационных файлов.
Автозаврешение работает следующим образом. Когда вы набираете какое-нибудь длинное слово, которое уже встречается где-то в тексте, нажмите Ctrl+p или Ctrl+n в процессе набора слова. Например, у вас в тексте уже есть слово «searching». Теперь начните вводить это слово где-нибудь в тексте, при этом наберите только первые буквы, например «sea», и нажмите Ctrl+p. Vim автоматически завершит слово «searching» или предложит варианты слов, начинающихся с «sea», если таковые имеются.
Если имеется несколько вариантов завершения слова, то после нажатия Ctrl+p вы можете продолжить набирать слово, сужая тем самым область предлагаемых Vim вариантов слов. Или же вы можете просто выбрать нужное слово из списка при помощи клавиш со стрелками и затем нажать Tab. Если Vim не найдёт в документе ни одного подходящего слова, вы получите сообщение «pattern not found».
В чём разница между командами Ctrl+p и Ctrl+n? В том, что первая ищет слова в обратном направлении, относительно текущего, а вторая — в прямом. Во многих случаях люди не делают большой разницы между этими командами.

Сокращения


Как вы уже наверное заметили, Vim является отличным редактором для людей, которые любят работать с клавиатуры. Среди многих возможностей редактора в этом  отношении имеется ещё одна мощная штука — сокращения, которые вы можете настраивать «на лету», в процессе редактирования. Давайте посмотрим, что это такое.
Представьте, что вы редактируете какой-то текст, а нём часто-густо встречается одно и то же длинное слово, которое вы уже замучились набирать. Это может быть чья-то фамилия или название какой-то компании. Итак, если вы не хотите набирать постоянно «ReallyLongWord», просто сделайте для него сокращение в командном режиме:
:ab rlw ReallyLongWord

Первый аргумент команды :ab — это, собственно, само сокращение, а второй — это слово, до которого будет расширено сокращение. Теперь если, набирая текст, вы введёте слово «rlw», Vim автоматически заменит его на «ReallyLongWord». Просто, не правда ли?
Что делать, если сокращение вам больше не нужно и вы хотите его удалить? Просто закройте Vim и все определённые сокращения автоматически удалятся. Также можно удалить сокращение не выходя из редактора при помощи команды:
:una rlw

Описанной возможностью Vim автор пользуется постоянно. Очень удобная штука, когда вам необходимо частенько употреблять в тексте чью-либо сложную фамилию или длинное название организации.

Мэпинг


Оценили возможности использования сокращений? А что, если вам необходимо выполнить последовательность определённых команд по нажатию горячей клавиши или нескольких клавиш? Здесь вам поможет мэпинг.
Простой пример. Vim умеет подсвечивать результаты поиска. Эта возможность обычно отключена по умолчанию. Если вы выполните
?searchitem

или
/searchitem

вы будете автоматически перемещены к первому результату поиска, однако вам не будут видны оставшиеся найденные термы. Если же вы хотите видеть все вхождения искомого терма, вам нужно будет включить подсветку поиска. Автор находит подсветку найденного отвлекающей, однако она действительно необходима и полезна в работе. Так, в конфигурационном файле Vim автора есть строка, выполняющая мэпинг:
nmap <silent> <C-n> <Esc>:call ToggleHLSearch ()<CR>
Эта строка настраивает мэпинг комбинации Ctrl+n для включения/отключения функции подстветки результатов поиска. Сперва «нажимается» клавиша Escape, чттобы переключиться в командный режим, затем даётся команда :call ToggleHLSearch () и «нажимается» возврат каретки, то бишь Enter.
Другой, более простой пример. Когда автор редактирует чужие статьи, ему удобно двигаться по тексту, проскакивая по нескольку слов за раз. Для удобства автор настроил у себя следующий мэпинг, перемещающий курсор на пять слов вперёд за раз:
imap ,w 5W

Выглядит слегка странно, использовать два нажатия вместо двух нажатий. Однако, лично автору, неудобно держать палец над цифровой клавишей, а удобней использовать вариант, приведённый в примере. В общем, суть не в этом, а в том, чтобы показать читателю пример.
Чтобы настроенные вами мэпинги и сокращения не исчезали после закрытия Vim, вам нужно добавить их в файл .vimrc, расположенный в вашем домашнем каталоге.

Освоение интерфейса Vim


Изначально не очевидно, однако в одной сессии Vim можно одновременно редактировать несколько файлов. Делается это при помощи т. н. «окон» или же при помощи относительно новой возможности Vim, добавленной в 7-й версии — вкладок.
Давайте сперва рассмотрим окна. Когда вы открываете Vim для редактирования файла, вы видите одно окно с содержимым файла. Представим, что вы редактируете ну очень большой файл и вам нужно редактировать его параллельно в двух местах. Дайте команду (не забывайте нажимать Ctrl+Esc для перехода в командный режим)
:split

и вы увидите один и тот же файл в двух разных окнах.
Хорошо, но как теперь переключиться обратно в предыдущее окно? Очень просто. Перейдите в командный режим, нажмите Ctrl+w и при помощи клавиш со стрелками или клавиш перемещения (h, j, k, l) выберите нужное окно, на которое хотите переключиться относительно текущего окна. Допустим, ваша Vim-сессия разделена горизонтально на два окна. При помощи команды
Ctrl+w k

вы переключитесь на окно, расположенное выше активного, в то время как команда
Ctrl+w j

переключит вас на окно, расположенное ниже. Двойной повтор команды Ctrl+w переключит вас на следующее окно.
Помимо переключения между окнами вы можете перемещать сами окна. Команда
Ctrl+w r

вращает окна по часовой стрелке, а команда
Ctrl+w R

вращает окна против часовой стрелки.
Использование нескольких окон для работы с одним и тем же файлом используется сравнительно редко. Что что используется гораздо чаще, так это разделение сессии на окна при редактировании нескольких файлов. Представим, что вам захотелось открыть во втором окне какой-нибудь другой файл. Просто передайте путь к нужному файлу в виде параметра команде :split. Например:
:split /etc/dhcp3/dhclient.conf

Что делать, если вам понадобилось вернуться в однооконный вариант Vim-сессии? Для это вам нужно всего лишь закрыть ненужные окна традиционным способом (при помощи команды :q, :!q или :wq) или же, находясь в окне, которое хотите закрыть, дать команду
Ctrl+w c

В случае последней команды Vim не даст вам закрыть изменённый, но не сохранённый файл, что логично.
Давайте подытожим список основных команд, используемых при работе с окнами в Vim.

  • :split или Ctrl+w s — добавляет в сессию Vim горизонтальное окно
  • :vsplit или Ctrl+w v — добавляет в сессию Vim вертикально окно
  • :split filename — добавляет в сессию Vim горизонтальное окно и загружает в него filename
  • :vsplit filename — добавляет в сессию Vim вертикальное окно и загружает в него filename
  • Ctrl+w h — переключает на левое окно, относительно текущего
  • Ctrl+w l — переключает на правое окно, относительно текущего
  • Ctrl+w j — переключает на нижнее окно, относительно текущего
  • Ctrl+w k — переключает на верхнее окно, относительно текущего
  • Ctrl+w Ctrl+w — переключает на следующее окно
  • Ctrl+w r — передвигает окна по часовой стрелке
  • Ctrl+w R — передвигает окна против часовой стрелки
  • Ctrl+w c — закрывает текущее окно

И сразу ответ тем, кто спросит: «не лучше ли открыть несколько однооконных сессий вместо всей этой возни с окнами?». Подумайте о том, как иной раз бывает утомительно редактировать несколько файлов, открытых в нескольких отдельных SSH-сессиях к серверу, особенно высоконагруженному. И потом, гораздо удобнее выполнять копирование/вставку между несколькими файлами в пределах одной сессии, когда у вас всё перед глазами и не нужно судорожно переключаться между несколькими терминалами в поисках того,что же вы собирались скопировать и откуда.

Вкладки


Со времён появления вкладок в веб-браузерах пользователи очень привыкли и активно пользуются этим механизмом. Действительно, идея отличная. Так почему бы не использовать их в Vim? Если вы часто работаете одновременно с несколькими файлами и вам не нужно видеть их все одновременно на одном экране, то использование вкладок — самое то, что вам необходимо.
Для того, чтобы запустить Vim с несколькими файлами,открытыми в различных вкладках, запустите его следующей командой:
$ vim -p filename1 filename2 filename3

Если же у вас уже имеется открытая сессия Vim, вы можете загрузить файл (или создать новый) в новой вкладку при помощи команды:
:tabnew filename

Если вы не укажете filename, то будет открыта вкладка не связанная с именем файла и вы должны будете указать его при сохранении.
Переключение между закладками также очень простое. Команда gt переключит вас на следующую вкладку, а команда gT — на предыдущую.
Закрывать вкладки можно несколькими способами. Первый способ — это всё то же «традиционное» закрытие при помощи команд :q, :!q или :wq. Второй способ — использование команды для закрытия текущей вкладки:
:tabc

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

  • vim -p filename1 filename2 — запустит Vim и откроет (или создаст новые) файлыfilename1 и filename2 в двух вкладках
  • :tabnew — откроет пустую вкладку
  • :tabnew filename — откроет новую вкладку и загрузит (создаст новый) в ней файл filename
  • gt — переключит на следующую вкладку
  • gT — переключит на предыдущую вкладку
  • :tabc — закроет текущую вкладку

Заключение


Также вы можете комбинировать использование вкладок и окон, открывая несколько вкладок и разбивая каждую на несколько окон. Комбинируйте, Vim очень гибок. Если у вас появляется мысль о чём-то, чего вам бы хотелось от текстового редактора, скорее всего Vim это уже умеет.
Конечно же возможности Vim при работе с вкладками и окнами гораздо богаче. Вы можете воспользоваться командой :help и получить необходимую вам информацию.
Освоив приёмы, описанные здесь, вы можете существенно повысить уровень вашей продуктивности. В следующих статьях мы с вами познакомимся ещё с несколькими функциями Vim, а тем временем вы можете обратиться к vimtutor (запускается из оболочки) и самостоятельно покопаться в родном руководстве Vim, в котором, вполне вероятно, найдёте для себя что-нибудь новенькое и полезное.

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free