Как удалить (не вырезать) в Vim?


157

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

Пример:

line that will be copied.

line that I want to be substitued with the previous one.

Что я пытаюсь сделать:

yy
dd
p

Но Vim заменяет недавно скопированную строку удаленной (вырезанной). Я знаю , что я могу использовать буфера , как, "1yy, ddто "1p, но я всегда забываю поставить скопированную строку в буфере , то я сначала нужен вставить мое содержание (линию , которая будет скопирована) , а затем удалить то , что я хочу (строка , что я хочу быть замененным предыдущим.)

Как я могу действительно удалить текст в Vi (m), не копируя его?

Другой связанный вопрос: как я могу удалить слово вперед в режиме вставки? Хочу что-то похожее на Ctrl+ w.


Ответы:


139

Используйте «черную дыру» регистр, "_чтобы действительно удалить что - нибудь: "_d.
Используйте, "_dPчтобы вставить что-нибудь и сохранить его для дальнейшей вставки.

Для второго вопроса вы можете использовать <C-o>dw. <C-o>используется для выполнения обычной команды без выхода из режима вставки .

Конечно, вы можете настроить свои собственные сопоставления, чтобы не печатать. У меня есть такие:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP

спасибо, вы ответите на оба моих вопроса. Но я не понимал, чем мне помогут эти команды noremap. Я теряю функцию обрезки, верно?
MaikoID

3
Нет, по- dпрежнему «вырезает» и pвсе еще «вставляет», при этом <leader>dудаляет по-настоящему, <leader>pотбрасывает выделенный текст и вставляет содержимое регистра по умолчанию. <leader>pпозволяет мне вставлять один и тот же текст несколько раз без использования именованных регистров.
romainl

131

Черная дыра регистр "_ будет делать трюк, но есть лучшее решение:

Когда вы снова входите в строку с pкомандой, вы вставляете содержимое (изменчивого) регистра по умолчанию "" , которое было перезаписано dd. Но вы все равно можете вставить данные из (энергонезависимого) регистра восстановления "0, который не будет перезаписан командой удаления dd.

Итак, это команды, которые вы хотите использовать в соответствии с вашим примером:

yy
dd
"0p

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

48

Это одна из вещей, которые мне не нравились в vim ... Я закончил тем, что сопоставил ddрегистр черной дыры в моем .vimrc, и с тех пор жизнь стала хорошей:

nnoremap d "_d
vnoremap d "_d

6
тогда как вы режете?
VitalyB 09

14
v/Vс xтоже разрезается. И резка с xтоже совместима с Ctrl + xлюбой ОС.
WesternGun

23

следующие сопоставления произведут:

  • d => "удалить"
  • лидер d => "вырезать"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

Кроме того, рекомендуется устанавливать ключ "лидера" на запятую, например:

let mapleader = ","
let g:mapleader = ","

эти 2 фрагмента сделают ", d" вашей новой командой вырезания.

Если вы хотите использовать эти сопоставления вместе с конфигурацией общего системного буфера обмена, см. Дополнительные сведения на https://github.com/pazams/d-is-for-delete


Хотел бы я проголосовать за этот ответ более одного раза - я использовал ответ kprobst, но затем, чтобы разрезать линию, мне пришлось использовать, yyddчто было немного неустойчиво для моих пальцев ;-).
Тахир Хассан

1
После этого идея intellij стала такой странной. dd ничего не делает. , d ничего не делает
s1n7ax

Решение мне очень нравится. Одна вещь, которая у меня не сработала, - это разрезание линий ,dd. После добавления nnoremap <leader>dd ""ddзаработало
Алексей

8

Вы можете использовать, "_dчтобы предотвратить перезапись вашего извлеченного текста. Вы можете хранить извлеченный или удаленный текст в любом регистре, который вам нужен ", и _это регистр «черной дыры», куда вы отправляете вещи, которые вам не нужны.

Для получения дополнительной информации вы можете ввести :help "_или:help deleting


-2
yy
Vx
p

В визуальном режиме xудаляет выделение, поэтому, если вы хотите удалить всю строку, сначала нажмите, Vчтобы выбрать строку в визуальном режиме, а затем нажмите, xчтобы удалить выделение.


5
Это копирует удаленную строку в буфер обмена, чего OP хочет избежать.
aVeryStableGenius

Благодарность! Каким-то образом это прекрасно работает с плагином Evil Emacs
Педро Пенна
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.