Löschen Sie das Wort nach oder um den Cursor in VIM

211

Ich wechsle jetzt VIMvon TextMate. Ich fand ^+Wim INSERT-Modus sehr nützlich. Ich möchte jedoch nicht nur das Wort vor dem Cursor löschen, sondern auch das Wort nach oder um den Cursor.

Ich habe ein bisschen gegoogelt, aber das einzige, was ich finden kann, war ^+W, das Wort VOR dem Cursor zu löschen.

Mantas
quelle

Antworten:

77

Sie sollten eine Imap eines bestimmten Schlüssels für eine Reihe von Befehlen erstellen. In diesem Fall versetzen Sie die Befehle in den normalen Modus, löschen das aktuelle Wort und setzen Sie dann wieder in die Einfügung:

:imap <C-d> <C-[>diwi
Whaledawg
quelle
29
": h diw" für viele nützliche shrtcts!
Klokop
12
Bonus Bonuspunkte für die Verwendung von <Co>. Es führt einen Befehl im Normalmodus aus und springt direkt zurück in Einfügen, sodass so etwas auch imap <C-d> <C-o>diwfunktioniert. Es wird auch kein Rückgängig-Punkt erstellt, was <Esc> so ziemlich immer tut.
Zelk
<Co> im Einfügemodus machte meinen Tag :)
Lusk116
540

Normaler Modus:

daw : delete the word under the cursor    
caw : delete the word under the cursor and put you in insert mode 
Amjith
quelle
124
Es ist hilfreich für mich, es als Morgengrauen zu betrachten: ein Wort löschen und krächzen: ein Wort ändern.
Welbornio
1
Gott, den ich benutzt habe da)und an den ich ci)nie gedacht habe!
Himmel
1
Das ist Gold Jerry! GOLD! Ich habe diese Babys .vimrcwie nmap <Leader>d dawnmap <Leader>c caw
folgt
1
Erwähnenswert awist wahrscheinlich ein Beispiel für die Objektauswahl. Sie können Objektauswahl im visuellen Modus versuchen, um zu sehen, welchen Effekt sie haben: vimdoc.sourceforge.net/htmldoc/motion.html#object-select
crantok
103

Ich denke es ist einfach daw

daw - delete a word
Steve
quelle
1
Ich weiß, das aist ein Befehl für, Append text after the cursor [count] times.aber wie funktioniert das daw?
Syntagma
3
@REACHUS Das ursprüngliche Zeichen dschreibt vor, dass Sie "löschen" werden. Das 'a' ist eine Art Parameter, der angibt, dass die Löschung ein Trennzeichen enthalten soll. Schließlich gibt das 'w', ein anderes - parameterwenn Sie wollen - an, dass eine wordEinheit gelöscht wird.
Vlad-Ardelean
2
Was ist der Unterschied zwischen dwund daw?
AK_
5
@AK_ Späte Antwort, aber wenn Sie sich in der Mitte eines Wortes befinden, dwwird vom Cursor bis zum Ende des Wortes dawgelöscht , während das gesamte Wort zusammen mit einem Leerzeichen gelöscht wird. diwlöscht das gesamte Wort, ohne das Leerzeichen zu berühren.
Dmiters
67

Das Folgende funktioniert für den Normalmodus: Ich stimme der Antwort von Dan Olson zu, dass Sie sich bei den meisten Löschungen wahrscheinlich im Normalmodus befinden sollten. Weitere Details unten.

Wenn sich der Cursor innerhalb des Wortes befindet:
diwLöschen im Wort (keine Leerzeichen)
daw, Löschen um das Wort (Leerzeichen vor dem nächsten Wort).

Wenn sich der Cursor am Wortanfang befindet, drücken Sie einfach dw.

Dies kann multipliziert werden, indem die üblichen Zahlen für die Bewegung hinzugefügt werden, z. B. 2w, um 2 Wörter vorwärts zu bewegen, sodass d2w zwei Wörter löscht.

Einfügemodus ^ w
Die Idee, hjkl für Bewegungen in Vim zu verwenden, ist, dass es produktiver ist, die Hände in der Startreihe zu halten. Am Ende eines Wortes ^ w funktioniert hervorragend, um das Wort schnell zu löschen. Wenn Sie in den Einfügemodus gegangen sind, Text eingegeben und die Pfeiltasten verwendet haben, um in der Mitte des Wortes zu landen, das Sie gegen die Home-Row-Philosophie verstoßen haben.
Wenn Sie sich im normalen Modus befinden und das Wort ändern möchten, können Sie einfach c(ändern) anstelle von d(löschen) verwenden, wenn Sie das Wort vollständig ändern möchten , und den Einfügemodus erneut aktivieren, ohne drücken izu müssen, um zurückzukehren zum tippen.

Andy
quelle
42

Meinst du wie?

dw
Nadia Alramli
quelle
10
Spät zur Party, aber dw wird von der aktuellen Position bis zum Ende des Wortes löschen, um das ganze Wort von Anfang an zu löschen, benutze diw oder daw
Dvid Silva
1
dwwird nicht nach einem Bindestrich oder einer anderen Interpunktion gelöscht.
ccpizza
* Hinweis: Dadurch wird der Puffer / der letzte Ruck überschrieben. Dies ist eher eine "Ausschneiden" -Operation, nicht nur "Löschen".
MD. Mohiuddin Ahmed
23

So löschen Sie im normalen Modus alle Zeichen zwischen zwei Leerzeichen:

daW

So löschen Sie nur ein Wort:

daw 
krmld
quelle
20

Es sieht nicht so aus, als gäbe es eine eingebaute Möglichkeit, dies im Einfügemodus zu tun, was die Frage war. Einige der anderen Antworten sind für den normalen Modus korrekt und weisen darauf hin, dass eine benutzerdefinierte Zuordnung erstellt werden könnte, um die Funktionalität im Einfügemodus hinzuzufügen.

Ehrlich gesagt sollten Sie wahrscheinlich den größten Teil Ihres Löschvorgangs im normalen Modus ausführen. ^ W ist ordentlich zu wissen, aber ich bin mir nicht sicher, ob ich mir eine Situation vorstellen kann, in der ich es lieber tun würde, als in den normalen Modus zu wechseln und die leistungsfähigeren Löschbefehle zur Verfügung zu haben.

Vim unterscheidet sich in dieser Hinsicht stark von einer Reihe anderer Editoren (einschließlich TextMate). Wenn Sie es produktiv einsetzen, werden Sie wahrscheinlich feststellen, dass Sie nicht viel Zeit im Einfügemodus verbringen.

Dan Olson
quelle
1
Ich benutze ^ wa viel, meistens, wenn ich ein Wort falsch schreibe - anstatt zurück zu gehen und den fehlenden Buchstaben / etc hinzuzufügen, lösche ich einfach das Ganze und beginne von vorne. In den Normalmodus zu gehen, nur um ein Wort zu löschen, scheint eine Verschwendung zu sein von ein paar Tastenanschlägen. Zum Beispiel ist "Beispiel wrd [^ w] Wort" weniger Tastenanschläge als "Beispiel wrd [^ c] [dw] [i] Wort"
dbr
1
dbr: Er hat nicht darum gebeten, das grundlegende ^ W-Verhalten zu machen, das vim unterstützt. Er hat darum gebeten, ein ganzes Wort in der Mitte zu löschen, während er sich im Einfügemodus befindet. Dies ist eine seltsame Situation für vim und es gibt keinen Befehl, dies zu tun. Sie können ^ Q jederzeit an <Esc> ciw binden, wenn Sie die Funktionalität wirklich beeinträchtigen. Oh, auch das [i] in [^ c] [dw] [i] ist überflüssig, Sie können [^ c] [ciw]
bfabry
4
"Es sieht nicht so aus, als gäbe es einen Weg ..." - nun, es gibt unzählige Möglichkeiten, es zu tun - es gibt einfach keinen eingebauten Weg, afaik. Obwohl ich Dans Aussage zum Einfügemodus im Vergleich zum normalen Modus voll und ganz zustimme, können Sie natürlich einfach eine Einfügungsmoduszuordnung definieren, siehe ": help imap", die alles tut, was Sie erreichen möchten, wenn Sie die Funktionalität im Einfügemodus wirklich benötigen.
user55400
13

Um das gesamte Wort zu löschen, auf dem sich Ihr Cursor befindet, verwenden Sie diw
Um das gesamte Wort zu löschen, auf dem sich Ihr Cursor befindet, und um Sie in den Einfügemodus zu versetzen, verwenden Sie, ciw
wenn Sie nicht das gesamte Wort löschen möchten, sondern von Ihrem Standort aus löschen möchtendw/cw

Naseeruddin VN
quelle
8

Da es so viele Möglichkeiten gibt, ein Wort zu löschen, wollen wir sie veranschaulichen.

Angenommen, Sie bearbeiten:

foo-bar quux

und rufen Sie einen Befehl auf, während sich der Cursor auf der 'a' in 'Leiste' befindet:

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
0xF
quelle
5

Der Einfügemodus hat leider keinen solchen Befehl. Um in VIM das gesamte Wort unter dem Cursor zu löschen, können Sie viwdim NORMAL-Modus eingeben. Was bedeutet " V isual-Block I nner W ord D elete". Verwenden Sie Großbuchstaben W, um Interpunktion einzuschließen.

Myzel
quelle
3

Die akzeptierte Antwort schlägt fehl, wenn Sie versuchen, das Löschen von Wörtern zu wiederholen. Versuchen Sie stattdessen diese Lösung:

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

Es ordnet STRG-BackSpace zu und arbeitet auch im normalen Modus.


quelle
Diese Antwort gefällt mir besser, nur weil sie auch im normalen Modus funktioniert.
Sivabudh
2

Zum Löschen einer bestimmten Anzahl von Zeichen vor dem Cursor können Sie X verwenden. Zum Löschen einer bestimmten Anzahl von Wörtern nach dem Cursor können Sie dw verwenden (mehrere Wörter können beispielsweise mit 3dw für 3 Wörter gelöscht werden). Zum Löschen des Cursors im Allgemeinen können Sie daw verwenden.

John T.
quelle
2

Bewegt im alten vi bden Cursor an den Anfang des Wortes vor dem Cursor, wbewegt den Cursor an den Anfang des Wortes nach dem Cursor, ebewegt den Cursor am Ende des Wortes nach dem Cursor und dwlöscht vom Cursor zum Ende des Wortes.

Wenn Sie eingeben wbdw, löschen Sie das Wort um den Cursor, auch wenn sich der Cursor am Anfang oder am Ende des Wortes befindet. Beachten Sie, dass Leerzeichen nach einem Wort als Teil des zu löschenden Wortes betrachtet werden.

Mouviciel
quelle
2

Sie sind sich nicht ganz sicher, ob Sie "vorher" und "nachher" verwenden, aber Sie haben es versucht

dw

?

Bearbeiten: Ich denke, Sie suchen nach etwas, das Sie im Einfügemodus verwenden können. Seltsamerweise ist in den Dokumenten nichts zu finden, Strg-W scheint alles zu sein, was es gibt.

innaM
quelle
2

Ich habe zwei Zuordnungen vorgenommen, um die Konsistenz beim Einfügen und außerhalb des Einfügemodus zu gewährleisten.

:map <'Key of your choice'> caw

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

userFog
quelle
0

Ich möchte nicht nur das Wort vor dem Cursor löschen, sondern auch das Wort nach oder um den Cursor.

In diesem Fall kann die von OP vorgeschlagene Lösung (dh Verwendung <c-w>) mit der akzeptierten Antwort kombiniert werden, um Folgendes zu ergeben:

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

alternativ (kürzere Lösung):

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

Beispieleingabe:

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

Ausgabe:

word1 word4
Sergio
quelle