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.


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 <<

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

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}//

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%

:%<

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

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.

3

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

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.