2008-09-10 3 views
398

Можно создать дубликат:
Any way to delete in vim without overwriting your last yank?В Vim есть способ удалить, не помещая текст в регистр?

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

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

Итак, какой самый гладкий и быстрый способ заменить текст в Vim?

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

vim-easyclip (http://www.github.com/svermeulen/vim-easyclip) предназначен для решения этой проблемы – 2015-02-03 19:50:51

+1

Я спросил [вопрос, неосознанно (в то время) дубликат вашей фактической проблемы] (http: //stackoverflow.com/questions/25037482/replace-word-with-whats-ready-to-put-in-vi-vim), но не столько вопрос заголовка. TL; DR - замените то, что вы дернули, используя `viwp` (для` w`ord). – OJFord 2015-02-04 17:20:14

ответ

378

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

"_d 

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

+3

Сначала я думал, что эта команда не работает должным образом. Затем я понял, что использую «мертвый ключи "версии американской клавиатуры. С этой раскладкой клавиатуры я должен ввести` _d`. Пространство необходимо, чтобы на самом деле ввести «.» – 2012-03-12 00:01:27

+4

Любые идеи по этому выбору выборочно на только пустые строки? (Если я `dd` на пустой строке, он попадает в черную дыру, иначе это` dd`s, как обычно). – 2013-03-05 23:28:47

+0

ответ изменил мою жизнь, спасибо, спасибо, спасибо, спасибо. :-) – lzap 2013-03-19 09:19:00

7

Ну, сначала сделать эту команду:

:h d 

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

+0

`[" x] d {motion} Удалить текст, который {движение} перемещается по [в регистр x] `- Vim`: hd` – 2015-09-07 15:12:14

25

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

*Highlight what you want to put somewhere else 
*delete (d) 
*Highlight the code that you want it to replace 
*paste (p) 
+3

Этот ответ должен иметь больше оборотов. Я использую этот трюк все время и редко нуждаюсь в каких-либо – 2012-09-09 17:05:05

+4

Это хорошо работает, за исключением случаев, когда вы хотите вставить несколько вариантов. – 2013-08-08 22:11:43

9

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

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

Пример:

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

 
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: вставить (с выбором на две последние строки он заменит эти строки тем, что есть в буфер - две первые строки в этом случае)

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

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

+0

Upvote для жирного шрифта :) – cxw 2017-03-13 16:57:21

4

Текст, удаленный, в режиме вставки, не входит в регистр по умолчанию.

10

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

Для «заменить пункт», попробуйте cap в нормальном режиме.

96

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

Я начинаю с ..

line1 
line2 
line3 
line4 

old1 
old2 
old3 
old4 

Я сдвиг + V выбрать line1, строка 2, 3 и 4, и удалить их с д команды

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

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

"2p 

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

Так что я в конечном итоге с

line1 
line2 
line3 
line4 

Reference: Vim documentation on numbered register

2

В версии окон (вероятно, в Linux также), вы можете заглянуть в буфер копирования/вставки системы, используя "*y (т.е. перед вашей командой yank с двойными кавычками и звездочкой).

Вы можете удалить обычные сменные строки и вставить скопированный текст с помощью "*p.

60

ВЬЮТ документы: Нумерованных регистр 0 содержит текст из последней команды копирования, , если команда не указана другой регистр с [Foo „и удалить„строку“" х]

Например, мы дергать.“ - реестр 0 все еще содержит «Foo» Следовательно, «Foo» может быть вставлен с помощью "0p

50

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

Например, когда вы кладете это!. в вашем .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 
31

я поставил следующий в моем 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 

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

2

Я часто ошибаюсь, следуя командам «y'ank then» «_d'elete в черную дыру, а затем« p'aste ». Я предпочитаю« y'ank », а затем удалять, как мне нравится, «0p» из регистра 0, в который помещается последний скопированный текст.

14

Чтобы подчеркнуть, что EBGreen said:

При вставке при выборе текста, выбранный текст заменен с вставленным текстом.

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


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

:registers 

Эта команда делает его легче понять, что вы хотите зарегистрировать, когда делаете что-то вроде dbr's answer. Вы также увидите регистры /,%, #. (Смотрите также :help registers)


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

3

Два решения, которые я использую в соответствующих контекстах;

  • выделите, что вы хотите заменить, используя режим Vims VISUAL, после чего вставьте регистр.

Я использую это в основном по привычке, как я только нашел второе решение гораздо позже, например

yiw " yank the whole word 
viwp " replace any word with the default register 
  • YankRing. С помощью этого плагина вы можете использовать привязку клавиш <ctrl>+<p>, чтобы заменить предыдущий нумерованный регистр тем, который вы только что вставили.

В основном вы идете о склеивании, как вы бы, но когда вы понимаете, что у вас есть, так как переписан регистр по умолчанию, таким образом потерять то, что вы на самом деле хотели, чтобы вставить вы можете <C-P> найти и заменить из истории YankRing!

Один из них должен иметь плагин ...

0

Для пользователей Дворжак, один очень удобный способ, чтобы просто удалить ненужный текст в «1 регистр вместо» _ черной дыры регистра, если только потому, что вы можете нажмите «+ 1» с тем же сдвижным нажатием и быстрым мизинцем, так как 1 - это клавиша сразу над «в Дворжаке» (PLUS d находится в другой руке, что делает всю команду быстрой, как ад).

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

1

я нашел очень полезное отображение для вашей цели:

xnoremap p "_dP 

Удаленного текст помещается в «черной дыре реестре», и скопированный текст остается.

Источник: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

8

Минимальное инвазивное решение для ленивых:

Регистрация 0 всегда содержит последний рывок (как Rafael, alex2k8 и idbrii уже упоминали). К сожалению, выбор регистра 0 все время может быть довольно раздражающим, поэтому было бы неплохо, если по умолчанию p использует "0. Это может быть достигнуто путем ввода следующих строк в ваш .vimrc:

noremap p "0p 
noremap P "0P 
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
    execute 'noremap "'.s:i.'p "'.s:i.'p' 
    execute 'noremap "'.s:i.'P "'.s:i.'P' 
endfor 

Первая строка отображает каждый p обводку "0p. Однако это предотвращает доступ p к любым другим регистрам. Поэтому все штрихи p с явно выбранным регистром сопоставляются с эквивалентным выражением командной строки внутри цикла for. То же самое делается для P.

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

Подсказка 1: Теперь команда разреза "0d вместо d. Но так как я ленивый, это слишком долго для меня;) Поэтому я использую следующее отображение:

noremap <LEADER>d "0d 
noremap <LEADER>D "0D 

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

Подсказка 2: Тайм-аут по умолчанию для многоквантовых сопоставлений довольно короткий. Вы можете увеличить его, чтобы иметь больше времени при выборе регистра. См :help timeoutlen подробности, я использую:

set timeout timeoutlen=3000 ttimeoutlen=100 
12

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

Иные слова, a delete перезаписывает последний yank в неназванном регистре, но он все еще находится в регистре 0. Трюк с регистрацией черной дыры ("_dd), упомянутый в других ответах, работает, потому что он предотвращает перезапись неназванного регистра, но это необязательно.

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

"0p 

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

Смежные вопросы