Найти тему
Блокнот математика

Рубрика "Секреты Вим". Вставка из системного буфера

Поговорим о вставке текста в Вим извне: из системного буфера обмена. Самое обычное дело, скопировать текст из браузера или другой программы и вставить в документ в Виме. Но не возникнут ли проблемы?

Могут. Если у вас есть аббревиатуры, например. Или привязки. А еще Вим может расставлять отступы и вы получите "лестницу": не смертельно, но зачем? Да и еще проблемы возможны: Вим может переносить строки и совершать прочее форматирование, что способно исказить вставляемый текст до неузнаваемости. А Вим же не в курсе, откуда приходят символы: с клавиатуры или это система их присылает. Терминал просто сообщает, какой символ введен.

Интересно, что Ctrl+Ins и Shift+Ins, которым меня учили когда-то и которые до сих пор работают, нынешняя молодежь не знает))
Интересно, что Ctrl+Ins и Shift+Ins, которым меня учили когда-то и которые до сих пор работают, нынешняя молодежь не знает))

Чтобы всего избежать, выставьте перед вставкой флаг paste:

:set paste

При этом все вышеперечисленное будет выключено. Потом включите обратно:

:set nopaste

Можно переключать режим, как обычно:

:set paste!

Но тут есть один нюанс. Если вы повесите эту команду на горячую клавишу, то это сработает только в одну сторону: на включение режима paste. А в нем все привязки аннулированы, так что в обратную сторону переключение не сработает.

Неужели нельзя выходить из этого режима по горячей клавише? Можно. Для этого есть особая переменная pastetoggle. Она содержит символ, который меняет флаг paste, в точности как команда :paste! Например,

:set pastotoggle <F9>

или

:set pastetoggle Q

или даже

:set pastetoggle zz

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

Если вставляете часто, задайте pastetoggle, и эта клавиша будет работать в обе стороны.

Еще одно замечание. Вставка (из системного буфера) должна быть в режиме вставки, а не в обычном режиме. Понятно, почему? Потому что в обычном режиме этот текст будет трактоваться как команды Вим, что может иметь неприятные последствия. Впрочем, отмена вас всегда спасет.

Кроме того, надо отключать языковую раскладку (переходить на латнскую), иначе все запятые заменятся на "б", а точки на "ю". Это если вы русский текст вставляете; если там латиница, Вим старательно заменит буквы на русские согласно таблице преобразования, и результат вам не понравится. Но всё можно отменить!

Еще один нюанс, связанный со вставкой, на сей раз обычной, вимовской, через p. Вставляемый текст не снабжается отступами, как текст набираемый (или вставляемый извне, кстати). И порой хотелось бы, чтоб снабжался.

В книге К. Шульца "Hacking Vim" приводится такая команда (которую можно повесить на клавишу, даже на ту же p):

p=`]

Здесь использованы специальные метки, а именно ], которая помечает последнюю строку вставленного или измененного текста. И команда выравнивания =.

Можно выполнить такие привязки:

:nnoremap p p=`]
:nnoremap <c-p> p

При это ctrl+p будет работать как p, а p будет вставлять с выравниванием. И ненужной рекурсии не возникнет.

Есть еще регистры *, + и ~, связанные с системным регистром и drag&drop, но я так и не понял, как они работают)) Разберусь если — напишу.

Удачи, коллеги.

Оглавление рубрики

Путеводитель по каналу

Наука
7 млн интересуются