Pull to refresh

Vim magic — Регистры

Reading time4 min
Views16K
Про регистры в Vim уже писали в предыдущих постах, но я решил собрать инфу воедино и немного дополнить. Прочитав эту статью, вы станете настоящими мастерами копи-пастинга (в хорошем смысле этого слова) :)

Сложно представить себе работу в редакторе без использования операций скопировать/вырезать/вставить. Vim предоставляет очень мощные средства, для этого. Итак, регистры — это то, куда Vim складывает те куски текста, которые вы копируете с помощью y или удаляете с помощью c или d, но не только. Есть ещё несколько специальных регистров, куда Vim помещает, например, текст, который вы искали с помощью / или текст, который вы drag-n-dropнули в окно редактора. Чтобы указать, что вы хотите скопировать или удалить текст в определенный регистр, нужно указать его имя перед командой. Например, «ayy скопирует строку целиком в регистр »a. Но не во все регистры можно писать, некоторые из них только для чтения (и даже есть один только для записи).

Ещё немного особой, Vimовской магии, связанной с регистрами, для затравки, чтобы было не лень дочитать до конца:
— Vim хранит небольшую историю удалений, так что вы можете вставить удалённый ранее текст, даже если после этого вы удаляли или копировали другой текст.
— Vim предоставляет вам 26 именованных «буфера обмена», в которые можно надолго складывать текст и он не будет потерян при операциях копирования или удаления.
— Vim может копировать или удалять текст, не затирая содержимое регистра, а дополняя его.

В Vim есть следующие типы регистров:

1. Безымянный регистр "". Эдакий «регистр по умолчанию». Сюда помещается текст, если вы при копировании или удалении не указали регистр. Однако, даже если вы явно копируете текст в регистр «a с помощью »ayy, текст всё равно появится и в "". Исключение составляет только специальный регистр "_, о котором ниже. При использовании этого регистра содержимое "" не меняется.

2. Нумерованные регистры «0 — »9.
Регистр «0 содержит последний текст, который был скопирован (y) без указания регистра. То есть обычный yank поместит текст в регистры »" и «0, а »my изменит содержимое регистров "" и «m, но оставит прежним содержимое »0.
Регистр «1 содержит последний удалённый текст, при условии, что при удалении не был указан регистр и текст содержит хотя бы одну полную строку (иначе вместо »1 используется специальный регистр "-). Регистр «1 всё же используется, если удаление было сделано с применением команд перемещения %, (, ), `, /, ?, n, N, { и }. При каждом последующем удалении текста старое содержимое регистра »1 помещается в регистр «2, содержимое »2 при этом оказывается в «3 и так далее, содержимое регистра »9 теряется, замещаясь содержимым регистра «8 до удаления.

3. Регистр »- содержит удалённый текст, если его было меньше, чем одна строка и при удалении явно не был указан регистр.

4. Именованные регистры «a — »z или «A — »Z. Если вам нужно часто вставлять один и тот же текст и вы не хотите, чтобы операции копирования или удаления затирали его, используйте именованные регистры «a — »z.
Также, именованные регистры могут использоваться для того, чтобы «накапливать» удалённый или копируемый текст. Для этого используйте регистры «A — »Z.

5. Регистры только для чтения ":, "., "% и "#
": содержит последнее содержимое командной строки.
". содержит последний вставленный текст (этот текст можно также вставить в режиме вставки с помощью Ctrl+A)
"% содержит имя текущего файла
"# содержит имя альтернативного файла (файла, который редактировался перед текущим)

6. Регистр выражений "=. Особый магический регистр, используется не для того, чтобы хранить текст, а чтобы вставлять результаты вычислений выражений. Например в режиме вставки вы можете набрать Ctrl+R=5+5*5, нажать Enter и в текст вставится 30. Выражения могут быть и намного более сложными, использовать значения регистров, переменных или опций Vimа. Подробнее в :help expression.

7. Регистры для выделений и drag-n-dropа "*, "+ и "~.
Регистры "* и "+ используются для общения с внешним миром. Под Win например содержимое этих регистров совпадает с содержимым буфера обмена Windows. То есть, для того, чтобы скопировать текст из Vim в другое приложение, вы копируете (или вырезаете) текст в регистр "* и потом вставляете его куда нужно. Чтобы скопировать текст из внешнего приложения в Vim вы копируете текст во внешнем приложении и вставляете его в Vim из регистра "*. Различие между регистрами "* и "+ есть только в X11. Они подробно описаны в :help x11-selection.
Регистр только для чтения "~ содержит текст, который был перетащен в окно Vim.

8. Регистр «чёрная дыра» "_. Это регистр только для записи. Используется он для того, чтобы при удалении не изменить содержимое регистра по умолчанию "" и цифровых регистров «1 — »9. При вставке из этого регистра ничего не происходит.

9. Регистр последнего поиска "/. В нем хранится выражение, которое было использовано при последнем поиске. Содержимое используется также командами n и N, а также для подсветки текста при включенной опции 'hlsearch'.

Для того, чтобы посмотреть содержимое регистров, воспользуйтесь командой :reg. :reg без параметров покажет содержимое всех регистров. Для того, чтобы посмотреть только содержимое регистров «3 и »f напишите :reg 3f.

Ну и напоследок. Вы можете изменять содержимое регистров при помощи команды :let. Для того, чтобы записать, например, в регистр "/ напишите :let @/ = «the». Или например, чтобы поместить в системный буфер обмена содержимое регистра m, в который вы перед этим «накопили» кучу полезного текста («My), можно написать :let @*=@m.

Happy Vimming!
Tags:
Hubs:
+1
Comments14

Articles