В Vim есть ли способ удалить без ввода текста в регистр?



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



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



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




  • есть ли способ, чтобы удалить текст, не помещая его в регистр?

  • есть ли способ сказать, например, "заменить следующее слово"или" заменить до следующего абзаца"

  • или это лучший способ как-то использовать функцию нескольких регистров?

700   19  

19 ответов:

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

"_d

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

да. Это немного более запутано, чем удаление "старого" текста сначала, но:

Я начинаю с..

line1
line2
line3
line4

old1
old2
old3
old4

Я shift+v выберите строку 1, строку 2, 3 и 4 и удалите их с помощью d команда

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

тогда

"2p

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

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

line1
line2
line3
line4

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

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

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

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

например, когда вы кладете это в свой .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

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

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

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

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

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

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

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

"0p

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

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

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

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


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

:registers

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


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

если вы используете 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 (но тогда, если вы программируете, вы, вероятно, не хотите вставлять несколько раз, но создать функцию и вызвать ее, верно? право?).

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

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

для "заменить абзац", попробуйте cap в нормальном режиме.

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

зарегистрироваться 0 всегда содержит последний рывок (как Рафаэль,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 и P штрихи, которые теперь используют регистр 0 по умолчанию.

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

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

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

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

set timeout timeoutlen=3000 ttimeoutlen=100

ну, сначала выполните эту команду:

:h d

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

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

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

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

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

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

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

один из них должен иметь Плагины...

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

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

Я часто допускают ошибку, когда после команды 'г'ank тогда"_d'elete в черную дыру, то 'р Асте. Я предпочитаю "y'ANK", затем удаляю, как мне нравится, а затем"0p" из регистра 0, где последний скопированный текст выталкивается.

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

xnoremap p "_dP

удаленный текст помещается в" регистр черных дыр", а выдернутый текст остается.

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

для пользователей Dvorak один очень удобный способ-просто удалить ненужный текст в Регистр "1 вместо регистра" _ black hole, хотя бы потому, что вы можете нажать "+ 1 с тем же нажатием shift и быстрым движением мизинца, так как 1-это ключ непосредственно над " в Dvorak (плюс d находится в другой руке, что делает всю команду быстрой, как ад).

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

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

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

xnoremap <expr> p 'pgv"'.v:register.'y'

это из ответов (и комментариев) здесь: как вставить без перезаписи регистра

сначала он проходит мимо выделения, затем снова выбирается выделение с новым текстом (gv). Теперь регистр, который в последний раз использовался в визуальном режиме (обычно безымянный регистр, но работает также без побочных эффектов, если вы используете другой регистр для вставки). А затем снова дерните новое значение в регистр.

PS: Если вам нужен более простой вариант, который также работает с плагином intellj idea vim-simulation, вы можете взять этот (недостаток: перезаписать безымянный регистр, даже если для вставки был задан другой регистр):

vnoremap p pgvy

Comments

    Ничего не найдено.