четверг, 23 декабря 2010 г.

Vim: Небольшой справочник

Я давно использую Vim в качестве основного редактора. И хотя над большими проектами работаю в eclipse, для внесения незначительных правок проще использовать Vim, чем ждать загрузки eclipse. Но Vim не совсем "простой текстовый редактор" у него три режима работы и множество команд. Изучение команд и возможностей Vim занимает время, но потраченное на изучение время быстро окупается.

Основные команды Vim очень простые, но сочетание простых команд может быть довольно мощным инструментом.


Режимы

В Vim имеется три режима работы с текстом:

  1. Командный режим: все нажатия клавиш интерпретируются как команды
  2. Режим вставки: используется для ввода текста
  3. Визуальный режим: используется для выделения текста или блока текста, этот режим можно рассматривать как под режим командного режима

Для переключения из режима вставки или визуального режима в командный режим, нажмите клавишу Esc.

Для переключения из командного режима в режим редактирования нажмите одну из клавиш:

  • i — переключает в режима вставки перед текущей позицией курсора
  • a — переключает в режим вставки после текущей позиции курсора
  • I — перескакивает к первому не пробельному символу в текущей строке и переключает в режим вставки
  • A — перескакивает к последнему символу в текущей строке и переключает в режим вставки

Для переключения из командного режима в визуальный режим нажмите одну из клавиш:

  • v — переключает в визуальный режим (выделение символов)
  • V — переключает в визуальный режим (выделение строк)
  • Ctrl+v — переключает в блочный визуальный режим (выделение прямоугольных областей текста)

Все команды которые работают с диапазонами (например: замена, вставка, удаление, копирование или отступы) поддерживаются в визуальном режиме.

Перемещения

Простейшие команды перемещения:

  • h — курсор влево
  • l — курсор вправо
  • j — курсор вверх
  • k — курсор вниз

Эти команды не работают в режима вставки, но во всех трёх режимах можно использовать клавиши перемещения курсора.

Есть множество команд доступных для перемещения в Vim, я приведу основные, если вам нужно что-то специфическое, смотрите в справочной системе Vim.

  • H — перемещения курсора вверх страницы
  • M — перемещение курсора в средину страницы
  • L — перемещение курсора в низ страницы

Прокрутка страницы:

  • Ctrl+e — на 1 строку вниз
  • Ctrl+d — на 1/2 страницы вниз
  • Ctrl+f — на 1 страницу вниз
  • Ctrl+y — на 1 строку вверх
  • Ctrl+u — на 1/2 страницы вверх
  • Ctrl+b — на 1 страницу вверх

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

  • 0 — первый символ строки
  • ^ — первый не пробельный символ строки
  • w — перескакивает к следующему слову
  • W — перескакивает к следующему слову, игнорируя символы пунктуации
  • e — перескакивает к конц слова
  • E — перескакивает к концу слова, игнорируя символы пунктуации
  • b — перескакивает к началу слова
  • B — перескакивает к началу слова, игнорируя символы пунктуации
  • ge — перескакивает к концу предыдущего слова
  • gE — перескакивает к концу предыдущего слова, игнорируя символы пунктуации
  • g_ — перескакивает к последнему не пробельному символу строки
  • $ — перескакивает к последнему символу строки

Если запомнить хотя бы несколько из этих команд, то можно быстро перемещаться из точки А в точку Б. Так же важным фактом является то, что эти команды задают диапазон для других команд.

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

Вставка текста осуществляется в Vim довольно просто, нажал i и начал печатать. Но для редактирования Vim предлагает довольно сложные команды.

  • d — удалить символ от текущей позиции курсора, до позиции заданной следующей командой (например: d$ удалит все символы от текущей позиции до конца строки)
  • c — изменить символ от текущей позиции до позиции заданной следующей командой
  • x — удалить символ под курсором
  • X — удалить символ перед курсором
  • y — копировать символы от текущей позиции до позиции заданной следующей командой
  • p — вставить удалённый или скопированный текст после текущей позиции курсора
  • P — вставить удалённый или скопированный текст перед текущей позицией курсора
  • r — заменить символ под курсором на новый, введённый
  • s — заменить текст с текущей позиции курсора до позиции заданной следующей командой введённым текстом
  • . — повторить последнюю команду вставки или редактирования (x,d,p...)

Двойная команда d, c или y выполнит операцию над всей строкой, например yy скопируют всю строку.

Обратите внимание, что многие команды из описанных здесь на самом деле являются более мощными. Например вы можете указать в какой регистр скопировать текст. При вводе "ayy копия строки сохраниться в регистре a, что бы вставить текст из этого регистра необходимо ввести "ap. Vim помнит несколько последних команд удаления и копирования в автоматических регистрах. Что бы посмотреть содержимое регистров наберите :registers. Вы так же можете использовать автоматические регистры для вставки старых фрагментов текста.

Визуальный режим

Используя визуальный режим можно вставлять текст в каждую строку выделенного фрагмента.

Например, мы выбрали прямоугольную область (использую Ctrl+v или Ctrl+q в windows), мы можем нажав I (переключившись в режим вставки) вставить свой текст. Как только выйдем из режима вставки, текст будет добавлен ко всем выбранным строкам. Для ввода текста после выделенной области нужно использовать A. Для выделений используются клавиши h, j, k и l курсорные клавиши в визуальном режиме не работают.

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

Если мы хотим добавить текст в конце строк, то можно использовать Ctrl+v (или Ctrl+q в windows) $ и выбрать строки. Разница между предыдущими вариантами и этим заключается в том, что $ указывает на концы строк, а Ctrl+v (или Ctrl+q) работает со столбцами, игнорируя текст.

Используем Ctrl+q:

Тестовый текстВСТАВЛЕННЫЙ ТЕКСТА
Ещё строка    ВСТАВЛЕННЫЙ ТЕКСТА
Текст         ВСТАВЛЕННЫЙ ТЕКСТА

Используем Ctrl+q $

Тестовый текстВСТАВЛЕННЫЙ ТЕКСТА
Ещё строкаВСТАВЛЕННЫЙ ТЕКСТА
ТекстВСТАВЛЕННЫЙ ТЕКСТА

Текстовые объекты

Команды Vim оперируют такими текстовыми объектами как символ, слово, предложения, разделённые скобками фрагменты и т.д.

Одним из важных объектов является внутреннее слово: iw. Для выделения слова под курсором достаточно набрать yiw (vвизуальный режим, iw — внутреннее слово), аналогично для удаления: diw.

Разница между i-словом/блоком и a-словом/блоком в том, что внутренний (i) вариант выбирает символы и слово (без пробелов) или содержимое скобок, не включая внешние пробелы и скобки. a-вариант выбирает блоки с внешними пробелами и скобками.

  • iw — внутреннее слово
  • aw — a слово
  • iW — внутреннее СЛОВО
  • aW — a СЛОВО
  • is — внутреннее предложение
  • as — a предложение
  • ip — внутренний параграф
  • ap — a параграф
  • i( или i) — внутренний блок
  • a( или a) — a блок
  • i< или i> — внутренний блок
  • a< или a> — a блок
  • i{ или i} — внутренний блок
  • a{ или a} — a блок
  • i" или i" — внутренний блок
  • a" или a" — a блок
  • i' или i' — внутренний блок
  • a' или a' — a блок

Небольшие примеры, что бы было понятнее. Символами [ и ] выделен выделенный блок.

Команда   Текстовый объект
iw        Это [тестовое] предложение.
aw        Это [тестовое ]предложение.
iW        Это[ тестовое ]предложение
aW        Это[ тестовое ]предложение.
is        ...предложение. [Это тестовое предложение.] Это...
as        ...предложение. [Это тестовое предложение. ]Это...
           конец предыдущего параграфа
ip        [Это параграф. Содержащий два предложения.]
           следующий параграф.
           конец предыдущего параграфа
ap        [Этот параграф. Содержит два предложения
          ]следующий параграф
i( or i)  1 * ([2 + 3])
a( or a)  1 * [(2 + 3)]
i< or i> The <[tag]>
a< or i> The [<tag>]
i{ or i}  some {[ code block ]}
a{ or a}  some [{ code block }]
i"        The "[best]"
a"        The[ “best”]
i`        The `[best]`
a`        The[ `best`]

Пробуйте эти команды и запоминайте, они помогут сэкономить много времени.


Отмена и Возврат

Отменить можно почти все команды (Ctrl+z), в командном режиме можно даже отменить отмененную команду (Ctrl+r)


Выполнение внешних команд

В Vim легко получить результат выполнения внешних команд или использовать часть строки в качестве аргумента внешней программы.

Для вывода результат выполнения внешней команды :!command, будет показан вывод команды.

Для фильтрации текста через внешнюю команду :!sort %.

Для вставки вывода внешней команды в текст :r!command (например :r!ping ya.ru)

Для получения подробной информации по фильтрации выполните :h filter.


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

Поиск в Vim организован очень просто. Нажмите / в командном режиме и вставьте термин который хотите найти. Vim выполнит поиск по файлу в прямом направлении. Для поиска в обратном направлении используйте ?. Используя n или N можно повторить поиск в том же обратном направлении.

Если установлена опция 'incsearch', то Vim сразу же переходит к первому совпадению, когда вы начинаете вводить термин. Если установлена опция 'hlsearch', то будут подсвечиваться все совпадения. Что бы удалить подсвечивание, наберите :nohl.

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

Для замены с использованием регулярных выражений, наберите :%s/старый текст/новый текст/gc. Эта команда выполнит поиск во всём файле % и произведёт замену s фразы "старый текст" на "новый текст", будет искать более одного совпадения в каждой строке g и спрашивать перед заменой, действительно ли вы хотите заменить фразу c.

Для замены текста в выбранной области, выберите область и наберите :s/старый текст/новый текст/g. В командной строке это должно выглядеть как :'<,'>s/старый текст/новый текст/g. Что означает '< и '> вы поймёте после прочтения раздела Метки.


Завершения

Когда вы набираете текст, то довольно часто приходится набирать одни и те же слова. При нажатии Ctrl+p Vim будет искать продолжение слова, которое мы набираем, в набранном ранее тексте. Ctrl+x и Ctrl+l завершит набранный текст до конца строки.

Если вы не уверены в правильности написания слова, можно включить проверку орфографии :set spell и при нажатии комбинации Ctrl+x и Ctrl+K Vim выполнит поиск в словаре. Механизм завершения слов существенно улучшился в 7 версии Vim.

Обратите внимание, что команды завершения работают в режиме вставки, в командном режиме у них другое назначение!


Метки

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

Некоторые метки Vim ставит автоматически:

  • {0-9} — 10 последних позиций в закрытых файлах (0 последний файл, 1 предпоследний и т.д.)
  • < и > — левая и правая позиции помеченного текста.
  • ( и ) — начало и конец текущего предложения
  • { и } — начало и конец текущего параграфа
  • [ и ] — первый и последний символы скопированного или изменённого текста
  • . — позиция последней замены
  • ' или ` — позиция перед последним переходом
  • " — позиция перед последним выходом из файла
  • ^ — позиция последней стоп-вставки

Для установки ручной метки используйте m{a-zA-Z} (после m следует либо a,b..z или A, B..Z). Для перехода между метками используются ' и `.

  • ' — устанавливает курсор на первый не пробельный символ в отмеченной строке
  • ` — устанавливает курсор на место где была установлена метка

Существует различие между строчными и заглавными символами меток:

  • {a - z} — локальный файл
  • {A - Z} — сохраняется и доступно между сессиями (ассоциированы с файлами)

Можно использовать метку L для ведения рабочего журнала и T для своего расписания и быстро обновлять информацию в них.

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

Для получения списка всех меток можно набрать команду :marks. Для удаления меток используется :delmarks. :delmarks a b c удалит метки a, b и c, для удаления всех меток используйте :delmarks!


Вкладки, буферы и окна

С седьмой версии в Vim появились вкладки. Вкладки Vim сильно отличаются от вкладок в других редакторах, они скорее похожи на копии Vim в терминальном окне с вкладками. Например каждая вкладка может иметь свой макет. Например в первая вкладка у вас может быть разделена на два окна с html кодом и стилем css. Во второй вкладке можно держать одно окно с js скриптом и т.д. В разных вкладках можно держать одинаковые открытые файлы. В общем вкладки в Vim более мощные чем у большинства других редакторов.

Для открытия нескольких файлов во вкладках можно использовать командрую строку vim -p *.css

Для переключения между вкладками можно использовать мышь или набрать gt.

Для создания новой вкладки наберите команду :tabnew, для открытия файла в новой вкладке :tabe имя_файла

Буферы и окна в Vim немного сложнее для понимания. Окно это то, что вы виде запустив Vim, когда вы запускаете систему справки (например набрав :help buffers), вы получите два окна. Таким образом они скорее не окна, а видимые области.

Вы можете открыть окно и разделить его по горизонтали :sp или вертикали :vsp. Vim отобразит один буфер в двух разных окнах. Так же можно открывать новый файл :sp имя_файла или :vsp имя_файла. Для переключения между окна используется мышь или Ctrl+w {h, j, k, l} в командном режиме.

Буфер это файл (в большинстве случаев), но не обязательно видимый. Обычно используется больше буферов, чем окон. Для отображения другого буфера в текущем окне используйте :b номер_буфера. Номер буфера можно узнать из списка буферов :buffers. В стандартной конфигурации Vim сохраняет текущий буфер при переключении на другой. Для отключения сохранения буфера используйте команду :set hidden, но будьте осторожны.

Вот некоторые команды из справочной системы:

  • :b N — переключает на буфер N
  • :buffers — показывает список буферов. Разъяснения:
    • % — текущее окно
    • # — альтернативный буфер (переключается :e# или :b#)
    • a — активный буфер (загружен и видим)
    • h — скрытый буфер (загружен, но не видим)
    • + — изменённый
  • :bd — выгружает буфер и удаляет его из списка буферов (не закрывает Vim, даже если это последний буфер)
  • :bun — выгружает буфер, но оставляет его в списке буферов
  • :sp #N — делит текущее окно по горизонтали и открывает в нём буфер N
  • :w — записывает текущий буфер на диск
  • :e имя_файла — загружает файл с диска
  • :q — закрывает текущее окно (и Vim, если оно было последним)
  • :new — новое пустое окно
  • :on — закрывает все окна, кроме активного (Ctrl+W o)
  • Ctrl+W {h, j, k, l} - перемещение между окнами

Буферы автоматически сохраняются, если опция 'hidden' не установлена, а опция 'autowrite' установлена.


Макросы

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

Начать запись макроса можно с помощью q и одной из меток {0-9a-zA-Z}, например qq запишет макрос помеченный как "q". Нажав q можно остановить запись.

Теперь макрос можно повторить в любой момент используя @ q.


Заключение

Надеюсь этот материал поможет в освоении возможностей одного из самых интересных и сложных текстовых редакторов.

Похожие по тематике посты:

1 комментарий:

bok комментирует...

Отличная статья, спасибо! Хотел бы добавить что некоторые комбинации нажатий клавиш продублированы. Например для перехода в "командный режим" можно нажать не только Esc, но и например ctrl+c или даже ctrl+[. Это может быть полезным для тех у кому трудно мизинцем дотянуться не отрывая руки от клавиатуры. Или как у меня вообще Esc разломан :-)