Поговорим о вставке текста в Вим извне: из системного буфера обмена. Самое обычное дело, скопировать текст из браузера или другой программы и вставить в документ в Виме. Но не возникнут ли проблемы?
Могут. Если у вас есть аббревиатуры, например. Или привязки. А еще Вим может расставлять отступы и вы получите "лестницу": не смертельно, но зачем? Да и еще проблемы возможны: Вим может переносить строки и совершать прочее форматирование, что способно исказить вставляемый текст до неузнаваемости. А Вим же не в курсе, откуда приходят символы: с клавиатуры или это система их присылает. Терминал просто сообщает, какой символ введен.
Чтобы всего избежать, выставьте перед вставкой флаг 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, но я так и не понял, как они работают)) Разберусь если — напишу.
Удачи, коллеги.