Erneutes Einrücken von schlecht eingerücktem Code

39

Ich mag die Smart-Indent-Funktion von Vim, mit der ich gut eingerückte Codeblöcke erstellen kann.

Ich kopiere / füge regelmäßig Code in die Puffer ein, aber dieser Code ist oft schlecht formatiert.

Ideal wäre es, den Code über das Smart-Indent-System erneut zu verarbeiten.

Ist so etwas möglich?

Wie würden Sie beispielsweise den folgenden Code "reparieren" (einen Auszug aus einem größeren Block - ich möchte nicht jede Zeile manuell reparieren ...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }
rolfl
quelle
1
Handelt es sich um das Einfügen von Code, der ursprünglich schlecht eingerückt war, oder um richtig eingerückten Code, der sich ändert, wenn Sie ihn in Vim einfügen?
Jamessan
Der eingefügte Code ist anfangs schlecht eingerückt. Lassen Sie mich ein Beispiel
hinzufügen

Antworten:

48

Ich mache dies auf zwei Arten.

Einzug angepasste Paste

Erstens, wenn der Code im Puffer formatiert ist, aber auf einer anderen Einrückungsebene, verwende ich ]pstattdessen p, was den Code so einfügt, aber mit der Einrückung, die so verschoben ist, dass die erste eingefügte Zeile dieselbe Tiefe hat wie die Zeile I bin auf

EG-Quelle in den Puffer kopiert

while (1) {
    dostuff();
}

ZB Ergebnis des Einfügens mit ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vim setzt das while auf die gleiche Einrückungsstufe wie int i. Dies geht schnell, funktioniert jedoch nur, wenn der kopierte Code ordnungsgemäß in sich eingerückt ist.

Nach dem Einfügen neu formatieren

Der =Operator in vim formatiert den Code basierend auf den konfigurierten Formatierungsregeln neu. Für kurze Einfügeausschnitte gehe ich in den visuellen Modus mit v, wähle die gerade eingefügten Zeilen aus und drücke dann, um sie neu =zu formatieren.

Bei größeren Pasten nutze ich die Tatsache, dass der Cursor auf die erste eingefügte Zeile zeigt und vim so etwas wie "84 weitere Zeilen" sagt. Ich kann dann eingeben, 84==um diese 84 Zeilen umzufließen (natürlich 84 durch die Anzahl der Zeilen ersetzen, die Sie tatsächlich einfügen).

Verweise

:help ]p für angepasste Einzugspaste

:help =Abdeckungen ={motion}, [count]==und {Visual}=für durch individuelle Filterung oder builtin indent Regeln

John O'M.
quelle
6
Sie können den Code, den Sie im visuellen Modus eingefügt haben, mit `[v`]
craigp
1
@Badger Nur um zu verdeutlichen, ist das Backtick-Bracket-V-Backtick-Bracket?
Phatskat
1
yup .. das textarea ist über die backticks ausgeflippt, also konnte ich es nicht in einen
codeblock schreiben
Der Operator = in vim formatiert den Code basierend auf den konfigurierten Formatierungsregeln neu. Ich würde +100 vergeben, wenn ich könnte. Ich hätte Tage sparen können.
Wossname
1
Ich benutze <Strg + R> "zum Einfügen, damit ich den Einfügemodus nicht verlassen muss. Was ist] p für <Strg + R>"?
A --- B
15

Der =Befehl kann zum erneuten Einrücken verwendet werden.

Wie die meisten Befehle im normalen Modus kann sie auf eine Bewegung angewendet werden, sodass Sie den gerade eingefügten Code mit erneut einfügen können =']. Dies wechselt von der aktuellen Cursorposition zur ']Marke, der letzten Zeile der Paste.

= kann auch im visuellen Modus verwendet werden.

Ein weiterer nützlicher Befehl ist ]p, der auf derselben Einzugsebene wie die aktuelle Zeile eingefügt wird. Dies kann dazu beitragen, ordnungsgemäß eingerückten Text in einer anderen Einrückungstiefe entsprechend dem umgebenden Text einzufügen.

Jamessan
quelle
7

Bei Verwendung von =ap (Mnemonik ist "Absatz formatieren") wird versucht, den aktuellen Absatz automatisch zu formatieren.

Wenn Sie sorgfältig darauf achten möchten, was Sie möglicherweise neu formatieren, ist es möglicherweise vernünftiger und schneller vap, den aktuellen Absatz visuell auszuwählen (was Ihnen einen visuellen Hinweis darauf gibt, was neu formatiert wird), gefolgt von =. Ich finde dies nützlich in Dateien, bei denen ich weiß, dass vim falsch formatiert wird, und ich möchte nicht versehentlich andere Zeilen falsch formatieren.

Davidlowryduda
quelle
4

Verwenden Sie zum erneuten Einfügen einer Datei, die sich bereits im Puffer befindet gg=G: Siehe Einrückung korrigieren

Zum erneuten Einfügen eines Teils einer Datei können verschiedene Begrenzungen auf den =Filter angewendet werden (z. B. wird ==nur die aktuelle Zeile korrigiert ).

Damit der Einzug beim Einfügen von Text unverändert :set pastebleibt, bevor Sie Text in den Puffer einfügen, verhindert dies, dass vim gerade eingefügten Text automatisch einrückt. Nach dem Einfügen können Sie zurückgehen und verwenden, set :nopastewenn Sie fertig sind. Siehe vimdoc hier .

Wenn Sie feststellen, dass Sie häufig etwas einfügen , ist es eine gute Idee, diesen Tipp im VimWiki zu verwenden und eine Taste zum Umschalten des Einfügemodus einzurichten, indem Sie die folgenden Zeilen zu Ihrem hinzufügen .vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Sie können dann drücken, <F2>um den Einfügemodus umzuschalten. vim zeigt die Wörter "PASTE" in der Statuszeile an, wenn der Einfügemodus aktiv ist.

Bhargav Bhat
quelle
2
Bei dieser Frage geht es nicht darum, Code mit Einrückungen einzufügen, sondern schlecht eingerückten Code zu reparieren.
Rolfl
4
Ich habe den von Ihnen geposteten Kommentar nicht gesehen. Sie können jedoch weiterhin verwenden gg=G, um die gesamte Datei erneut einzuspeisen.
Bhargav Bhat
@rolfl Hier beginne ich normalerweise in solchen Fällen: gg=GDann schau dir die Teile an, vimdie falsch sind.
muru
Wenn Sie mehr Kontrolle wünschen (oder den wiederholten Aufwand reduzieren möchten), sollten Sie einen automatischen Befehl hinzufügen, um ein Code-Formatierungs-Tool aufzurufen, wie astyleSie es beim Speichern eines Puffers tun. Einzelheiten finden Sie in dieser Frage zu SO.
Bhargav Bhat
2

Wenn Sie den gesamten Block eines Blocks mit Klammern oder Klammern automatisch neu einrücken möchten, platzieren Sie den Cursor in derselben Zeile, in der sich eine Klammer befindet, und versuchen Sie es =%. Um Ihre Schichtbreite zu ändern, verwenden Sie z :set sw=2.

Wenn dies nicht wie erwartet funktioniert , versuchen Sie es <%mit .(falls erforderlich) , um den Einzug manuell zu verringern ( Auszug ). Verwenden Sie >%für das Gegenteil.

Damit:

else
       {
         // some code
       }

wird:

else
{
  // some code
}

Um für einen bestimmten Code eine oder mehrere Zeilen automatisch einzuziehen, versuchen Sie Folgendes:

  • == um die aktuelle Zeile erneut einzurücken
  • 5== 5 Zeilen neu einrücken

Versuchen Sie Folgendes, um den Einzug für eine oder mehrere Zeilen manuell zu vergrößern / zu verkleinern:

  • << um die aktuelle Zeile um Zwischenräume zu verschieben
  • 5<< um 5 Zeilen um Zwischenräume zu verschieben
  • >> um die aktuelle Zeile um verschobene Leerzeichen einzurücken
  • 5>> um 5 Zeilen um Zwischenräume zu versetzen
  • . bei Bedarf wiederholen

Sie können die Einrückung auch im visuellen Modus ( v) ausführen, indem Sie Text auswählen und =(Auto-Indent), <(De-Indent) oder >(Indent) drücken .

Ein weiterer Trick ist , um eine korrekte Vertiefung der gesamten Datei durch: gg=G.

Wenn Sie Tabulatoren anstelle von Leerzeichen verwenden, verwenden Sie:, :retabwodurch alle Tabulatoren durch Leerzeichen ersetzt werden (siehe: So ersetzen Sie Tabulatoren durch Leerzeichen? ).


Für externe Methoden können Sie versuchen:

  • pythonTidy zum Neuformatieren von Python-Code, zB:

    :%!pythonTidy
    

Verbunden:

Kenorb
quelle
1

Ich habe kürzlich vim-pasta ( https://github.com/sickill/vim-pasta ) installiert , und das scheint die Einrückung von Code beim Einfügen zu verbessern. Die README-Datei enthält auch einige gute Diskussionen zu verschiedenen Strategien zum Einfügen von Code.

Rob Warner
quelle
1

In den vorhandenen Antworten wird bereits vieles behandelt. Ich möchte nur eine Zuordnung hinzufügen, die ich sehr oft zum Einrücken verwende.

nnoremap <Leader>i  mzgg=G`z

Ich habe einige Vimrc gesehen, auf die dies abgebildet ist ===.

In beiden Fällen ist dies eine großartige Zuordnung, die ich fast immer verwende, insbesondere beim Einfügen von Code, der von einer anderen Stelle kopiert wurde.

Oder noch besser, autocmdfügen Sie dies so ein , dass Vim es einrückt, kurz bevor Sie die Änderungen auf die Festplatte schreiben.

Durga Swaroop
quelle