Skip navigation

Category Archives: vim

In VIM I use this to find out the number of lines containing a pattern:

:!egrep pattern % | wc -l

For example, to count the lines ending with a 6.

:!egrep '6$' % | wc -l

Deleting all empty lines:

:g//d

Deleting all commented lines (with a // comment) – looks crazy:

:g/\/\//d

Uncommenting all lines in a file.
Actually I use a comments plugin for that, so visual selection + CTRL-R would be my pick, but this is another way to do it, and a general way to delete a certain part in the beginning of a(ll) line(s). This looks even crazier:

:%s/\/\/\(.\+\)/\1

Известно време се бях поотчаял какви проблеми могат да настъпят при опитите ми просто да копирам нещо от външния свят във 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.

Ама мързи ме да ги натискам тея “*, бе!

И двете решения не се справят с проблема при изпълняване на vim като su. Дори да направите symlink-ове към конфигурационните файл и директория, изпълняван през su, vim пак няма да има достъп до буферите на X11.

Най-лесното решение

Най простото решение е във ~/.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 е вместо . и , да се ползват каквито ви е удобно бутони (като се внимава за конфликт).

Follow

Get every new post delivered to your Inbox.