Известно време се бях поотчаял какви проблеми могат да настъпят при опитите ми просто да копирам нещо от външния свят във vim. Пример:
От firefox се опитвам да копирам (със selection буфера в UNIX (да, този със средния бутон на мишката), или нормалния C-V). Vim обаче се прави на ударен. Не ще да paste-не. Обратното също е дразнещо.
Няма начин vim да не поддържа copy-paste с външния свят? Разбира се, че поддържа!
Регистри
И така vim предоставя така наречените регистри, които са нещо като именувани clipboards. Тоест vim има поддръжка за повече от един буфер! Можете да си ги кръщавате с букви. Например да имате a,b,c,d и да кажете на vim: copy това в a, paste тук от b, copy онова в c, paste там от c.
Регистрите са достъпни със следната комбинация в нормален режим. r е име на регистър.
"ry (copy в регистъра r)
"rp (paste от регистъра r)
Или поне това е употребата, за която знам – достатъчно важна сама по себе си.
И така, сочната част. Има два специални регистъра * и +. * отговаря на буфера, свързан обикновено със средния бутон на мишката, а + отговаря за другия (C-V). Прочетох някъде, под Windows буферите * и + не се различават.
И така, малко примери! Може да замените * със + за алтернативните буфери, разбира се.
-
"*y
- Аналог на y (yank) – само по себе си не копира, очаква движение (motion, например с G копира всичко от текущата позиция до края на файла). Виж документацията за yank (:help yank) за подробности.
Освен с движение може да се ползва и с visual selection. Натиска се v (или V за маркиране по цели редове), след като направите селекцията, натискате
"*y
и тя е в буфера. Отивате във firefox и натискате средния бутон в някое текстово поле и готово!
-
"*p
- Аналог на p.
Ама мързи ме да ги натискам тея “*, бе!
Най-лесното решение
Най простото решение е във ~/.vimrc да се сложи:
set clipboard=unnamed
Това кара vim да използва по подразбиране буфера, свързан със средния бутон под UNIX (под Windows със clipboard-a)
Другото решение
Във моя ~/.vimrc имам следното:
map . "*y
map , "*p
Редакция: Ето един добър повод да науча какво прави . във vim (срам е, че не съм го знаел, това си е основно). Както и да е, вече не ползвам . и , за copy-paste в регистри. Но може да се map-нат към други клавиши.
Разбира се, това е освен, ако не ползвате стандартните bindings на тези бутони, а именно:
, reverse direction of last "f", "F", "t", or "T" command
. repeat last text-changing command
Сега ползвам . за копиране на визуална селекция (за UNIX: в буфера, свързан със средния бутон – за другия буфер заменете * с +).
Забележка: ако искам да копирам цял ред например не натискам
..
както бих направил с
yy
, а вместо това:
.y Копира целия ред
.w Копира до края на думата
gg.G копира целия файл (gg движи до началото на файла, G до края му)
Въобще, като цяло
.{motion} Копира според движението (виж :help motion за подробности)
Друг вариант за ~/.vimrc е вместо . и , да се ползват каквито ви е удобно бутони (като се внимава за конфликт).