Vim-Einrückungs-XML-Datei


100

Ich lerne Vim, aber ich dachte, das sei eine einfache Aufgabe, aber ich kann sie nicht zum Laufen bringen. Ich habe Browser SO, aber die Lösungen funktionieren nicht für mich.

Ich versuche, eine Datei (xml) korrekt einzurücken. Der Befehl, den ich benutze, ist:

gg=G 

oder ggVG = (selbst gemacht, macht wahrscheinlich etwas anderes;))

Mein .vimrc ist:

syntax on 
filetype plugin indent on 
set nu 

Was ist das Original, das Ergebnis und die erwartete Ausgabe?
Ingo Karkat

Was ist die Ausgabe von :set ft? indentexpr?Liest es filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
Ingo Karkat

Dateityp = xml indentexpr = XmlIndentGet (v: lnum, 1). Yup
Haagenti


1
Ich möchte dieser Karte nur ein wenig hinzufügen m'ggVG=''und sie erstellen, wodurch einfach die Linie gespeichert wird, auf der Sie sich befinden, und nach dem erneuten Einrücken der Datei wieder dorthin zurückgekehrt wird.
Hovis Biddle

Antworten:


192

Ich mag Bereis Antwort. Ich denke jedoch, dass das Folgende etwas flexibler ist, da Sie Ihre vimrcDatei nicht ändern müssen . Außerdem ist es einfacher, ausgewählte Teile der XML-Datei zu formatieren (was ich zufällig oft mache).

Markieren Sie zunächst das XML, das Sie formatieren möchten.

Geben Sie dann im normalen Modus ein ! xmllint --format -

Ihre Befehlszeile unten sieht folgendermaßen aus:

:'<,'>!xmllint --format -

Drücken Sie dann die Eingabetaste.

Technische Erklärung

Der ausgewählte Text wird dann an den xmllintBefehl gesendet--format bearbeitet, und die Ergebnisse von xmllintwerden in vim über dem ausgewählten Text platziert. Das -am Ende des Befehls stehende Element dient zum Empfangen von Standardeingaben. In diesem Fall handelt es sich um den ausgewählten Text, an den vim sendet xmllint.


6
Dies funktioniert natürlich nur, wenn Sie das externe Tool xmllint installiert und Ihrem Pfad hinzugefügt haben.
Polymorphix

65
Um den Befehl zu vereinfachen :%!xmllint --format -, %bedeutet dies den gesamten Umfang dieser XML-Datei.
Hakamami

1
Warum erwarten alle, dass es ein xmllint-Tool gibt? In Ubuntu 15.04 gibt es keine und apt-get kann auch keine finden.
Erikbwork

8
@ erikb85 apt-cache searchNicht verwenden apt-get, wenn nach Paketen und Paketinhalten gesucht wird. libxml2-utilsenthält das fehlende Werkzeug.
ParanoiaPuppy

@hakunami Ich wünschte, ich könnte Sie 1000 Mal für die Vereinfachung dieses Prozesses
upvoten

69

Verwenden Sie ein externes Programm, um Ihre xmlDateien einzurücken . In diesem Fall habe ich ausgewählt xmllint, also setzen Sie den Befehl auf die equalprgOption:

:set equalprg=xmllint\ --format\ -

Jetzt können Sie ausführen

gg=G

um xmllintIhre xmlDateien formatieren zu lassen .

Um es jedes Mal zu bekommen, wenn Sie es verwenden Verwenden Sie ein autocommand, um es einzustellen.

autocommand aus einem Kommentar unten

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null

Ich bin mir nicht sicher, warum dies funktioniert, daher der Anfänger, aber ich werde es herausfinden;) Danke, es funktioniert jetzt;)
Haagenti

8
Sie können Folgendes in Ihrer .vimrc verwenden, um es beim Bearbeiten von XML-Dateien zu aktivieren - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null. Quelle - ku1ik.com/2011/09/08/…
studgeek

1
Danke dir! Sehr frustriert von großen XML-Dateien und vim, in Sublime werden sie sehr schnell neu indiziert (5000-10000 Zeilen und base64-Daten), aber in Vim werden sie einige Minuten neu indiziert. Diese Lösung behebt das Problem mit großen XML-Dateien. Wieder bin ich glücklich mit Vim.
Sonique

Wenn Sie auf Ubuntu sind, müssen Sie das libxml2-utilsPaket installieren , um xmllint
hoffmanc

33

Eine einfache Lösung, die mir gefällt und für die kein Tool von Drittanbietern erforderlich ist, besteht darin, vor jedem öffnenden Tag '<...>' eine neue Zeile einzufügen. Dann können Sie die standardmäßige automatische Einrückung von vim verwenden. Zusamenfassend:

  1. %s/</\r</g
  2. gg=G automatisch einrücken

Ich habe es mit einer großen XML-Datei versucht und es ist sehr lange zu verarbeiten.
Luc M

Danke dir. Dies ist einfach genug und erledigt die Arbeit ohne externe Werkzeuge.
Luftangriff

6
Ich bevorzuge %s/></>\r</g, damit jedes Textelement in derselben Zeile bleibt.
Nicola Musatti

2
@NicolaMusatti Oder wenn es manchmal Leerzeichen zwischen Tags gibt,%s/> *</>\r</g
Arthur Tacca

11

Dies ist leicht zu erreichen, wenn ~ / .vimrc richtig eingerichtet ist.

Stellen Sie die folgenden Optionen in ~ / .vimrc ein:

filetype indent on
set smartindent

Auf diese Weise können Sie den Cursor an den Anfang der Datei bewegen und bis zum Ende einrücken: gg = G.

Sie können den gewünschten Text auch im visuellen Modus auswählen und = drücken, um ihn einzurücken.


2
Ich nehme an, es wird .vimrcstatt sein .bashrc.
Birei

1
Hoppla. Genau. Das wurde behoben. Danke dir.
Jarederaj

Das würde funktionieren, wenn sich jedes Tag in einer Zeile befindet. Wenn das XML keine Leerzeichen oder Endzeilen enthält, würde dies überhaupt nichts bewirken.
José Ramón

Es hat bei mir immer funktioniert, solange das Markup gültig ist.
Jarederaj

Wenn sich Ihr Markup nicht (konsistent?) In bestimmten Zeilen befindet, können Sie dies schlampig ändern mit:% s / </ \ r </ g und dann:% s / \ n \ n / \ r /
jarederaj

11

Kurze Antwort: Schalten Sie matchit.vim ein . Sie können packadd matchitzu Ihrem hinzufügen .vimrcoder vim-sense verwenden , wodurch es standardmäßig aktiviert wird.

Lange Antwort: Ich habe viele Strategien zum automatischen Einrücken von XML in Vim ausprobiert, einschließlich des im Vim-Wiki diskutierten xmllint-Ansatzes . Das Problem mit xmllint(und dem gleichen Ansatz mit anderen externen CLI-Tools wie xmlformatund tidyauch) ist, dass alle darauf bestehen, leere Zeilenumbrüche herauszuquetschen. Wenn Sie lediglich Ihr XML einrücken möchten, ohne Leerzeilen, Kommentare und / oder andere absichtliche Formatierungen zu entfernen, xmllintist dies nicht die beste Wahl.

Es stellt sich heraus, dass der Befehl equals (=) von Vim bereits XML unterstützt, solange das Skript matchit.vim aktiviert ist. Eine super einfache Möglichkeit, dies zu ermöglichen, besteht darin, das vim-sensible von tpope zu übernehmen . Eine andere ist, packadd matchitzu Ihrem hinzuzufügen .vimrc. Dann funktioniert die XML-Formatierung sofort.


1
Genauer gesagt scheint matchit.vimes die eigentliche Lösung zu sein. Sie können es in Ihrem aktivieren, vimrcindem Sie diese Zeile hinzufügen:packadd matchit
Christian Rondeau

1
Danke Christian; Ich habe die Antwort aktualisiert, um zu verdeutlichen, dass matchit.vim das Problem löst.
ctrueden

Upvoted, weil das für mich am besten funktioniert hat. Ich würde jedoch vorschlagen, Christians Vorschlag (packadd matchit) zu der kurzen Antwort hinzuzufügen, da er sehr einfach ist und die Arbeit erledigt (zumindest für mich)
markieren Sie den

@mark Ich habe die Antwort aktualisiert, um Christians Vorschlag aufzunehmen.
ctrueden

4

In VIM rücke ich die gesamte Datei automatisch ein (mit festen Registerkarten), indem ich den folgenden Befehl verwende:

:%!XMLLINT_INDENT="^I" xmllint --format -

Das ^Iist ein einzelnes Zeichen, das Sie generieren über: CTRL+ v, CTRL+i


1

Ich hatte das gleiche Problem. Es stellte sich heraus, dass die Linie

set viewdir=~\.vim\views\

in meinem .vimrcverursachte das Problem. Stellen Sie nur sicher, dass Sie es nicht haben.


1

Jesse Hogans Antwort ist gut, aber ich möchte lieber eine einfachere Antwort:

Während Sie sich in vim befinden und Ihre XML-Datei geöffnet ist, schreiben Sie im normalen Modus Folgendes:

:%!xmllint --format %

Drücken Sie dann die Eingabetaste. Ihre gesamte XML-Datei wird formatiert.

Denken Sie daran, dass Sie xmllint vorher installiert haben sollten .


0

für diejenigen ein , die unter Verwendung von coc.nvimPlugin können Sie installieren coc-xmldurch :CocInstall coc-xml , dann Format abbildet Schlüssel in Ihrer Konfigurationsdatei: nmap <silent> fm <Plug>(coc-format). Von nun an können Sie nicht nur XML-Dateien, sondern auch andere Dateien ganz einfach formatieren

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.