Подтвердить что ты не робот

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

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

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

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

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

Ответ 1

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

"_d

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

Ответ 2

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

Я начинаю с..

line1
line2
line3
line4

old1
old2
old3
old4

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

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

Тогда do

"2p

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

Итак, я заканчиваю тем, что

line1
line2
line3
line4

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

Ответ 3

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

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

Ответ 4

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

Например, когда вы помещаете это в свой .vimrc

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

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

Пояснение:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

Ответ 5

В моем 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

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

Ответ 6

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

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

Ответ 7

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

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

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

"0p

Это отличная рекомендация:

Ответ 8

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

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

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


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

:registers

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


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

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

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

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

Ответ 10

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

Для "replace paragraph" попробуйте cap в нормальном режиме.

Ответ 11

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

Регистр 0 всегда содержит последний yank (в качестве Rafael, alex2k8 и idbrii уже упоминалось). К сожалению, выбор register 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: Теперь команда cut теперь "0d вместо d. Но поскольку я ленив, это слишком долго для меня;) Поэтому я использую следующее сопоставление:

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

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

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

set timeout timeoutlen=3000 ttimeoutlen=100

Ответ 12

Хорошо, сначала выполните следующую команду:

:h d

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

Ответ 13

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

Ответ 14

Моя ситуация: в Normal режиме, когда я удаляю символы, используя нажатие клавиши x, эти удаления перезаписывают мой последний регистр, что усложняет редактирование, когда я хочу удалить символы, используя x и вставить что-то, что есть в моем последнем регистре (например, вставить тот же текст в двух или более местах).

Я попробовал предложение в принятом ответе ("_d), но оно не сработало.

Однако из принятого ответа/комментариев по адресу https://vi.stackexchange.com/questions/122/performing- ~/.vimrc я добавил это в свой ~/.vimrc, который работает (вы можете нужно перезапустить Vim):

nnoremap x "_x

То есть теперь я могу выполнять свои обычные команды yank (y), delete (d) и paste (p) - и символы, которые я удаляю с помощью x больше не заполняют самые последние регистры.

Ответ 15

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

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

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

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

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

У одного из них должны быть плагины...

Ответ 16

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

xnoremap p "_dP

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

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

Ответ 17

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

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

Ответ 18

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

Ответ 19

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

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

Ответ 20

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

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

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

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

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

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

vnoremap p pgvy

Ответ 21

Для пользователей emacs-evil функция (evil-paste-pop) может запускаться после вставки и циклически повторять предыдущие записи в kill-ring. Предполагая, что вы привязали его к <Cp> (по умолчанию в Spacemacs), вы нажмете p затем столько <Cp> сколько необходимо.

Ответ 22

Для тех, кто использует JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) с IdeaVim. Возможно, у вас возникли проблемы с переназначением, например, nnoremap d "_d и использованием его для удаления строки dd. Возможное решение для вас: nnoremap dd "_dd

Есть проблемы на вашем треке, пожалуйста, проголосуйте за них:https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363