Jak usunąć (nie wyciąć) w Vimie?

145

Jak mogę usunąć linię bez umieszczania jej w domyślnym buforze?

Przykład:

line that will be copied.

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

Co próbuję zrobić:

yy
dd
p

Ale Vim zastępuje ostatnio skopiowany napis tym usuniętym (obciętym). Wiem, że można używać bufory podobnych "1yy, ddpotem "1p, ale ja zawsze zapomnij umieścić skopiowany ciąg w buforze potem muszę wkleić moje zawartość pierwsza (linii, które zostaną skopiowane), a następnie usunąć to, co chcę (wiersz, który chcę do zastąpienia poprzednim).

Jak naprawdę usunąć tekst w Vi (m) bez kopiowania go?

Innym pokrewnym pytaniem jest to, jak mogę dalej usunąć słowo w trybie wstawiania? Chcę czegoś podobnego do Ctrl+ w.

MaikoID
źródło

Odpowiedzi:

130

Użyj „czarnej dziury register”, "_aby naprawdę coś usunąć: "_d.
Użyj, "_dPaby wkleić coś i zachować dostępność do dalszego wklejania.

W przypadku drugiego pytania możesz użyć <C-o>dw. <C-o>służy do wykonywania zwykłych poleceń bez wychodzenia z trybu wstawiania .

Oczywiście możesz skonfigurować własne mapowania, aby zapisać wpisywanie. Mam te:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
romainl
źródło
dzięki, odpowiadasz na oba moje pytania. Ale nie rozumiałem, jak te polecenia noremap mi pomogą. Czy tracę funkcję cięcia, prawda?
MaikoID
3
Nie, dnadal "tnie" i pnadal "wkleja", podczas gdy <leader>dkasuje na poważnie i <leader>pwyrzuca zaznaczony tekst i wkleja zawartość domyślnego rejestru. <leader>pumożliwia mi wielokrotne wklejanie tego samego tekstu bez konieczności używania nazwanych rejestrów.
romainl
119

Czarna dziura rejestr "_ rade, ale jest lepsze rozwiązanie:

Po wejściu do wiersza z powrotem za pomocą ppolecenia wklejasz zawartość (ulotnego) rejestru domyślnego "" , który został nadpisany przez dd. Ale nadal możesz wkleić z (nieulotnego) rejestru yank "0 , który nie zostanie nadpisany przez polecenie deletedd .

Oto polecenia, których chcesz użyć zgodnie z przykładem:

yy
dd
"0p
cutemachine
źródło
1
Świetnie, to powinna być akceptowana odpowiedź. O wiele łatwiej jest ręcznie określić rejestr, gdy chcę wkleić, niż określać rejestr za każdym razem, gdy cokolwiek usuwam.
JShorthouse
44

To jedna z rzeczy, których nie lubiłem w vimie ... Skończyło się na mapowaniu dddo rejestru czarnej dziury w moim .vimrc i życie toczy się dobrze, odkąd:

nnoremap d "_d
vnoremap d "_d
kprobst
źródło
6
to jak tniesz?
VitalyB
11
v/Vz xjest również wycięty. Cięcie za pomocą xjest również spójne z Ctrl + xkażdym systemem operacyjnym.
WesternGun
22

następujące mapowania dadzą:

  • d => "usuń"
  • lider d => "wytnij"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

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

Ponadto dobrym sposobem jest ustawienie klucza „lidera” na przecinek, np .:

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

te 2 fragmenty spowodują, że ", d" będzie twoim nowym poleceniem cięcia.

Jeśli chcesz używać tych mapowań razem ze wspólną konfiguracją schowka systemowego, zapoznaj się z dalszymi szczegółami pod adresem https://github.com/pazams/d-is-for-delete

pazams
źródło
Chciałbym móc zagłosować za tą odpowiedzią więcej niż raz - użyłem odpowiedzi kprobst, ale potem, aby wyciąć linię, musiałem użyć tego, yyddco było trochę nie do utrzymania na palcach ;-).
Tahir Hassan
1
Intellij pomysł zachowuje się po tym dziwnie. dd nic nie robi. , d nic nie robi
s1n7ax
Rozwiązanie bardzo mi się podoba. Jedna rzecz, która mi nie pomogła - to cięcie linii ,dd. Po dodaniu nnoremap <leader>dd ""ddzaczął działać
Alexey
8

Możesz użyć, "_daby zapobiec nadpisywaniu szarpanego tekstu. Możesz przechowywać szarpany lub usunięty tekst w dowolnym rejestrze, w którym chcesz ", i _jest to rejestr `` czarnej dziury '', w którym wysyłasz rzeczy, które Cię nie interesują.

Aby uzyskać więcej informacji, wpisz :help "_lub:help deleting

Alex
źródło
-1
yy
Vx
p

W trybie wizualnym xusunie zaznaczenie, więc jeśli chcesz usunąć całą linię, najpierw naciśnij, Vaby wybrać linię w trybie wizualnym, a następnie naciśnij, xaby usunąć zaznaczenie.

Atemu
źródło
3
Spowoduje to skopiowanie usuniętej linii do schowka, czego chce uniknąć OP.
aVeryStableGenius
Dzięki! W jakiś sposób działa to idealnie na wtyczce Emacsa Evil
Pedro Penna