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


193

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

Aber wie würde man diesen großen Textblock löschen, ohne wissen zu müssen, wie viele Zeilen gelöscht werden sollen?


1
Wenn das Fenster groß genug ist, ist hier die relative Zeilennummerierung hilfreich. Platzieren Sie den Cursor oben im Fenster, suchen Sie die relative Zeilennummer der zuletzt zu löschenden Zeile (z. B. n), fügen Sie eine hinzu, geben Sie diese Nummer ein und geben Sie dann dd ein. ZB wenn n = 50, dann 51dd. Alternativ können Sie einen Bewegungsbefehl verwenden -50d<down arrow>
BallpointBen

"Finde die relative Zeilennummer" - oder benutze :set rnuund Vim wird dies sofort tun! Die Zeile, in der Sie sich befinden, wird weiterhin absolut nummeriert, aber Zeilen über und unter dem Cursor werden symmetrisch mit 1, 2, ... nummeriert (und mit Cursorbewegung, Ereignissen auf Dateiebene usw. aktualisiert)
John P

Antworten:


287

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


2
Seltsam. Ich weiß, dass es hier unter Linux (vim 7.3.50) und mit gVim unter Windows für mich (tm) funktioniert. Und nach den anderen Antworten zu urteilen, funktioniert für andere Menschen. Vielleicht sorgen einige Einstellungen in Ihrem .vimrcdafür, dass es funktioniert?
Mat

OK, aus irgendeinem Grund war mir nicht klar, dass Sie mit Shift- v... in den visuellen Linienmodus wechseln können. Ich habe versucht, auch die CTRLTaste zu verwenden . Das funktioniert also und ist wahrscheinlich der bequemste Weg.
Justin Ethier

7
Möglicherweise möchten Sie klarstellen, dass es zwei visuelle Modi gibt - Visual Line ( CTRL- v) und Visual Block ( Shift- v).
Justin Ethier

2
Ich mache das viel. Aber ich halte es immer für Betrug und weniger als ideal.
Jim Mitchener

9
Es gibt tatsächlich drei visuelle Modi: Visueller Modus (zeichenbasiert {v}), visueller Linienmodus (zeilenbasiert {Sv}) und visueller Blockmodus (Ermöglicht die Auswahl von Blöcken {Cv})
Tom Regner

293

Gehen Sie zur Startzeile und geben Sie ein ma(markieren Sie "a"). Gehen Sie dann zur letzten Zeile und geben Sie ein d'a(löschen, um "a" zu markieren).

Dadurch werden alle Zeilen von der aktuellen zur markierten (einschließlich) gelöscht. Es ist auch kompatibel mit visowie vim, für den unwahrscheinlichen Fall, dass die Umgebung nicht mit dieser gesegnet ist.


3
Dieser verdammte Stein! Ich hasse es, wie lange ich nur etwas mache (wie das Zählen von Linien), bevor ich nach einer besseren Lösung suche. Vielen Dank!
Ryanjdillon

1
wirklich genial Ich benutze immer den visuellen Modus, um den Block zu löschen, aber dieser Weg ist besser +1
hish

4
Ich fand dies hilfreicher als den visuellen Modus zum Löschen von mehr als 500.000 Zeilen
Michael - Wo ist Clay Shirky

Wirklich praktische Antwort. Ich verwende es, um die Mails auf meinem Server aus der Datei /var/mail/usernamein großen Mengen zu löschen und die letzten Mails intakt zu lassen. Ich mache eine Markierung, dann gebe ich zum Beispiel ein, 50000gefolgt von ggZeile 50.000, und lösche dann alle Zeilen dazwischen. klappt wunderbar!
Otmezger

1
@horta, ich würde wahrscheinlich nicht vimals Werkzeug zum Bearbeiten von Gigabyte-Dateien verwenden - ich würde mich eher für Textverarbeitungswerkzeuge wie awkund seine Brüder entscheiden :-)
paxdiablo

46

Sie können den visuellen Modus verwenden auch (einige Befehle sind verwendbar mit dem Löschoption auch) vip vapAbsatz auszuwählen, v2apzwei Absätze auszuwählen dapWerke, d2apauch. Sie können innerhalb von Blöcken von [ ]like löschenda[

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                  

1
da [, da {, da "alles nützlich für Programmierer
Rene Wooller

1
Vielen Dank! dapist sehr leicht zu merken als "Absatz löschen"
Tropilio

38

Hier gibt es viele bessere Antworten, aber der Vollständigkeit halber werde ich die Methode erwähnen, die ich verwendet habe, bevor ich einige der oben genannten großartigen Antworten gelesen habe.

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

:24,39d

Sie können Linien auch mit ziehen

:24,39y

Und finden und ersetzen Sie knapp über den Zeilen 24-39 mit

:24,39s/find/replace/g

11

Wenn Sie die Zeilennummern über set numberaktivieren, können Sie einfach dNNGdie Zeile NN von der aktuellen Position löschen. Sie können also zum Anfang der Zeile navigieren, die Sie löschen möchten, und einfach d50Gdavon ausgehen, dass dies die letzte Zeile ist, die Sie löschen möchten.


10

Es hängt irgendwie davon ab, was dieser große Block ist. Vielleicht dipmöchten Sie nur einen Absatz löschen. In diesem Fall würde a dies tun.


Danke für den Tipp. Leider arbeite ich hier mit Code und benötige normalerweise eine feinkörnigere Steuerung.
Justin Ethier

1
Ich arbeite auch mit Code und trenne logische Blöcke durch eine leere Zeile. Dieser Tipp hat mir gerade den Tag gemacht. Ich kann jetzt große Logikblöcke mit drei Tastenanschlägen löschen.
Miniml

es funktioniert, weil 'd' Löschen bedeutet, 'p' in diesem Zusammenhang Absatz bedeutet
user98761

7

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:

  • Schalter auf visuellen Modus ( V, S-V, ...), wählen Sie den Text mit der Cursorbewegung und drückend
  • Löschen Sie einen ganzen Absatz mit: dap

Ich benutze dap jetzt sehr oft, da ich davon weiß und es vorziehe, es zu dis und dip, aber es löscht immer einen Block und die leere Zeile, die nach dem Block kommt, aber es war eine Möglichkeit, den Block und die leere Zeile zu löschen kommt davor?
Funkodebat

In der Mitte eines Textes mit Absätzen gibt es keinen syntaktischen Unterschied im Ergebnis, oder? Wenn ja, schlage ich vor, das, was Sie wollen, mit Beispielen in eine neue Frage zu schreiben.
Tom Regner

6

Wenn der gesamte Block auf dem Bildschirm sichtbar ist, können Sie die Einstellung für die relative Nummer verwenden. Siehe: Hilfe zur relativen Nummerierung. Verfügbar in 7.3


Ich wusste nicht, wie nützlich: se rnu war, bis ich anfing, es zu benutzen - großartig, um 50dd sowie Navigation zu kennen, 50j
rshdev

3

Sie können den Cursor am Anfang oder Ende des Blocks platzieren und in den visuellen Modus (Umschalt-V) wechseln. Bewegen Sie sich dann einfach nach oben oder unten, bis der gewünschte Block markiert ist. Kopieren Sie zum Schluss den Text durch Drücken von y oder schneiden Sie den Text durch Drücken von d aus.


Vielleicht seltsam, aber daraus habe ich herausgefunden, wie man Text von einem gewünschten Mittelpunkt in einer Zeile auswählt und mehrere Zeilen darunter am selben Punkt bis zum Ende jeder Zeile auswählt. Genau das, wonach ich gesucht habe.
Nanker

3

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


3

Das Zählen von Zeilen ist mir zu langweilig, 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. Cursorbewegungsvorgänge können mit 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 unterhalb des Codeblocks startet, löscht 'd {' den Code und 'd2 {' löscht 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 bei Interesse weitere Cursor-Tricks.


1

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


Die Verwendung dG, die bis zum Ende des Dokuments Ggelöscht wird, ist möglicherweise noch einfacher , da standardmäßig die letzte Zeile angezeigt wird.
andyg0808

1

Löschen eines Textblocks

Angenommen, Ihr Cursor befindet sich am Anfang des Blocks:

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

Erläuterung

  • Aktivieren Sie den "linewise-visual" -Modus: 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 den DSchlüssel neu zu (den folgenden Befehlen)::nnoremap D
  • Aktivieren Sie den "linewise-visual" -Modus: V
  • Markieren Sie bis zur nächsten Leer- / Leerzeichenzeile oder EOF: /^\s*$\\|\%$<CR>
  • Löschen: d
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.