В Vim есть способ удалить без внесения текста в реестр? - PullRequest
449 голосов
/ 10 сентября 2008

Используя Vim, я часто хочу заменить блок кода блоком, который я только что дернул.

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

Так какой же самый простой и быстрый способ заменить текст в Vim?

  • есть ли способ удалить текст без внесения его в реестр?
  • есть ли способ сказать, например, «заменить следующее слово» или «заменить до следующего абзаца»
  • или это лучший способ как-нибудь использовать функцию мультирегистрации?

Ответы [ 21 ]

411 голосов
/ 10 сентября 2008

Чтобы удалить что-то без сохранения в реестре, вы можете использовать «регистр черной дыры»:

"_d

Конечно, вы также можете использовать любые другие регистры, в которых нет ничего интересного.

100 голосов
/ 12 сентября 2008

Да. Это немного сложнее, чем сначала удалить «старый» текст, но:

Я начинаю с ..

line1
line2
line3
line4

old1
old2
old3
old4

I shift + v , выберите строку 1, строку 2, 3 и 4 и удалите их командой d

Затем я удаляю старые 1-4 строки таким же образом.

Затем сделайте

"2p

Это вставит вторую последнюю строчку (строки 1-4). "3p выполнит третий с последнего и т. Д.

Итак, я получаю

line1
line2
line3
line4

Справка: Vim документация по нумерованному регистру

71 голосов
/ 04 февраля 2009

VIM документы: Нумерованный регистр 0 содержит текст самой последней команды yank, если в команде не указан другой регистр с ["x].

например. мы дергаем "foo" и удаляем "bar" - реестр 0 по-прежнему содержит "foo"! Следовательно, «foo» может быть вставлен с помощью "0p

52 голосов
/ 28 мая 2009

Удобно иметь простое сопоставление, которое позволяет заменить текущий выбор буфером.

Например, когда вы кладете это в ваш .vimrc

vmap r "_dP       // it's a capital 'p' on the end

затем, после копирования чего-либо в регистр (то есть с 'y'), вы можете просто выбрать текст, который вы хотите заменить, и просто нажать 'r' на клавиатуре. Выбор будет заменен вашим текущим регистром.

Пояснение:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste
34 голосов
/ 18 августа 2009

Я поместил в свой vimrc следующее:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

Теперь я возвращаюсь к регистру буфера обмена и помещаю его, и мне не нужно заботиться о том, что происходит с регистром по умолчанию. Дополнительным преимуществом является то, что я могу вставлять из других приложений с минимальными хлопотами. Я знаю, что теряю некоторые функции, но все равно не могу отслеживать более одного регистра / буфера обмена.

23 голосов
/ 10 сентября 2008

Для конкретного примера, который вы привели, если я понимаю вопрос, это может сработать:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)
21 голосов
/ 05 октября 2015

По умолчанию все операции удаления и удаления записываются в безымянный регистр. Тем не менее, самые последние янки и самые последние удаления всегда сохраняются (отдельно) в пронумерованных регистрах. В регистре 0 хранится самый последний янк. Регистры 1-9 содержат 9 самых последних удалений (при этом 1 является самым последним).

Другими словами, при удалении перезаписывается самый последний янк в безымянном регистре, но он все еще там в регистре 0. Уловка черного регистра ("_dd), упомянутая в другом ответы работают, потому что они предотвращают перезапись безымянного регистра, но это не обязательно.

Вы ссылаетесь на регистр, используя двойные кавычки, поэтому вставка последнего набранного текста может быть выполнена следующим образом:

"0p

Это отличная ссылка:

16 голосов
/ 01 апреля 2010

Чтобы подчеркнуть то, что EBGreen сказал :

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

Если вы хотите скопировать текст, а затем вставить его в нескольких местах, используйте "0p для вставки. Нумерованный регистр 0 содержит текст самой последней команды yank.


Кроме того, вы можете перечислить содержимое всех ваших регистров:

:registers

Эта команда облегчает определение того, какой регистр вы хотите, когда делаете что-то вроде ответа dbr . Вы также увидите регистры /,%, #. (См. Также :help registers)


И, наконец, отметьте cW и cW, чтобы изменить слово, включая и не включая завершающий пробел. (Использование заглавной буквы W включает знаки препинания.)

10 голосов
/ 12 сентября 2008

Для «заменить слово» попробуйте cw в обычном режиме.

Для «замены абзаца» попробуйте cap в обычном режиме.

10 голосов
/ 10 сентября 2008

Если вы используете Vim, то у вас будет визуальный режим, который подобен выбору, но с разделением режимов, который лежит в основе vi / vim.

Что вы хотите сделать, это использовать визуальный режим, чтобы выбрать источник, затем нажать, затем снова использовать визуальный режим, чтобы выбрать область назначения, а затем вставить текст в буфер по умолчанию.

Пример:

В текстовом файле с:

1| qwer
2| asdf
3| zxcv
4| poiu

со следующей последовательностью: ggVjyGVkp вы закончите с:

1| qwer
2| asdf
3| qewr
4| asdf

Разъяснения:

  • gg: перейти к первой строке
  • V: запуск визуального режима с целыми строками
  • j: перейти на одну строку вниз (при выборе, начатом на предыдущих строках, это увеличивает выделение на одну строку вниз)
  • y: возврат в буфер по умолчанию (две выбранные строки, и он автоматически выходит из визуального режима)
  • G: перейти к последней строке
  • V: запуск визуального режима (аналогично предыдущему)
  • k: перейти на одну строку вверх (как и раньше, при включенном визуальном режиме это увеличивает выделение на одну строку вверх)
  • p: вставка (с выделением на двух последних строках он заменит эти строки тем, что есть в буфере - в этом случае 2 первые строки)

Это немного неудобно, так как последний блок помещается в буфер, поэтому он как-то нежелателен для повторных вставок одной и той же вещи, поэтому вы захотите сохранить источник в именованном буфере с чем-то вроде "ay ( в буфер с именем "a") и вставьте что-то вроде "ap (но тогда, если вы программируете, вы, вероятно, не захотите вставлять несколько раз, а создать функцию и вызывать ее, верно? RIGHT ?).

Если вы используете только vi, тогда вам придется использовать невидимые метки вместо визуального режима, :he mark, чтобы узнать больше об этом, извините, но я не очень хорош с этой штукой невидимых меток, я довольно загрязнен визуальным режимом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...