it-swarm.com.de

vim - Wie lösche ich einen großen Textblock, ohne die Zeilen zu zählen?

In der Praxis finde ich es oft so, dass ich große Textblöcke lösche (oder kopiere). Man kann die Textzeilen zählen und sagen (zum Beispiel) 50dd, um 50 Zeilen zu löschen.

Aber wie kann man diesen großen Textblock löschen, ohne zu wissen, wie viele Zeilen gelöscht werden sollen?

189
Justin Ethier

Ich bin kein Vim Guru, aber was ich unter diesen Umständen benutze, ist "visueller Modus". Geben Sie im Befehlsmodus V (groß) ein. Bewegen Sie sich dann nach oben/unten, um den zu löschenden Block zu markieren (alle üblichen Bewegungsbefehle funktionieren). Dann entfernen Sie es mit x oder d.

281
Mat

Gehe zur Startzeile und tippe ma (markiere "a"). Dann in die letzte Zeile gehen und eintreten d'a (Löschen, um "a" zu markieren).

Dadurch werden alle Zeilen von der aktuellen bis zur markierten Zeile (einschließlich) gelöscht. Es ist auch mit vi und vim kompatibel, sofern die Wahrscheinlichkeit besteht, dass Ihre Umgebung nicht mit Letzterem gesegnet ist.

288
paxdiablo

Sie können auch den visuellen Modus verwenden (einige Befehle können auch mit der Löschoption verwendet werden) vipvap Absatz auswählen, v2ap um zwei Absätze auszuwählen dap arbeitet, d2ap ebenfalls. Sie können innerhalb von Blöcken [] Löschen da[

Als Referenz: die Arten von Objekten. Aus der VIM-Dokumentation: Abschnitt 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a Word (with white space)           
iw  inner Word                  
aW  a Word (with white space)           
iW  inner Word                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  
45
M'vy

Es gibt hier viele bessere Antworten, aber der Vollständigkeit halber werde ich die Methode erwähnen, die ich verwendet habe, bevor ich einige der oben erwähnten großartigen Antworten lese.

Angenommen, Sie möchten aus den Zeilen 24-39 löschen. Sie können den Befehl ex verwenden

:24,39d

Sie können auch Linien mit ziehen

:24,39y

Suchen und ersetzen Sie einfach über die Zeilen 24-39 mit

:24,39s/find/replace/g
38
daviewales

Wenn Sie Zeilennummern über set number Aktivieren, können Sie einfach dNNG eingeben, wodurch die Zeile NN von der aktuellen Position gelöscht wird. Sie können also zum Anfang der zu löschenden Zeile navigieren und einfach d50G Annehmen, dass dies die letzte zu löschende Zeile ist.

11
Jim Mitchener

Es kommt irgendwie darauf an, was das großer Block ist. Vielleicht wollen Sie nur einen Absatz löschen, in welchem ​​Fall a dip würdest du.

10

Es gibt verschiedene Möglichkeiten. Was am besten ist, hängt vom Text ab, an dem Sie arbeiten.

Zwei Möglichkeiten kommen in den Sinn:

  • in den visuellen Modus wechseln (V, S-V, ...), markieren Sie den Text mit der Cursorbewegung und drücken Sie d
  • lösche einen ganzen Absatz mit: dap
7
Tom Regner

Wenn der gesamte Block auf dem Bildschirm sichtbar ist, können Sie die relative Zahleneinstellung verwenden. Siehe: Hilfe Relativnummer. Verfügbar in 7.3

6

Neben anderen hier bereits erwähnten Anträgen gibt es auch /{pattern}<CR> motion. Wenn Sie also wissen, dass Sie eine Zeile löschen möchten, die foo enthält, können Sie dV/foo<CR>. V ist hier, um die Bewegung zeilenweise zu erzwingen, da standardmäßig / ist zeichenweise.

3
ZyX

Das Zählen von Zeilen ist mir zu mühsam, aber das Zählen von Absätzen ist nicht so schlecht. '{' und '}' bewegen den Cursor in die erste leere Zeile vor bzw. nach dem Cursor. Cursor-Verschiebevorgänge können mit dem Löschen kombiniert werden, und mehrere andere Antworten verwenden einen ähnlichen Ansatz (dd für eine Zeile, dG für das Ende des Dokuments usw.).
Zum Beispiel:

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

Wenn Ihr Cursor über dem Kommentarblock beginnt, löscht 'd}' den Kommentarblock und 'd2}' löscht sowohl den Kommentarblock als auch den Codeblock. Wenn Ihr Cursor unter dem Codeblock beginnt, löscht 'd {' den Code und 'd2 {' beide. Natürlich können Sie einen Block überspringen, indem Sie zuerst den Cursor bewegen: '{d {' oder '} d}'.

Wenn Sie mit Ihrem Leerzeichen übereinstimmen oder die Absätze auf einen Blick zählen können, sollte dies funktionieren. Die Vim-Hilfedatei enthält weitere Cursortricks, wenn Sie interessiert sind.

3
John P

Sie können den Cursor an den Anfang oder das Ende des Blocks setzen und in den visuellen Modus wechseln (Umschalt-V). Bewegen Sie sich dann einfach nach oben oder unten, bis der gewünschte Block markiert ist. Kopieren Sie abschließend den Text mit y oder schneiden Sie ihn mit d aus.

3
Judge Maygarden

Sie können auch eine sehr große Zahl eingeben und dann dd drücken, um alle Zeilen unter dem Cursor zu löschen.

1
Rohit Pruthi

Löschen eines Textblocks

Angenommen, Ihr Cursor steht am Anfang des Blocks:

V/^$<CR>d (where <CR> is the enter/return key)

Erläuterung

  • Aktivieren Sie den Modus "Zeilenweise-visuell": V
  • Markieren Sie bis zur nächsten leeren Zeile: /^$<CR>
  • Löschen: d

Schlüsselbindung

Eine robustere Lösung:

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

Erläuterung

  • Suchumbruch deaktivieren: :set nowrapscan
  • Ordnen Sie die Taste D neu zu (für die folgenden Befehle): :nnoremap D
  • Aktivieren Sie den Modus "Zeilenweise-visuell": V
  • Markieren Sie bis zur nächsten leeren/Whitespace-Zeile oder EOF: /^\s*$\\|\%$<CR>
  • Löschen: d
1
Jon Nadal