Любой способ удалить в vim без перезаписи вашего последнего yank?

Я люблю vim, но один общий вопрос:

  • yank a line
  • перейти туда, куда вы хотите вставить его
  • удалить что там
  • вставьте свой yank, только чтобы обнаружить, что он вставляет то, что вы только что удалили.

Очевидно, что рабочий процесс сначала удаляется, а второй - вторым. Но это было бы reeeeeaaaaalllly приятно, если бы мне не пришлось. У кого-нибудь есть трюк? У vim есть буфер вставки, который работает хорошо, или есть параметр .vimrc, который я могу изменить?

Ответ 1

Перейдите в регистр _, черную дыру.

Чтобы удалить строку, не вставляя ее в регистры:

"_dd

См. также :help registers.

Вероятно, это безопасно, если вы хотите вставлять что-то снова и снова, чтобы вытащить его в регистр с именем.

"aY

Янки строка в регистр a. Вставьте его с помощью "ap.

Ответ 2

Ваша дернутая строка все равно должна находиться в регистре 0. Так что

"0p

чтобы вставить строку (и удалить, когда захотите)

Ответ 3

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

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

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

"0p

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

Ответ 4

Другая возможность:

держите свои линии, как обычно,

перейдите туда, где вы хотите вставить их, введите визуальный режим линии (V)

выберите строки, которые вы хотите заменить

нажмите p, чтобы вставить ваши строки.

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

Ответ 5

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

nnoremap R "_d

Таким образом, dd становится Rd, а d$ становится R$. Обратите внимание, что R обычно связан с входом в режим замещения, но я обнаружил, что я никогда не использовал его, поэтому он был запоминающимся ключом для функции "действительно удалить".

Ответ 6

" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp

Ответ 7

По вашему конкретному вопросу, как вы сказали, не могли бы вы просто поменять порядок последних двух шагов?

  • строка yank (такая же)
  • перейдите в новое место (то же самое)
  • вставить выдернутую линию (был шаг 4)
  • удалить строку, которую вы не хотите (был шаг 3)

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

Ответ 8

Я написал этот плагин (yankstack.vim), чтобы решить эту проблему. Это дает вам что-то вроде Emacs kill ring для vim. Вы можете вытаскивать или удалять несколько вещей, делать пасту, а затем циклически перемещаться по вашей истории из дернутого/убитого текста. Я нахожу его легче, чем вспоминать, в каком регистре я дернул что-то.

В моем .vimrc у меня есть эти сопоставления:

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste

которые позволяют мне нажимать ALT-p или ALT-SHIFT-p для циклического перехода назад и вперед по моей истории пасты.

Ответ 9

Вы можете использовать регистры: "<register><command>

например:.

Это занимает строку в регистре a, удаляет другую строку, а затем вставляет регистр a

"ayy` (move) `dd"aP

Ответ 11

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

См. мой ответ здесь: fooobar.com/questions/17777/...

Чтобы использовать его, просто поместите его в свой .vimrc

Ответ 12

Если вы злой пользователь, вы можете подумать о переназначении X, чтобы сделать эквивалент "_d. Однако совершенствование реализации было для меня немного сложным. Тем не менее, я обнаружил, что

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

очень хорошо сочетается. Например, типизация XX будет функционировать аналогично dd, как и X $до d $, от X0 до d0 и т.д....

Если вам интересно, как это работает, "95" представляет регистр "_", поэтому он просто перенаправляет ваш вызов на удаление, как если бы "_ был нажат регистр.

Ответ 13

Фокус в том, что вы знаете, что хотите что-то захватить и двигаться, и вы используете "ленивый" первый регистр (который заменяется на все, что вы только что удалили).

Вам нужно научиться "вырезать" в vim.

Перед удалением укажите любой регистр, отличный от ". Совет. Проверьте свои регистры с помощью :reg

теперь вы выбираете новый регистр, нажимая " перед любой командой (в командном режиме, очевидно)

  • выберите то, что вы хотите "вырезать" (или на шаге 2 укажите диапазон)
  • Измените регистр на что угодно (1 здесь) и удалите: "1d или "1x или даже "1c
  • перейдите на новое место, удалите еще
  • теперь вы готовы вставить то, что вы вырезали и сохранили в регистре 1: "1p или "1p

сделано. это также имеет преимущество в разрешении usecase: удалите 5 разных вещей из одного места, и каждый фрагмент переходит в другой пункт назначения... просто поместите один в "1 другой в "2 и так далее... перейдите к каждому назначение и вставка.