Справочник по VIM

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

СПРАВОЧНИК ПО VIM — Брам Мооленаар

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

Общие сведения о Визуальном режиме даются в разделе 04.4 Руководства Пользователя.

  1. Использование Визуального режима
  2. Переход в Визуальный режим и выход из него
  3. Изменение Визуальной области
  4. Операции над Визуальной областью
  5. Блоковые операторы
  6. Повторение
  7. Примеры
  8. Режим выделения

Vi не имеет Визуального режима. Слово «визуальный» в Vi относится к Обычному режиму, чтобы отличить его от режима Ex.
Доступно только в том случае, если Vim скомпилирован с особенностью |+visual|.

1. Использование Визуального режима

Использование Визуального режима сводится к выполнению трёх операций:

  1. Отметить начало текста при помощи «v», «V» или CTRL-V. Символ в позиции курсора является началом визуального выделения.
  2. Переместить курсор в конец визуального фрагмента. При этом текст от начала визуального выделения до конца включительно будет подсвечен.
  3. Ввести команду-оператор. Команда выполняет действия над выделенной областью.

Режим отображения подсвеченного текста в Визуальном режиме можно контролировать при помощи опции ‘highlight’.
Опция ‘virtualedit’ может использоваться для помещения курсора в позицию,  где символы отсутствуют.

Выделенный текст обычно включает символ в позиции курсора. Однако, если в качестве значения опции ‘selection’ используется слово «exclusive», а курсор помещён после Визуальной области, то символ в позиции курсора не включается в область выделения.

При переходе в Визуальный режим по команде «v», текст, расположенный до начала и после конца Визуального выделения не будет подсвечиваться. Однако, все команды-операторы, которые представляют собой символы в верхнем регистре  и неалфавитные символы, за исключением «~» и «U», будут, тем не менее, работать  с целыми строками. Список команд-операторов приводится ниже.

Текст, который выделяется по команде CTRL-V (режим Визуального Блока), имеет прямоугольную форму. Противоположные углы этого прямоугольника являются началом и концом выделения. Однако, некоторые операторы все равно будут работать над строками выделения целиком (см. ниже). Операторы замены и подстановки удаляют выделенный текст и затем производят вставку в верхнем левом углу выделения.

2. Переход в Визуальный режим и выход из него

vперейти в посимвольный Визуальный режим.
Vперейти в построчный Визуальный режим.

CTRL-V

Перейти в режим Визуального Блока.

Замечание: в системе Windows CTRL-V может быть привязана для вклейки текста. В этом случае кнопка CTRL-V не может быть использована для перехода в режим Визуального Блока. См. |CTRL-V-замена|.

Подсветка (и Визуальный Режим) прекращаются без какого-либо влияния на выделенный раннее текст при использовании <Esc>, нажатия на левую кнопку мыши либо использования любой команды, которая выполняет переход в другой буфер, а также при нажатии «v» в посимвольном Визуальном режиме, «V»  в построчном Визуальном режиме или «CTRL-V» в режиме Визуального Блока. При нажатии CTRL-Z подсветка также прекращается, а редактор переходит в режим временной остановки, либо происходит запуск оболочки — см. |CTRL-Z|.

Режим после ввода символа:
старый режим«v»«CTRL-V»«V»
ОбычныйВизуальный (симв.)Визуальный БлокВизуальный (строч.)
Визуальный (симв.)ОбычныйВизуальный БлокВизуальный (строч.)
Визуальный БлокВизуальный (симв.)ОбычныйВизуальный (строч.)
Визуальный (строч.)Визуальный (симв.)Визуальный БлокОбычный
gvПерейти в Визуальный режим, использую ту же область и тот же режим Визуального выделения, что и в последний раз. В Визуальном режиме эта команда позволяет менять текущую и предыдущую область Визуального выделения.
<LeftMouse>При нажатии устанавливается текущая позиция курсора. Если Vim находится в Визуальном режиме, то Визуальный режим прекращается. Работает только в том случае, если в значении опции ‘mouse’ указаны флаги ‘n’ или ‘a’. Если позиция курсора по отношению к последней или первой строке экрана находится в пределах, заданных значением опции ‘so’, то будет выполнена прокрутка экрана вверх или вниз соответственно.
<RightMouse>

Если редактор не находится в Визуальном режиме, то происходит переход в Визуальный режим. При этом подсвечивается текст от текущей позиции курсора до позиции щелчка правой кнопкой мыши. Если Визуальный режим уже активен, то начало или конец области выделения (в зависимости от того, что ближе к позиции щелчка) будет перемещено в позицию щелчка. Работает только в том случае, если в значении опции ‘mouse’ указаны флаги ‘n’ или ‘a’.

Замечание: если значение опции ‘mousemodel’ равно «popup», то вместо <RightMouse> следует использовать <S-LeftMouse> (щелчок левой кнопки мыши с нажатой клавишей <Shift>).

<LeftRelease>Когда вы отпускаете нажатую левую кнопку мыши, то происходит то же самое, что и при нажатии на неё, за исключением ситуации при которой мышь была смещена за время, пока удерживалась левая кнопка. В xterm область выделения не будет подсвечена до того момента, пока вы не отпустите левую кнопку мыши, если отсутствует доступ к экрану, на котором запущен xterm (что включается с помощью ключа -display или переменной окружения DISPLAY). Работает только в том случае, если в значении опции ‘mouse’ указаны флаги ‘n’ или ‘a’.

Если Визуальный режим не активен, а перед вводом команды «v», «V» или CTRL-V было указано число, то в качестве размера и типа (посимвольный, построчный, блок) области выделения используются параметры предыдущего выделения. При этом число используется следующим образом:

  • — Построчный Визуальный режим: количество строк умножается на указанное число.
  • — Режим Визуального Блока: количество строк и колонок умножается на указанное число.
  • — Обычный (посимвольный) Визуальный режим в пределах одной строки: Количество символов умножается на указанное число.
  • — Обычный (посимвольный) Визуальный режим с выделением нескольких строк: Количество строк умножается на указанное число, в последней строке используется то же самое количество символов, что и в предыдущем выделении.

Начало области выделения находится в позиции курсора. Если в предыдущем выделении была использована команда «$» для того, чтобы продлить область выделения до конца строки, то область выделения будет продлена до правой колонки самой длинной строки.

Если вам необходимо выделить ту же самую область, что и перед этим, то вы можете использовать команду «gv» |gv| |v_gv|.

CTRL-CВ Визуальном режиме: прекратить Визуальный режим. Если включён Визуальный режим в режиме Вставки (режим отображается как «— (вставка) ВИЗУАЛ. —«), то режим Вставки также будет прекращён.

3. Изменение Визуальной области

oПерейти в другой («Other») конец выделенной в Визуальном режиме области. Текущая позиция курсора становится началом выделения, а курсор перемещается в другой конец выделенного текста. При этом область выделения остаётся без изменений.
OПерейти в другой конец выделенной в Визуальном режиме области. Команда работает так же, как и команда «o», но в режиме Визуального Блока курсор перемещается в другой угол блока на той же строке. Если символ, который расположен в углу блока, занимает более одного символа на экране (например, <Tab>), то выделенная область может измениться.

Если в режиме Визуального Блока используется команда «$», то правый край выделенного текста будет определяться правой границей самой длинной строки, включённой в выделенную область. Такое поведение прекращается при использовании команды горизонтального перемещения.

Для перемещения конца выделенного блока можно использовать многие команды, за исключением команд :Ex, команд, которые вносят изменения или бросают редактирование файла. Команды, которые начинаются с символов «pPiIaAO&», а также CTRL-^, «Z», CTRL-], CTRL-T, CTRL-R, CTRL-I и CTRL-O приводят к звуковому сигналу, после которого Визуальный режим продолжается.

При переходе в другое окно, открытое для того же самого буфера, позиция курсора в окне будет изменена таким образом, чтобы область Визуального выделения сохранялась. Это свойство особенно полезно в тех случаях, когда необходимо посмотреть начало Визуальной области в одном окне, а конец этой области — в другом. Для дальнейшего перемещения краёв области выделения можно использовать <RightMouse> (правую кнопку мыши) (или <S-LeftMouse>, <Shift> с левой кнопкой мыши, если значением опции ‘mousemodel’ является строка «popup»).

4. Операции над Визуальной областью

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

~изменить регистр символов
dудаление
cизменение (4)
yкопирование
>сместить вправо (4)
<сместить влево (4)
!пропустить через внешнюю программу-фильтр (1)
=пропустить через программу-фильтр, указанную в значении опции ‘equalprg’ (1)
gqформатировать строки по ширине, указанной  в значении опции ‘textwidth’ (1)

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

awслово (с пробелом)
iwвнутреннее слово
aWСЛОВО (с пробелом)
iWвнутреннее СЛОВО
asпредложение (с пробелом)
isвнутреннее предложение
apабзац (с пробелом)
ipвнутренний абзац
abблок в () (вместе со скобками)
ibвнутренний блок в ()
aBблок в {} (вместе с фигурными скобками)
iBвнутренний блок в {}
a<блок в <> (вместе с <>)
i<внутренний блок в <>
a[блок в [] (вместе с [])
i[внутренний блок в []

Кроме того, можно использовать следующие команды:

:выполнить команду ex для выделенных строк (1) |v_:|
rизменить (4) |v_r|
sизменить |v_s|
Cизменить (2)(4) |v_C|
Sизменить (2) |v_S|
Rизменить (2) |v_R|
xудалить |v_x|
Dудалить (3) |v_D|
Xудалить (2) |v_X|
Yскопировать (2) |v_Y|
pвклеить |v_p|
Jсклеить (1) |v_J|
Uперевести символы в верхний регистр |v_U|
uперевести символы в нижний регистр |v_u|
^]найти метку |v_CTRL-]|
Iвставить блок |v_b_I|
Aдобавить блок |v_b_A|

(1): Используются целые строки, независимо от типа Визуального выделения. См. также |:-визуальный_режим-пример|.
(2): Используются целые строки, кроме режима Визуального Блока CTRL-V.
(3): Используются целые строки, кроме режима Визуального Блока CTRL-V; при использовании CTRL-V удаление происходит вплоть до конца строки.
(4): При использовании CTRL-V, операция производится только над выделенным блоком.

Обратите внимание, что для организации привязок кнопок в Визуальном режиме существует специальная команда «:vmap:. Например, если вы хотите, чтобы команда «/» вместо расширения Визуальной области выполняла поиск выделенного текста, используйте

:vmap / y/<C-R>"<CR>

(Используется соглашение |<>|, при котором набор происходит буквально; вам может потребоваться убрать флаги ‘B’ и ‘<‘ из значения опции ‘cpoptions’).

Если вам необходимо указать имя регистра с помощью команды «»», то это следует делать непосредственно перед командой-оператором: «v{необходимые-перемещения}»xd».

Если вам необходимо передать команде-оператору параметр-число, то это также следует делать непосредственно перед вводом команды-оператора: «v{необходимые-перемещения}3>» (для смещения строк на три отступа вправо).

Здесь {необходимые-перемещения} указывают на любую последовательность команд перемещения. Обратите внимание, что это отличается от параметра {перемещение}, который подразумевает только ОДНУ команду перемещения.

5. Блоковые операторы

Доступно только в том случае, если Vim скомпилирован с особенностью |+visualextra|.

Не забывайте о том, что при помощи опции ‘virtualedit’ можно выделять блоки, которые начинаются или заканчиваются в середине символа табуляции или после конца строки.

Вставка Визуального Блока

В режиме выделения Визуального Блока, команда I{строка}<ESC> производит вставку указанной {строки} в начале блока в каждой строке блока, если при этом строка затронута выделением блока. Иными словами, короткие строки не будут затронуты этой командой. Символы табуляции <Tab> могут быть по необходимости заменены пробелами в количестве, необходимом для сохранения колонок на экране. См. |v_b_I-пример|.

Добавление к Визуальному Блоку

В режиме выделения Визуального Блока, команда A{строка}<ESC> добавляет указанную {строку} в конец каждой строки блока. Поведение этой команды может отличаться, если правый край блока не является прямым:

  1. Блок был создан по команде <C-v>$. Указанная строка добавляется к концу каждой строки блока.
  2. Блок был создан по команде <C-v>{необходимые-перемещения}.  Указанная строка добавляется в конец каждой строки блока, при этом по необходимости вставляется требуемое для выравнивания правого края блока количество пробелов.

См. |v_b_A-пример|.

Замечание: как вы заметили, команды «I» и «A» по разному ведут себя на тех строках, которые не входят в блоковое выделения из-за своей короткой длины. Это было сделано специально, чтобы вы могли выбрать наиболее подходящее для каждого конкретного случая решение.

Изменение в Визуальном Блоке

Весь выделенный Визуальным Блоком текст заменяется на указанную строку. При использовании «c» выделенный текст удаляется и редактор переходит в режим Вставки. После этого вы можете ввести текст (без переноса строки) и нажать <Esc>. Введённый текст будет вставлен на всех раннее выделенных строках.

Изменения в Визуальном блоке с помощью команды «C»

Команда «C» работает так же, как и «c», но область выделения перед заменой
будет расширена до конца всех выделенных строк.

Сдвиг строк в Визуальном Блоке

Выделенный Блок сдвигается на величину опции ‘shiftwidth’. Правый край блока не имеет значения. Левый край блока определяет точку, с которой начинается сдвиг вправо, причём пробелы и символы табуляции вставляются оптимально, исходя из значений опций ‘ts’ и ‘et’. При сдвиге влево левый край Визуального Блока определяет левую границу, к которой должны быть сдвинуты строки.

Замечание: при выполнении v_< возможны проблемы, если Визуальный Блок начинается и заканчивается в одной и той же позиции табуляции (Vim 5.4c).

См. |v_b_>-пример|.
См. |v_b_<-пример|.

Замена в Визуальном Блоке

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

См. |v_b_r-пример|.

6. Повторение

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

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

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

7. Примеры

Команда «:» работает пока только на целых строках. При выделении части строки выполнение команды вроде «:!date» приведёт к замене всей строки целиком. Если вы желаете заменить только часть строки, то вам потребуется организовать соответствующую привязку. В будущих версиях команда «:» возможно будет работать и с выделениями, затрагивающими часть строки.

Пример замены выделенного текста выводом команды «date»:

:vmap _a <Esc>`>a<CR><Esc>`<i<CR><Esc>!!date<CR>kJJ

(Используется соглашение |<>|, при котором набор происходит буквально; вам может потребоваться убрать флаги ‘B’ и ‘<‘ из значения опции ‘cpoptions’.)

Что при этом происходит:

<Esc>Прекращается Визуальный режим
`>Происходит переход в конец выделенной в Визуальном режиме области
a<CR><Esc>Строка после области, выделенной в Визуальном режиме, разбивается на две
`<Переход в начало выделенной в Визуальном режиме области
i<CR><Esc>Строка перед областью визуального выделения разбивается на две.
!!date<CR>Текст, выделенный в визуальном режиме, пропускается через команду-фильтр date
kJJСтроки склеиваются в первоначальное состояние

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

:vmap X y/<C-R>"<CR>

(Используется соглашение |<>|, при котором набор происходит буквально; вам может потребоваться убрать флаги ‘B’ и ‘<‘ из значения опции ‘cpoptions’.)

Обратите внимание, что специальные символы, такие как ‘.’ и ‘*’, при этом могут вызывать очевидные проблемы.

Примеры работы с Визуальным Блоком

В нижеследующем тексте будут отмечаться команды, которые производят блоковое выделение и результат, который показан ниже команды. Во всех случаях курсор в начале выделения расположен на символе ‘a’ в первой строке исходного текста. При этом подразумеваются следующие настройки режимной строки: «:ts=8:sw=4:».

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

:set hls
/<TAB>

где <TAB> является реальным символом TAB. Это помогает сделать операции более наглядными.

Исходный текст:

abcdefghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdef ghi jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

1. fo<C-v>3jIСТРОКА<ESC>

abcdefghijklmnСТРОКАopqrstuvwxyz
abc СТРОКА defghijklmnopqrstuvwxyz
abcdef ghi СТРОКА jklmnopqrstuvwxyz
abcdefghijklmnСТРОКАopqrstuvwxyz

2. fo<C-v>3j$AСТРОКА<ESC>

abcdefghijklmnopqrstuvwxyzСТРОКА
abc defghijklmnopqrstuvwxyzСТРОКА
abcdef ghi jklmnopqrstuvwxyzСТРОКА
abcdefghijklmnopqrstuvwxyzСТРОКА

3. fo<C-v>3j3l<..

abcdefghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdef ghi jklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

4. fo<C-v>3j>..


abcdefghijklmn opqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdef ghi jklmnopqrstuvwxyz
abcdefghijklmn opqrstuvwxyz

5. fo<C-v>5l3jrX

abcdefghijklmnXXXXXXuvwxyz
abc XXXXXXhijklmnopqrstuvwxyz
abcdef ghi XXXXXX jklmnopqrstuvwxyz
abcdefghijklmnXXXXXXuvwxyz

8. Режим выделения

Режим выделения внешне выглядит так же, как и Визуальный режим, но при этом в нём используются несколько иные команды. Режим выделения больше всего напоминает обычный режим выделения текста, который используется в Microsoft Windows. Если включена опция ‘showmode’, то в последней строке появляется надпись «— ВЫДЕЛЕНИЕ —«.

Переход в режим выделения:

  • Выделение области с помощью мыши, если в значении опции ‘selectmode’ указана строка «mouse». Значение опции ‘mouse’ должно содержать флаг, соответствующий текущему режиму.
  • Использование непечатной команды перемещения с клавишей <Shift>, если в значении опции ‘selectmode’ указана строка «key». Например, с помощью кнопок <S-Left> и <S-End>. Кроме того, значение опции ‘keymodel’ должно содержать строку «startsel».
  • При помощи команд «v», «V» и CTRL-V, если значение опции ‘selectmode’ содержит строку «cmd».
  • При помощи команд «gh», «gH» и «g_CTRL-H» в Обычном режиме.
  • Для перехода от Визуального режима к режиму Выделения можно ввести команду CTRL-G.

Команды, доступные в режиме выделения:

  • Ввод печатных символов, <NL> и <CR> приводит к удалению выделенного фрагмента и переходу в режим Вставки. Введённые символы вставляются в текст.
  • Непечатные команды перемещения, которые вводятся с кнопкой <Shift>, расширяют область выделения. При этом опция ‘keymodel’ должна содержать строку «startsel».
  • Непечатные команды перемещения, которые вводятся БЕЗ кнопки <Shift> прекращают режим выделения. При этом опция ‘keymodel’ должна содержать строку «startsel».
  • ESC прекращает режим выделения.
  • CTRL-O позволяет перейти в Визуальный режим на время действия одной команды.
  • CTRL-G переключает редактор в Визуальный режим.

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

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

Привязки и меню в режиме выделения

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

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

При вводе символа, который приводит к удалению выделения и переходу в режим Вставки, этот символ может быть использован для запуска соответствующей команды-привязки. На практике это означает, что привязки режима Вставки также применимы к режиму выделения. То же самое относится и к языковым привязкам.

gVКоманда позволяет избежать автоматического повторного выделения Визуальной области после прекращения выполнения привязки или меню режима выделения. Эти символы следует вводить в самом конце привязки или меню, или, по крайней мере, после операций, совершаемых над выделенной областью.
ghПереход в посимвольный режим выделения. Команда работает так же, как и «v», но вместо Визуального режима редактор переходит в режим выделения. Мнемоника этой команды связана с английским языком: «get highlighted», т.е. «подсветить».
gHПереход в построчный режим выделения. Команда работает так же, как и «V», но вместо Визуального режима редактор переходит в режим выделения. Мнемоника этой команды связана с английским языком: «get Highlighted», т.е. «подсветить».
g CTRL-HПереход в блоковый режим выделения. Команда работает так же, как и CTRL-V, но вместо режима Визуального Блока редактор переходит в режим выделения. Мнемоника этой команды связана с английским языком: «get Highlighted», т.е. «подсветить».