usuń słowo za kursorem lub wokół niego w VIM


212

Teraz przełączam się VIMz TextMate. Uważam, że ^+Wtryb INSERT jest bardzo przydatny. Chciałbym jednak usunąć nie tylko słowo przed kursorem, ale także słowo za kursorem lub wokół niego.

Zrobiłem trochę googlingu, ale jedyne, co mogłem znaleźć, to ^+Wusunąć słowo PRZED kursorem.

Odpowiedzi:


78

To, co powinieneś zrobić, to utworzyć imap określonego klucza do szeregu poleceń, w tym przypadku polecenia przejdą w tryb normalny, usuną bieżące słowo, a następnie ponownie wstawią:

:imap <C-d> <C-[>diwi

29
„: h diw” dla wielu przydatnych skradzień!
klokop

12
Dodatkowe punkty bonusowe za użycie <Co>. Wykonuje jedno polecenie w trybie normalnym i przeskakuje bezpośrednio z powrotem do Insert, więc coś podobnego imap <C-d> <C-o>diwteż działa. Nie tworzy też punktu cofania, co zawsze robi <Esc>.
zelk

<Co> w trybie wstawiania sprawiło, że mój dzień :)
Lusk116

541

Tryb normalny:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 

125
Przydaje mi się myśleć o tym jak o świcie: usuń słowo i caw: zmień słowo.
welbornio

1
Bóg Używam da)a ci)jednak nigdy nie myślał o tym!
Sky

1
To złoty Jerry! ZŁOTO! Tak zmapowałem te dzieci w moim .vimrcpliku: nmap <Leader>d daw inmap <Leader>c caw
racl101,

1
Prawdopodobnie warto wspomnieć, że awjest to jeden z przykładów wyboru obiektów. Możesz wypróbować selekcje obiektów w trybie wizualnym, aby zobaczyć, jaki mają one efekt: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok

103

Myślę, że to jest po prostu daw

daw - delete a word

1
Wiem, że ato polecenie, Append text after the cursor [count] times.ale jak dawdziała?
syntagma

3
@ REACHUS początkowa postać ddyktuje, że będziesz „ usuwał ”. „A” jest rodzajem parametru określającym, że usunięcie ma obejmować separator. Wreszcie „w”, kolejny - parameterjeśli chcesz - określa, że wordjednostka zostanie usunięta.
vlad-ardelean

2
Jaka jest różnica między dwi daw?
AK_

5
@AK_ Późna odpowiedź, ale jeśli jesteś w środku słowa, dwusunie się z kursora na koniec słowa, a jednocześnie dawusunie całe słowo wraz ze spacją. diwusunie całe słowo bez dotykania białych znaków wokół niego.
Dmiters

67

Poniżej działa tryb normalny: zgadzam się z odpowiedzią Dana Olsona, że ​​prawdopodobnie powinieneś być w trybie normalnym w przypadku większości operacji usuwania. Więcej szczegółów poniżej.

Jeśli kursor znajduje się wewnątrz słowa:
diwaby usunąć słowo (nie zawiera spacji),
dawaby usunąć słowo (obejmuje spacje przed następnym słowem).

Jeśli kursor znajduje się na początku słowa, wystarczy nacisnąć dw.

Można to pomnożyć przez dodanie zwykłych liczb dla ruchu, np. 2w, aby przejść do przodu o 2 słowa, więc d2w usuwa dwa słowa.

Tryb wstawiania ^ w
Pomysł użycia hjkl do poruszania się w Vimie polega na tym, że bardziej produktywne jest trzymanie rąk w głównym rzędzie. Na końcu słowa ^ w działa świetnie, aby szybko usunąć słowo. Jeśli przeszedłeś do trybu wstawiania, wprowadziłeś tekst i użyłeś klawiszy strzałek, aby skończyć w środku słowa, które postąpiłeś wbrew filozofii wiersza domowego.
Jeśli jesteś w trybie normalnym i chcesz zmienić słowo, możesz po prostu użyć c(zmień) zamiast d(usuń), jeśli chcesz całkowicie zmienić słowo i ponownie wejść w tryb wstawiania bez konieczności naciskania, iaby wrócić do pisania.


42

Masz na myśli?

dw

10
Późno na imprezę, ale dw usunie z bieżącej pozycji do końca słowa, aby usunąć całe słowo od początku, użyj diw lub daw
Dvid Silva

1
dwnie usuwa obok myślnika ani innej interpunkcji.
ccpizza

* Uwaga: Zastąpi to bufor / ostatni szarpnięcie. Jest to bardziej operacja „Wytnij”, a nie tylko „Usuń”.
MD. Mohiuddin Ahmed

23

Aby usunąć wszystkie znaki między dwoma białymi spacjami, w trybie normalnym:

daW

Aby usunąć tylko jedno słowo:

daw 

20

Nie wygląda na to, żeby istniał jakikolwiek wbudowany sposób na to w trybie wstawiania, o co pytano. Niektóre inne odpowiedzi są poprawne dla trybu normalnego, a także wskazuje, że można utworzyć niestandardowe odwzorowanie w celu dodania funkcji w trybie wstawiania.

Szczerze mówiąc, prawdopodobnie powinieneś zrobić większość usuwania w trybie normalnym. ^ W to fajnie wiedzieć, ale nie jestem pewien, czy mogę wymyślić sytuację, w której wolałbym to zrobić niż esc, aby przejść do trybu normalnego i mieć do dyspozycji potężniejsze polecenia usuwania.

W ten sposób Vim bardzo różni się od wielu innych edytorów (w tym TextMate). Jeśli używasz go produktywnie, prawdopodobnie zauważysz, że nie spędzasz dużo czasu w trybie wstawiania.


1
Często używam ^ wa, głównie kiedy źle wpisuję słowo - zamiast wracać i dodawać brakującą literę / etc, po prostu usuwam całą rzecz i zaczynam od nowa. Przejście do trybu normalnego po prostu usunięcie jednego słowa wydaje się marnotrawstwem kilku naciśnięć klawiszy. Na przykład „przykład wrd [^ w] słowo” to mniej naciśnięć klawiszy niż „przykład wrd [^ c] [dw] [i] słowo”
dbr

1
dbr: Nie prosił jednak o zachowanie podstawowe ^ W, które obsługuje vim. Prosił o usunięcie całego słowa w środku, gdy jest w trybie wstawiania, co jest dość dziwną sytuacją dla vima, więc nie ma na to polecenia. Zawsze możesz powiązać ^ Q z <Esc> ciw, jeśli naprawdę zależy ci na funkcjonalności. Och, również [i] w [^ c] [dw] [i] jest zbędne, możesz użyć [^ c] [ciw]
bfabry

4
„Nie wygląda na to, że istnieje sposób ...” - cóż, istnieje niezliczona ilość sposobów, aby to zrobić - po prostu nie ma wbudowanego sposobu, afaik. Chociaż w pełni zgadzam się z twierdzeniem Dana na temat trybu wstawiania w porównaniu do trybu normalnego, możesz oczywiście po prostu zdefiniować mapowanie trybu wstawiania, zobacz „: help imap”, który robi wszystko, co chcesz osiągnąć, jeśli naprawdę potrzebujesz funkcjonalności w trybie wstawiania.
user55400

13

Aby usunąć całe słowo, którego używa kursor diw
Aby usunąć całe słowo, na którym znajduje się kursor i przejść do trybu wstawiania, użyj, ciw
jeśli nie chcesz usunąć całego słowa, ale usuń z miejsca, w którym jesteśdw/cw


8

Ponieważ istnieje tak wiele sposobów na usunięcie słowa, zilustrujmy je.

Zakładając, że edytujesz:

foo-bar quux

i wywołać polecenie, gdy kursor znajduje się na pasku „a” na pasku:

foo-bquux  # dw:  letters then spaces right of cursor
foo-quux   # daw: letters on both sides of cursor then spaces on the right 
foo- quux  # diw: letters on both sides of cursor
foo-bquux  # dW:  non-whitespace then spaces right of cursor
quux       # daW: non-whitespace on both sides of cursor then spaces on the right
 quux      # diW: non-whitespace on both sides of cursor

5

Niestety tryb wstawiania nie ma takiego polecenia. W VIM, aby usunąć całe słowo pod kursorem, możesz wpisać viwdw trybie NORMALNYM. Co oznacza „ V isual-Block I nner W ord D elete”. Użyj dużej litery, Waby uwzględnić interpunkcję.


3

Przyjęta odpowiedź nie powiedzie się podczas próby powtórzenia usuwania słów, spróbuj zamiast tego:

" delete current word, insert and normal modes
inoremap <C-BS> <C-O>b<C-O>dw
noremap <C-BS> bdw

Mapuje CTRL-BackSpace, działając również w trybie normalnym.


Bardziej podoba mi się ta odpowiedź tylko dlatego, że działa również w trybie normalnym.
sivabudh

2

Aby usunąć pewną liczbę znaków przed kursorem, możesz użyć X. Aby usunąć pewną liczbę słów za kursorem, możesz użyć dw (wiele słów można usunąć za pomocą 3dw dla 3 słów, na przykład). Aby usunąć ogólnie kursor, możesz użyć daw.


2

W starym vi bprzesuwa kursor na początek słowa przed kursorem, wprzenosi kursor na początek słowa za kursorem, eprzenosi kursor na końcu słowa za kursorem i dwusuwa z kursora na koniec słowa.

Po wpisaniu wbdwusuwasz słowo wokół kursora, nawet jeśli kursor znajduje się na początku lub na końcu słowa. Pamiętaj, że spacje po słowie są uważane za część słowa do usunięcia.


2

Nie jestem pewien, czy używasz „przed” i „po”, ale próbowałeś

dw

?

Edycja: Myślę, że szukasz czegoś do użycia w trybie wstawiania. O dziwo, w dokumentach nie ma nic, ctrl-w wydaje się być wszystkim.


2

Zrobiłem dwa mapowania, aby uzyskać spójność w trybie wstawiania i poza trybem wstawiania.

:map <'Key of your choice'> caw

:imap <'Key of your choice'> <'Esc'> caw


0

Chciałbym usunąć nie tylko słowo przed kursorem, ale także słowo za kursorem lub wokół niego.

W takim przypadku rozwiązanie zaproponowane przez OP (tj. Za pomocą <c-w>) można połączyć z zaakceptowaną odpowiedzią, aby uzyskać:

inoremap <c-d> <c-o>daw<c-w>

alternatywnie (krótsze rozwiązanie):

inoremap <c-d> <c-o>vawobd

Przykładowe dane wejściowe:

word1 word2 word3 word4
               ^------------- Cursor location

Wynik:

word1 word4
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.