Расширенное редактирование простого текста или кода с помощью Vim

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

Предыдущее руководство описывает установку vim и выполнение основного редактирования. Данная статья рассматривает более сложные темы, демонстрирующие многофункциональность редактора vim.

Предполагается, что пользователь установил редактор vim и ознакомился с основными действиями и редактированием команд, описанными в предыдущем руководстве.

Навигация

Прежде чем ознакомиться с новым материалом, вспомните  некоторые клавиши перемещения, описанные в предыдущем руководстве:

Основное перемещение:

  • h: влево
  • l: вправо
  • j: вниз
  • k: вверх

Другие движения:

  • gg: в начало документа;
  • G: в конец документа или к строке, если ее номер указан перед G;
  • w: следующее слово;
  • e: конец слова
  • 0: в начало строки
  • $: в конец строки.

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

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

  • H: переместить курсор в верхнюю часть видимой на данный момент страницы (от «high»);
  • M: переместить курсор в середину видимой в данный момент страницы (от «middle»);
  • L: переместить курсор в конец видимой в данный момент страницы (от «low»).

Если нужно переместить не курсор, а страницу (как при прокрутке), используйте следующие команды:

  • CTRL-D: перемещение вниз (от «down»);
  • CTRL-U: перемещение вверх («up»);
  • CTRL-E: переместиться вниз на одну строку;
  • CTRL-Y: подняться на одну строку.

Можно также перемещаться по логическим блокам информации. Это полезно при вводе простого текста. Данные команды похожи на команды перемещения по словам и строкам:

  • ): перемещение к началу следующего предложения;
  • (: перемещение к началу последнего предложения;
  • }: перемещение к началу следующего абзаца (разделяются пустой строкой);
  • {: перемещение к началу последнего абзаца.

Также можно самостоятельно определять точки в файле, к которым нужно переместиться. Такие точки называются «marks», их можно разместить по файлу на свое усмотрение. Затем на такие точки можно ссылаться, переходить к ним, а также передавать их командам движения:

  • m: символ «m», за которым следует буква, создает ссылку на эту букву.

Строчные буквы являются специфическими для текущего документа, в то время как большие буквы можно использовать только один раз (для перехода к разделам в различных документах).

  • ‘: одинарная кавычка, за которой следует отмеченная буква (при помощи символа «m», как описано выше), переместит курсор в начало строки, содержащей эту отметку.
  • `: обратный штрих, за которым следует отмеченная буква, переместит курсор непосредственно к отметке.

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

Управление документами

Часто при работе с текстовым редактором появляется необходимость сослаться на несколько документов одновременно. Vim позволяет сделать это несколькими способами.

Управление буферами

Управлять несколькими файлами можно с помощью буфера. Буферы обычно представляют открытый для редактирования  файл. В целом это все, что vim открыл на данный момент и к чему он без труда может получить доступ.

Чтобы открыть несколько файлов, используйте:

vim file1 file2 file3

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

Чтобы просмотреть открытые буферы, введите:

:buffers
:buffers
1 %a  "file1"             line 1
2     "file2"             line 0
3     "file3"             line 0
Press ENTER or type command to continue

При необходимости просмотреть следующий буфер введите «:bn». Это действие выведет следующий буфер. Аналогично, можно перемещаться к буферу по его номеру (первый столбец предыдущего примера) или имени, набрав «b», за которым следует имя или номер. Это работает даже если имя файла неполное.

Ниже приведено несколько команд для управления буферами:

  • :buffers или :ls: список доступных буферов;
  • :bn: перейти к следующему буферу;
  • :bp: перейти к предыдущему буферу;
  • :bfirst: перейти к первому буферу;
  • :blast: перейти к последнему буферу;
  • :bdelete: удалить текущий буфер;
  • :badd: открыть новый буфер с указанием после команды имени файла;
  • :e: отредактировать другой файл в новом буфере и перейти к нему.

Управление окнами

Отдельный механизм управления несколькими файлами, существующий в vim – это понятие «окон», или «видов» (windows и views). Это позволяет разделить текущую область редактирования на несколько окон, чтобы можно было просматривать несколько буферов одновременно.

Чтобы разделить текущее рабочее пространство на отдельные окна, введите «:split» или «:sp». Это откроет новое окно над текущим окном и перейдет в него. Чтобы изменить буфер, показанный в новом окне, используйте команды буфера, описанные выше.

Вот несколько команд для создания и управления окнами:

  • :sp: делит текущее окно на два отдельных окна. Сначала в каждом из окон будет выведен один и тот же буфер. Указанное перед данной командой число устанавливает высоту нового окна.
  • :vs: делит текущее окно вертикально. Сначала в каждом из окон будет выведен один и тот же буфер. Указанное перед данной командой число устанавливает ширину нового окна.
  • CTRL-ww: перейти к следующему окну.
  • CTRL-w(movement): перейти к следующему окну в указанном направлении (при помощи h, j, k, l).
  • CTRL-wc: закрыть текущее окно.
  • CTRL-w+: увеличить размер текущего окна.
  • CTRL-w-: уменьшить размер текущего окна.
  • CTRL-w=: установить одинаковый размер всех окон.
  • #CTRL-w_: символ «#» перед данной командой устанавливает высоту окон.
  • :only: закрыть все окна, кроме текущего.
  • CTRL-wn: открыть новое окно с новым буфером.

Управление вкладками

Третий способ управления несколькими документами в редакторе vim – это управление при помощи вкладок. В отличие от многих других программ, в vim вкладки могут содержать окна, а не наоборот. Вкладки содержат окна, что работает как окно просмотра буферов.

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

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

  • :tabnew: открыть новую вкладку;
  • :tabclose: закрыть текущую вкладку;
  • :tabn: перейти к следующей вкладке;
  • gt: перейти к следующей вкладке;
  • :tabp: перейти к предыдущей вкладке
  • gT: перейти к предыдущей вкладке
  • :tab ball: открыть все буферы в отдельных вкладках;
  • :tabs: список всех доступных вкладок.

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

CTRL-g: показать имя текущего файла.

Команды документов

Vim имеет несколько полезных функций, связанных с видами документов.

Простой текст

Для редактирования простого текста vim имеет несколько полезных особенностей. Одной из важнейших функций является проверка орфографии.

Чтобы включить проверку орфографии в vim, наберите:

:set spell

Чтобы установить используемый язык, наберите:

:set spelllang=[language abbreviation]

Теперь в данном документе будет проверена орфография.

Под слова с ошибками появится волнистая линия.

Чтобы перейти от одного слова с ошибкой к другому, введите:

]s    # Jump to next mistake
[s    # Jump to previous mistake

Когда курсор переведен на слово с ошибкой, можно просмотреть варианты написания данного слова:

z=

Это выведет список возможных вариантов написания. Выбрать один из них можно при помощи соответствующего номера. Чтобы оставить слово без изменений, нажмите ENTER.

Чтобы пометить слово как слово без ошибки, его можно внести в список орфографии. Vim поддерживает два таких списка: постоянный и временный список, который используется для текущей сессии.

Чтобы внести слово в постоянный или временный список, используйте одну из команд соответственно:

zg    # добавить слово в постоянный словарь
zG    # добавить слово в словарь сессии

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

zug   # удалить слово из постоянного словаря
zuG   # удалить слово из словаря сессии

При частом наборе длинных слов или фраз можно использовать аббревиатуры.

Набрав «:ab», а затем аббревиатуру и ее расшифровку, vim будет выдавать ее расшифровку после каждого ввода данной аббревиатуры, за которой должен следовать пробел.

К примеру, сторонники использовать «GNU/Linux» вместо  «Linux» (по примеру Ричарда Столлмана) могут создать аббревиатуру, которая будет выполнять это автоматически:

:ab Linux GNU/Linux

Теперь при вводе «Linux» vim будет автоматически заменять его «GNU/Linux». Таким образом:

Linux is an operating system.

Изменено на:

GNU/Linux is an operating system.

Говоря о тех случаях, где будет уместно использовать просто «Linux», можно отменить замещение, набрав CTRL-V перед пробелом.  То есть:

GNU/Linux is an operating system with Linux(CTRL-V) as a kernel.

Если использовать аббревиатуру больше не нужно, ее можно удалить при помощи команды:

:una Linux

Теперь слово «Linux» не является аббревиатурой.

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

:digraphs
NU ^@  10    SH ^A   1    SX ^B   2    EX ^C   3    ET ^D   4    EQ ^E   5
AK ^F   6    BL ^G   7    BS ^H   8    HT ^I   9    LF ^@  10    VT ^K  11
FF ^L  12    CR ^M  13    SO ^N  14    SI ^O  15    DL ^P  16    D1 ^Q  17
D2 ^R  18    D3 ^S  19    D4 ^T  20    NK ^U  21    SY ^V  22    EB ^W  23
CN ^X  24    EM ^Y  25    SB ^Z  26    EC ^[  27    FS ^\  28    GS ^]  29
RS ^^  30    US ^_  31    SP     32    Nb #   35    DO $   36    At @   64

Теперь можно вставить любой символ из правого столбца, введя CTRL-k, а затем две соответствующие буквы из левого столбца.

К примеру, чтобы вставить символ британского фунта, в режиме вставки нужно набрать:

CTRL-k Pd
£

Исходный код

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

Одной из самых основных функций является выделение синтаксиса. Чтобы включить выделение синтаксиса, наберите:

:syntax on

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

:set filetype=[language]

Чтобы использовать утилиту системы с целью изменить некоторые строки в файле, вызовите ее с помощью команды «!» в обычном режиме.

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

![motion] filter

К примеру, чтобы отсортировать строки из текущей позиции до конца файла, можно ввести:

!G sort

«Sort» — это команда Linux, сортирующая входные данные, по умолчанию в алфавитном порядке.

Чтобы вставить результат команды в файл, перейдите к пустой строке, в которую нужно вставить результат. Наберите:

!!command

Это поместит результат указанной команды в документ.

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

:!command

Это покажет результат команды, но по завершении вернет неотредактированный документ.

Макросы

Часто при создании файла любого вида многие команды повторяются. К счастью, vim может сохранять группы команд в виде макросов.

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

qa    # will save macro "a"

теперь каждая введенная команда будет сохранена как часть макроса. Чтобы закончить макрос, снова введите q.

Итак, если набрать:

qa0c3wDELETED<esc>q

это запустит макрос (сохраненный как «а»), перейдите в начало строки и замените следующие 3 слова словом «DELETED».  Это выйдет из режима вставки и завершит макрос.

Чтобы воспроизвести данный макрос начиная с текущей позиции курсора, используйте символ @, а затем ссылку на макрос.

@a

Это запустит команды макроса в текущей позиции.

Чтобы создать макрос, который оканчивается в режиме ставки, нужно завершить его другим способом (нажатие клавиши «q» просто введет символ «q» в документ). Чтобы  выполнить команду обычного режима в режиме вставки, нужно ввести перед ней Ctrl-O.

Таким образом, чтобы изменить содержание первых круглых скобок данной строки, нужно создать такой макрос:

qi0f(lct)<CTRL-O>q

Это создает макрос «i». Данный макрос перемещается в начало текущей строки, затем находит открывающуюся круглую скобку и перемещается на один символ вправо. Потом он изменяет все вплоть до закрывающейся скобки. Когда vim в режиме вставки, нажмите CTRL-O, а затем q, чтобы завершить макрос, и оставьте активным режим вставки, чтобы произошла замена текста.

Итоги

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

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

Tags: