vim: lösche die ersten 2 Leerzeichen für mehrere Zeilen

79

Was ist der einfachste Weg, um die ersten 2 Leerzeichen für jede Zeile mit VIM zu löschen? Grundsätzlich wird "2x" für jede Zeile wiederholt.

Klarstellung: Hier wird davon ausgegangen, dass die ersten 2 Zeichen Leerzeichen sind. Es geht also darum, mehrere Zeilen zusammen einzurücken.

Twimo
quelle
Ist es speziell Leerzeichen oder die ersten beiden Zeichen, unabhängig davon, was sie sind?
Jason Down
Es sind die ersten beiden Zeichen. Angenommen, die ersten beiden Zeichen sind Leerzeichen.
Twimo
Ich habe einen Weg gezeigt, dies durch Suchen und Ersetzen im Ex-Editor-Modus zu tun. Ein Weg garantiert, dass dies nur für Zeilen möglich ist, die mit zwei Leerzeichen beginnen (und nur zwei Leerzeichen entfernen). Der andere macht nur die ersten beiden Charaktere fertig, unabhängig davon, was sie sind.
Jason Down
Vim-Fragen sind bei SO kein Thema (siehe Diskussionen zu Meta und ... SO-FAQ). Außerdem Vertiefung ist relevant für die Entwicklung ...
Luc Hermitte

Antworten:

93

Einige weitere Optionen. Sie können entscheiden, welcher der "einfachste Weg" ist.

Entfernen Sie die ersten 2 Zeichen jeder Zeile:

:%normal 2x

Entfernen Sie die ersten 2 Zeichen jeder Zeile nur, wenn es sich um Leerzeichen handelt:

:%s/^  /

Beachten Sie, dass der letzte Schrägstrich optional ist und nur hier angezeigt wird, damit Sie die beiden Leerzeichen sehen können. Ohne den Schrägstrich sind es nur 7 Zeichen, einschließlich des :.

Bewegen Sie den Einzug für jede Zeile nach links:

:%normal <<
Bhinesley
quelle
11
Ich finde es toll, dass es in Vim 30 verschiedene Möglichkeiten gibt, etwas zu tun. Fragen wie diese werfen Dinge auf, von denen Sie nie etwas gewusst haben. Ich hatte keine Ahnung von% normal.
Jason Down
Vielen Dank für die Klarstellung zum letzten Strich. Das ist hilfreich.
Ryanjdillon
1
Ich werde hinzufügen, dass das %Zeichen einfach bedeutet "Führen Sie diesen Befehl für jede Zeile im Dokument aus, nicht nur für die aktuelle Zeile". Ich denke. Ich kann nicht viel Dokumentation darüber finden.
Sammaron
118
  1. Aktivieren Sie den visuellen Blockmodus mit Ctrl-V(oder Ctrl-Qwenn Sie Ctrl-Vzum Einfügen verwenden).
  2. Wählen Sie den zu löschenden Bereich mit den Pfeilen aus.
  3. Drücken Sie dann d, um den ausgewählten Bereich zu löschen.
  4. Drücken Sie Esc
Tom Kerr
quelle
7
Strg-V, um auszuwählen, welche Zeichen entfernt werden sollen, und dann d für den Schnitt.
Henrik K
2
Top Markierte Antwort! :-)
Nikos Alexandris
Dies funktioniert nicht in allen von mir verwendeten Vims, aber für diejenigen, die es funktioniert, ist es sehr praktisch und es ist schön, den Bereich, den Sie löschen, visualisieren zu können, bevor Sie es tatsächlich tun.
Searchengine27
Andere Standardbindung für den visuellen Blockmodus vielleicht? Möglicherweise ein Unterschied zwischen älteren Unix-Distribution-VI (im Gegensatz zu VIM).
Tom Kerr
Dies ist wahrscheinlich die einfachste und vernünftigste Antwort.
Willem van Ketwich
13

Sie können auch suchen und ersetzen (im Ex-Editor, auf den über das :Zeichen zugegriffen wird ):

Entfernen Sie die ersten beiden Zeichen, egal was passiert:

%s/^.\{2}//

Entfernen Sie die ersten beiden Leerzeichen (muss am Anfang stehen und beide müssen Leerzeichen sein ... jede Zeile, die diesen Kriterien nicht entspricht, wird übersprungen):

%s/^\s\{2}//
Jason Down
quelle
2
Das / g am Ende ist überflüssig. Du machst nur ein Match pro Zeile.
Bhinesley
Imo das ist eine großartige Lösung
Victoria Stuart
7

Angenommen, a shiftwidth=2, dann wird Shift mit einem Bereich von verwendet%

:%<
Peter Rincker
quelle
4

Zwei Leerzeichen oder zwei Zeichen? ( 2xmacht das letztere.)

:[range]s/^  //

löscht zwei Leerzeichen am Anfang jeder Zeile; Verwenden Sie %(entspricht 1,$) [range]dies für die gesamte Datei.

:[range]s/^..//

löscht die ersten beiden Zeichen jeder Zeile, unabhängig davon, um was es sich handelt. (Beachten Sie, dass zwei Zeichen gelöscht werden , nicht unbedingt zwei Spalten . Ein Tabulatorzeichen zählt als ein Zeichen.)

Wenn Sie den Einzug wirklich ändern, können Sie ihn mit dem <Befehl verringern oder mit dem >Befehl vergrößern. Stellen Sie ein, um shiftwidthzu steuern, wie weit es sich verschiebt, z

:set shiftwidth=2
Keith Thompson
quelle
3

Ich würde einen von zwei Ansätzen ausprobieren:

  1. Führen Sie eine Spaltenbearbeitung für den zu löschenden Block durch Ctrl+V(häufig zugeordnet Ctrl+Q).
  2. Zeichnen Sie ein Makro in der ersten Zeile mit q1(oder einer anderen Zahl / einem anderen Buchstaben, den Sie als Aufzeichnungsregister bezeichnen möchten) auf und spielen Sie dieses Makro dann mehrmals mit ab @1(um mein vorheriges Beispiel zu verwenden. Verwenden Sie noch besser eine vorhergehende Zahl, um anzugeben, wie viele Ausführungszeiten - 10@1zum Beispiel 10-maliges Ausführen dieses Makros. Dies hängt jedoch davon ab, was Sie aufgezeichnet haben. Stellen Sie sicher, dass Sie den Cursor zurückspulen 0oder eine Zeile fallen lassen j, falls dies relevant ist.
sa125
quelle
3

Ich würde auch hinzufügen: Erfahren Sie, wie Sie Einrückungen für vim konfigurieren. Dann reicht ein einfacher gg=G.

Luc Hermitte
quelle