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.

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>

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.


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


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


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.


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!


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?


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



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.

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.