Як видалити (не вирізати) у Vim?


145

Як я можу видалити рядок, не вставляючи її в буфер за замовчуванням?

Приклад:

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.


Відповіді:


130

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

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

Ви можете налаштувати власні відображення для збереження набору тексту, звичайно. У мене є такі:

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

thx, ти відповідаєш на мої обидва запитання. Але я не розумів, як ці команди noremap допоможуть мені. Я втрачаю функцію різання, правда?
MaikoID

3
Ні, dвсе ще "скорочується" і pвсе ще "вставляється", при цьому <leader>dвидаляється для справжнього і <leader>pвикидає вибраний текст і вставляє вміст регістра за замовчуванням. <leader>pдозволяє мені вставляти один і той же текст кілька разів без використання названих регістрів.
ромайнл

119

Чорна діра регістр "_ буде робити трюк, але є краще рішення:

Коли ви вводите рядок назад із символом p команди, ви вставляєте вміст (летючого) реєстру за замовчуванням "" , який був перезаписаний dd. Але ви все одно можете вставити з (нелетучого) реєстру вибивання "0 , який не буде перезаписаний командою delete dd.

Отже, це команди, які ви хочете використовувати відповідно до вашого прикладу:

yy
dd
"0p

1
Чудово, це має бути прийнята відповідь. Набагато простіше вручну вказати регістр, коли я хочу вставити, ніж зберігати вказівку реєстру кожного разу, коли я щось видалюю.
JShorthouse

44

Це одне з речей, які мені не подобалися щодо vim ... Я в кінцевому підсумку ddпереглянув карту до реєстру чорних дір у своєму .vimrc і життя з цього часу було гарним:

nnoremap d "_d
vnoremap d "_d

6
то як ти ріжеш?
ВіталійБ

11
v/Vз xтакож вирізається. І різання за допомогою xтакож є когерентною Ctrl + xдля будь-якої ОС.
WesternGun

22

будуть зроблені наступні відображення:

  • 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" вашою новою командою cut.

Якщо ви хочете використовувати ці відображення разом із конфігурацією буфера обміну загальною системою, детальнішу інформацію див. На https://github.com/pazams/d-is-for-delete


Я хотів би, щоб я міг би підтвердити цю відповідь не один раз - я використовував відповідь kprobst, але потім, щоб перерізати лінію, мені довелося використовувати, yyddщо було трохи нестійким на моїх пальцях ;-).
Тахір Хассан

1
Ідея Intellij діяла настільки дивно після цього. ДД нічого не робить. , буду нічого не робити
s1n7ax

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

8

Ви можете використовувати "_dдля запобігання перезапису речей тексту, що перекручується. Ви можете зберігати викручений або видалений текст у будь-якому регістрі, який ви хочете ", і_ це реєстр "чорної діри", куди ви надсилаєте речі, які вас не цікавлять.

Для отримання додаткової інформації ви можете ввести :help "_або:help deleting


-1
yy
Vx
p

У візуальному режимі xбуде видалено виділення, тому, якщо ви хочете видалити цілу лінію, спочатку натисніть, Vщоб вибрати рядок у візуальному режимі, а потім натисніть, xщоб видалити виділення.


3
Це копіює вилучений рядок у буфер обміну, що саме те, що OP хоче уникнути.
aVeryStableGenius

Дякую! Якось це прекрасно працює на плагіні Evil Evil
Педро Пенна,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.