Я люблю 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
Ответ 10
Вы также можете попробовать следующее script: ReplaceWithRegister на vim.org/scripts/
Ответ 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
и так далее... перейдите к каждому назначение и вставка.