Wie räume ich den Einzug einer HTML-Datei in VI auf?

130

Wie behebe ich den Einzug seiner riesigen HTML-Dateien, die alle durcheinander waren?

Ich habe den üblichen "gg=GBefehl ausprobiert , mit dem ich das Einrücken von Codedateien korrigiere. Bei HTML-Dateien schien es jedoch nicht richtig zu funktionieren. Es wurden einfach alle Formatierungen entfernt.

Ich habe auch versucht, Einstellungen :filetype = xmlvorzunehmen, um zu sehen, ob es hilfreich ist, zu glauben, dass es sich um eine XML-Datei handelt, aber das hat es immer noch nicht getan.

mmcdole
quelle

Antworten:

91

In filetype indent onmeinem Inneren .vimrcrückt Vim HTML-Dateien ganz gut ein.

Einfaches Beispiel mit einem shiftwidthvon 2:

<html>
  <body>
    <p>
    text
    </p>
  </body>
</html>
Moinudin
quelle
15
Kopieren Fügen Sie das HTML dieser Fragenseite in eine HTML-Datei ein. Öffnen Sie mit VIM, geben Sie "set smartindent" und dann "gg = G" ein, und das Einrücken der Datei wird nicht behoben.
mmcdole
15
Für mich geht das. setze ft = html <cr> setze si <cr> gg = G <cr>. Formatiert diese Seite recht gut.
Don Reba
5
+1 verifiziert, dass "Dateityp Einzug ein / aus" die Magie ein- oder ausschaltet.
Wim Coenen
4
Ja, nachdem Sie den intelligenten Einzug festgelegt haben, haben Dateityp = HTML und Dateitypident für mich funktioniert.
mmcdole
22
Unter chovy.com/web-development/fix-indentation-and-tabs-in-vim wurde festgestellt, dass ich die Datei neu laden musste mit: e nach dem Einzug des Dateityps auf.
Marc Stober
188

Es gibt mehrere Dinge, die alle vorhanden sein müssen. Um sie alle an einem Ort zusammenzufassen:

Stellen Sie die folgende Option ein:

:filetype indent on
:set filetype=html           # abbrev -  :set ft=html
:set smartindent             # abbrev -  :set si

Bewegen Sie dann entweder den Cursor an den Anfang der Datei und rücken Sie bis zum Ende ein: gg =G
Oder wählen Sie den gewünschten Text zum Einrücken aus und =drücken Sie, um ihn einzurücken.

tylerl
quelle
@tyrel, danke, aber für mich funktioniert nicht .. Dies ist der Inhalt der Datei: pastebin.com/gagia8W2 . Die Datei wird aufgerufen home.html. Ich habe kein Problem damit, .php-Dateien einzurücken. Hier haben Sie meine .vimrc: pastebin.com/FAJ0MCA9
ziiweb
1
Gibt es eine Möglichkeit, dies in der .vimrc einzustellen? Ich möchte nicht jedes Mal, wenn ich eine HTML-Datei öffne, sagen, dass es sich um eine HTML-Datei handelt. Vielen Dank für die Verknüpfung gg, =, G. Wirklich praktisch.
Zakishaheen
1
Beachten Sie, dass vim 7.4die Standardeinrückungseinstellungen für dieses Beispiel als , fehlschlagen und standardmäßig nicht eingerückt sind. Siehe diese Antwort . htmlbodyp
Cory Klein
2
smartindentist nicht notwendig. Außerdem ist es auf C und C ++ abgestimmt. Ich bevorzuge es, autoindentstattdessen allgemeinere zu verwenden.
Kos
Es funktioniert gut mit vim7.4. @tylerl Gibt es eine Möglichkeit, diese Konfiguration für HTML-Dateien in 7.4 dauerhaft zu machen?
Xaph
62

Das Hauptproblem bei der Verwendung der intelligenten Einrückung besteht darin, dass, wenn sich das XML (oder HTML) in einer Zeile befindet, da es möglicherweise von einer Curl-Anforderung zurückkommt, dies gg=Gnicht ausreicht. Stattdessen habe ich gerade eine gute Einrückung mit ordentlich direkt aus VI aufgerufen erlebt:

:!tidy -mi -xml -wrap 0 %

Dies weist VI grundsätzlich an, ordentlich aufzurufen, um eine XML-Datei zu bereinigen, ohne die Zeilen zu umbrechen, damit sie in die standardmäßig 68 Zeichen breiten Zeilen passen. Ich habe eine große 29-MB-XML-Datei verarbeitet und es dauerte 5 oder 6 Sekunden. Ich denke für eine HTML-Datei sollte der Befehl daher lauten:

:!tidy -mi -html -wrap 0 %

Wie in den Kommentaren erwähnt, tidyhandelt es sich um ein grundlegendes Tool, das Sie auf vielen Linux / MacOS-Basissystemen finden können. Hier ist die Seite des Projekts, falls Sie es wünschen, aber nicht: HTML Tidy .

oscaroscar
quelle
1
Ich glaube nicht, dass HTML benötigt wird, da es standardmäßig HTML ist
lsiebert
4
Einverstanden mit Ihnen @Isieber. Ich denke jedoch, dass es das Verständnis der Logik erleichtert und von einigen Leuten sogar als gute Praxis angesehen werden kann.
Oscaroscar
2
Zu Ihrer Information, ordentliche Drosseln, wenn der HTML-Code SVG enthält (z. B. Diagramme usw.).
Alex Quinn
1
Ja, wenn sich der HTML-Code in einer Zeile befindet, funktioniert der Befehl vim indent nicht!
wisbucky
Was ist ordentlich außer einem Wort in einem Wörterbuch? Dies ist keine vollständige Antwort ohne Verknüpfung mit dem Projekt.
Bruno Bronosky
49

Stellen Sie, wie oben erläutert, Folgendes ein:

:filetype indent on
:set filetype=html
:set smartindent

Beachten Sie jedoch, dass in vim 7.4 die HTML - Tags html, head, body, und einige andere sind nicht standardmäßig eingerückt. Dies ist sinnvoll, da fast der gesamte Inhalt einer HTML-Datei unter diese Tags fällt. Wenn Sie wirklich möchten, können Sie diese Tags wie folgt einrücken lassen:

:let g:html_indent_inctags = "html,body,head,tbody" 

Weitere Informationen finden Sie unter " HTML-Einzug funktioniert in kompiliertem Vim 7.4 nicht, irgendwelche Ideen? " Und " Alternatives HTML-Einrückungsskript ".

Cory Klein
quelle
Das ist der Gewinner in meinem Buch! Mit Vim 7.4 unter Windows funktioniert das fantastisch! : D
Michael J
12

Dies ist meine Lösung, die sich gut zum Öffnen von "hässlichem" HTML in einem gut verteilten Abstand eignet:

vim fileIn.html -c "set sw=2 | %s/>/>\r/ | execute 'normal gg=G' | set nohlsearch | g/^\\s*\$/d"
  • Der swBefehl ist, weil mein Standardwert 4 ist, was für HTML zu hoch ist.
  • Der nächste Teil fügt nach jedem Element ( >) eine neue Zeile hinzu (Vim glaubt, es sei ein Wagenrücklauf, seufz ).
  • Dann die gesamte Datei mit erneut einrücken =.
  • Dann nicht hervorheben >(da ich set hlsearchin meinem vimrc habe).
  • Entfernen Sie dann alle leeren / Nur-Leerzeichen-Zeilen (weitere Informationen finden Sie unter " Löschen von Leerzeilen "). Dies ist auch doppelt maskiert, da es sich in der Shell befindet.

Sie können sogar | wq! fileOut.htmlam Ende hinzufügen , wenn Sie Vim überhaupt nicht eingeben möchten, sondern nur die Datei bereinigen möchten.

adam_0
quelle
Ordentliche Lösung! Ich habe es geändert zu :%s/>\s*/>\r/g(ein gfür globales Ersetzen hinzugefügt und \s*nachgestellte Leerzeichen entfernt). Ich habe auch hinzugefügt :%s/</\r</g, um eine neue Zeile vor der offenen Klammer hinzuzufügen. Andernfalls würden Tags <td>foo</td>wie <td>und geteilt foo</td>.
wisbucky
Fairerweise habe ich das globale Ersetzen standardmäßig aktiviert, weshalb es nicht in meiner Lösung enthalten ist.
Adam_0
7

Ich benutze dieses Skript: https://github.com/maksimr/vim-jsbeautify

Im obigen Link haben Sie alle Informationen:

  1. Installieren
  2. Konfigurieren (Kopie aus dem ersten Beispiel)
  3. Lauf :call HtmlBeautify()

Macht den Job wunderbar!

SimonW
quelle
3
haha, warum möchten Sie Knoten + js verwenden wollen , um aufzuräumen html in vim, die noch existiert diese Fähigkeit builtin länger als Knoten hatte ... bin unschlüssig ..
MB21
4

Haben Sie versucht, das HTML-Einrückungsskript auf der Vim-Site zu verwenden?

JaredPar
quelle
+1, das habe ich nicht gesehen. Es wäre schön, wenn ich kein Skript ausführen müsste, aber es sieht so aus, als wäre dies der einzige Weg.
mmcdole
Dieses Skript ist jetzt veraltet und eine neuere Version wird mit vim (z /usr/share/vim/vim74/indent/html.vim. B. ) geliefert . "2014 Jul 04: Vim 7.4.356 oder höher enthält einen Nachkommen dieses Skripts (das offizielle Skript wird jetzt von Bram gepflegt und enthält massive Änderungen)"
wisbucky
4

Hier ist eine schwergewichtige Lösung, mit der Sie einrücken können, sowie all das hübsche HTML-Drucken, um das Sie sich beim Bearbeiten nicht unbedingt kümmern möchten.

Laden Sie zuerst Tidy herunter . Stellen Sie sicher, dass Sie die Binärdatei zu Ihrem Pfad hinzufügen, damit Sie sie von jedem Ort aus aufrufen können.

Erstellen Sie als Nächstes eine Konfigurationsdatei, die Ihre bevorzugte HTML-Variante beschreibt. Die Dokumentation ist für Tidy nicht besonders gut, aber hier ist eine Übersicht und eine Liste aller Optionen . Hier ist meine Konfigurationsdatei:

bare: yes
break-before-br: no
clean: yes
drop-proprietary-attributes: yes
fix-uri: yes
indent-spaces: 4
indent: yes
logical-emphasis: yes
markup: yes
output-xhtml: yes
quiet: yes
quote-marks: yes
replace-color: yes
tab-size: 4
uppercase-tags: no
vertical-space: yes
word-2000: yes
wrap: 0

Speichern Sie dies wie tidyrc_html.txtin Ihrem ftpluginOrdner (unter vimfiles).

Noch eine Datei: Fügen Sie die folgende Zeile hinzu (oder erstellen Sie sie) html.vim, auch in ftplugin:

map <leader>tidy :%! tidy -config ~/vimfiles/ftplugin/tidyrc_html.txt <CR>

Um es zu verwenden, öffnen Sie einfach eine HTML-Datei und geben Sie ein /tidy. (Das /ist der <leader>Schlüssel.)

Los geht's! Auf keinen Fall eine schnelle Lösung, aber jetzt sind Sie ein bisschen besser gerüstet, um diese riesigen, durcheinandergebrachten HTML-Dateien zu bearbeiten.

Lemur
quelle
0

Ich habe den üblichen Befehl "gg = G" ausprobiert, mit dem ich das Einrücken von Codedateien korrigiere. Bei HTML-Dateien schien es jedoch nicht richtig zu funktionieren. Es wurden einfach alle Formatierungen entfernt.

Wenn vims Autoformat / Einzug gg=G "defekt" zu sein scheint (z. B. das Einrücken jeder Zeile nach links), ist das Einrückungs-Plugin höchstwahrscheinlich nicht aktiviert / geladen. Es sollte wirklich eine Fehlermeldung geben, anstatt nur ein schlechtes Einrücken durchzuführen, andernfalls denken Benutzer einfach, dass die Funktion zum automatischen Formatieren / Einrücken schrecklich ist, wenn sie tatsächlich ziemlich gut ist.

Führen Sie aus, um zu überprüfen, ob das Einrückungs-Plugin aktiviert / geladen ist :scriptnames. Überprüfen Sie, ob .../indent/html.vimin der Liste enthalten ist. Wenn nicht, bedeutet dies, dass das Plugin nicht geladen ist. Fügen Sie in diesem Fall diese Zeile hinzu zu ~/.vimrc:

filetype plugin indent on

Wenn Sie nun die Datei öffnen und ausführen :scriptnames, sollten Sie sehen .../indent/html.vim. Führen Sie dann aus gg=G, was jetzt das richtige automatische Formatieren / Einrücken bewirken sollte. (Obwohl keine Zeilenumbrüche hinzugefügt werden. Wenn sich der gesamte HTML-Code in einer einzelnen Zeile befindet, wird er nicht eingerückt.)

Hinweis: Wenn Sie statt in :filetype plugin indent onder vim-Befehlszeile ausgeführt werden ~/.vimrc, müssen Sie die Datei erneut öffnen:e .

Auch Sie sich keine Sorgen machen müssen über autoindentund smartindentEinstellungen, sie sind nicht relevant für diese.

wisbucky
quelle