Wie behebe ich den Einzug einer ganzen Datei in Vi?

625

Was ist in Vim der Befehl, um die Einrückung aller Zeilen zu korrigieren?

Oft kopiere ich Code und füge ihn in ein Remote-Terminal ein und lasse das Ganze durcheinander bringen. Ich möchte das auf einen Schlag beheben.

mmcdole
quelle
8
Vorbeugung ist besser als Heilung. In diesem Sinne kommt dieser Kommentar. Führen Sie ein ": set paste" aus, bevor Sie in den Einfügemodus wechseln und den Code vom Remote-Terminal einfügen.
Chthonic Project

Antworten:

1215

=kann der Einrückungsbefehl Bewegungen annehmen. Also, ggum den Anfang der Datei =zu bekommen, um Gbis zum Ende der Datei einzurücken , gg=G.

Logan Capaldo
quelle
39
Ich werde mein wertvolles 1G nie verlernen können =) Einer meiner Favoriten ist =%, der auf einer öffnenden Klammer steht. Es korrigiert die Einrückungen des gesamten Blocks.
PEZ
2
: 0 <return> ist nicht so schlecht, aber gg ist nett. (Ja, ich habe es zuerst gelernt)
Erik Olson
8
Kann ich die gesamte Datei einrücken, ohne die aktuelle Zeile zu verlassen?
Fábio Perez
86
@ Fábio: ''(zwei einfache Anführungszeichen) bringt dich zurück zu dem Ort, an dem du warst, gg=G''sollte also einrücken und dann zurückkehren.
Nemo157
@ArchimedesTrajano Mac OS ist sehr alt. Ich empfehle die HomeBrew-Version. es ist viel neuer. Ich hatte einige nervige Probleme mit Macs Vim. Außerdem habe ich gehört, dass Sie sich nicht mit dem integrierten Gerät anlegen sollten. Versuchen Sie also nicht, es selbst zu aktualisieren, es sei denn, Sie sind sehr vorsichtig.
AlexMA
126

Versuchen Sie es vor dem Einfügen in das Terminal :set pasteund dann, :set nopastewenn Sie fertig sind. Dadurch werden der automatische Einzug, der Zeilenumbruch und andere Funktionen deaktiviert, die Ihre Paste durcheinander bringen.

edit: Außerdem sollte ich darauf hinweisen, dass ein viel besseres Ergebnis als das =Einrücken normalerweise mit einem externen Programm erzielt werden kann. Zum Beispiel laufe ich die :%!perltidyganze Zeit. astyle, cindentEtc. können auch verwendet werden. Natürlich können Sie diese einem Tastenanschlag zuordnen und je nach Dateityp unterschiedliche Tastenanschläge zuweisen.

derobert
quelle
5
Sie können die equalprgOption in einem ftplugin so einstellen =, dass anstelle eines benutzerdefinierten Tastenbelegs ein externer Filter zum Einrücken verwendet wird.
Josh Lee
Es gibt auch eine Pastetoggle-Tastenkombination, z. : setze pt \ p um zwischen den Modi zu
wechseln
Hinweis: In der vimconfig von grml ist die Pastetoggle-Taste F11
Thomas
Ich benutze formatpgmmit ordentlich und Astyle und dann gq. Hier sind einige Beispiele aus meinem .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmlundau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian
Gerade perltidy heruntergeladen, nachdem Sie dies gelesen haben, es ist so viel besser als der Standard-Vim-Auto-Einzug
Joey Ciechanowicz
29

Wenn Sie den Block, in dem Sie sich befinden, erneut einrücken möchten, ohne Akkorde eingeben zu müssen, haben Sie folgende Möglichkeiten:

[[=]]
Andrew Wagner
quelle
1
Tut mir leid, das wiederzubeleben, aber was hast du mit Akkorden gemeint? Koordinaten?
John P
7
"Akkorde" bezieht sich hier auf Befehle, die ausgegeben werden, indem eine Taste gedrückt gehalten wird, während eine andere gedrückt wird. In Analogie zu Musikakkorden erklingen mehrere Noten gleichzeitig. Also ist G Shift + G, ^] ist Strg +] und so weiter. Die Eingabe dauert länger als bei Einzelschlüsselbindungen.
Ralph Giles
Sie können auch verwenden, =aBwas den Cursor überhaupt nicht bewegt.
Amin
7
Für die nordische Tastatur [[=]]sind 5 Akkorde erforderlich :(
k4kuz0
29

Der Meister aller Befehle ist

gg=G

Dies rückt die gesamte Datei ein!

Im Folgenden finden Sie einige einfache und elegante Befehle zum schnellen Einrücken von Zeilen in Vim oder gVim.

Zum Einrücken aller Zeilen unterhalb der aktuellen Zeile

=G

Einrücken der aktuellen Zeile

==

nZeilen unterhalb der aktuellen Zeile einrücken

n==

Zum Beispiel, um 4 Zeilen unterhalb der aktuellen Zeile einzurücken

4==

Um einen Codeblock einzurücken, gehen Sie zu einer der geschweiften Klammern und verwenden Sie den Befehl

=%
Sagar Jain
quelle
17

Sie können ordentliche Anwendungen / Dienstprogramme verwenden, um HTML- und XML-Dateien einzurücken, und es funktioniert ziemlich gut beim Einrücken dieser Dateien.

Verschönern Sie eine XML-Datei

:!tidy -mi -xml %

Verschönern Sie eine HTML-Datei

:!tidy -mi -html %
Naga Kiran
quelle
16

Drücken Sie die Esc-Taste und geben Sie die folgenden Kombinationen schnell ein:

gg=G
tokhi
quelle
28
Ich habe langsam getippt, du wirst nicht glauben, was als nächstes passiert ist.
k0pernikus
Ich habe nur die Antwort und den Kommentar positiv bewertet, weil das von unschätzbarem Wert war! lol @ k0pernikus
gglasses
12

1G=G. Das sollte alle Zeilen in der Datei einrücken. 1GNimmt Sie die erste Zeile, =startet den automatischen Einzug und Gdie letzte Zeile führt Sie zur letzten Zeile in der Datei.

Amjith
quelle
Oder sogar1gg=G
Biggybi
1G = G hat es für mich behoben. Genial!
Natus Drew
8

:set pasteist dein Freund Ich benutze Kitt und kopiere am Ende Code zwischen Windows. Bevor ich auf :set paste(und :set nopaste) Kopieren / Einfügen eingestellt wurde, gab es mir genau aus diesem Grund Passungen.

Elsporko
quelle
1
Ja, ich benutze auch Kitt. : Paste setzen ist fantastisch
mmcdole
7

Verwenden Sie in Vim :insert. Dadurch bleibt Ihre gesamte Formatierung erhalten und es wird keine automatische Einrückung durchgeführt. Weitere Informationen help :insert.

Eric Johnson
quelle
7

Wenn Sie nicht mit der :set pastemittleren Maustaste klicken möchten , set nopastekönnen Sie auch den Inhalt der Zwischenablage einfügen:

"*p
"+p

Auf diese Weise müssen Sie den normalen Modus nicht verlassen. Wenn Sie den Text einfügen müssen +oder *davon abhängen, wie Sie ihn ausgewählt haben, lesen Sie :help quoteplus.

0x89
quelle
4

vim-autoformat formatiert Ihre Quelldateien mit externen Programmen, die für Ihre Sprache spezifisch sind, z. B. das Juwel "rbeautify" für Ruby-Dateien, das Paket "js-beautify" npm für JavaScript.

Wojtek Kruszewski
quelle
3

Bei komplexen C ++ - Dateien erhält vim nicht immer die richtige Formatierung, wenn der =Filterbefehl von vim verwendet wird . In solchen Situationen ist es daher besser, einen externen C ++ - Formatierer wie astyle (oder uncrustify ) zu verwenden, z.

:%!astyle

Die Funktion '=' von Vim verwendet standardmäßig den internen Formatierer (was nicht immer richtig ist). Sie können ihn jedoch auch mithilfe eines externen Formatierers wie astyle einstellen, indem Sie ihn wie in dieser Frage beschrieben entsprechend einrichten .

Pierz
quelle
1

Sie können ein Mapping erstellen, um dies für Sie zu tun.

Dieser wird die gesamte Datei automatisch einrücken und den Cursor weiterhin an der Position halten, an der Sie sich befinden:

nmap <leader>ai mzgg=G`z
Sergio D. Márquez
quelle
0

Verwenden Sie für vi Editor: Einfügen. Dadurch bleibt Ihre gesamte Formatierung erhalten und es wird kein automatisches Einrücken eingefügt. Drücken Sie anschließend die Esc-Taste, um die tatsächlich formatierte Datei anzuzeigen. Andernfalls werden einige Müllzeichen angezeigt. wie ^ ich zB:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}
ps2090
quelle
0

Wechseln Sie in vim einfach in den visuellen Modus und wählen Sie nach der Auswahl von nach oben und unten aus. Drücken Sie einfach =. Alle ausgewählten Zeilen werden eingerückt.

Ramanand Yadav
quelle
Ich würde das vermeiden. Der visuelle Modus ist für den Fall gedacht, dass Sie sich über Ihre Bewegungen nicht sicher sind und wissen, wie man eine Reihe von Zeichen erfasst. Der zusätzliche Schritt, in den visuellen Modus zu wechseln, macht keinen Sinn. Warum, ggvG=wenn du kannst gg=G. Was war der Sinn, um die Bewegung sichtbar zu machen? Das gilt für alle Aktionen, die Bewegungen ausführen.
Alextes