2012-07-25 5 views
11

Ich habe eine richtig XML-Datei formatiert und die als Antwort gegebenen Befehl folgt hier:Formatierung Vim gg mit = G mit xml

How can I autoformat/indent C code in vim?

Ich versuche, automatischen Einzug meine Datei korrekte Verschachtelung anzuzeigen .

Bevor ich versucht, diesen Befehl zu verwenden ich den Dateityp :set ft=xml als Datei auf XML ich mit hat eine Ausdehnung von .mm gestartet, und auch :set nowrap.

Hier ist meine ~/.vimrc Datei:

syntax on 
set history=1000 
set smartindent 
set tabstop=2 
set shiftwidth=2 
set expandtab 

Wie kommt es, wenn ich gg=G ausgeben, ich eine Meldung erhalten, 54 lines indented, doch die Daten bleiben un-verschachtelt?

+1

Keine direkte Antwort, aber haben Sie versucht [xmllint] (http://xmlsoft.org/xmllint.html) --format? – ephemient

+0

Nein, ich habe nicht, ich habe eigentlich keine inhärente Notwendigkeit, die Datei in diesem Moment formatiert zu haben - ich suche wirklich nur nach dem Grund, warum dieser Befehl nicht das tut, was ich in vim erwarte. Danke für den Vorschlag. – grimetime

Antwort

19

falls wollen Sie versuchen, Vim eigenen XML Eindringkörper Sache, können Sie ...

:filetype indent on   (load indent files for specific file types etc.) 
:e       (to reload the current buffer) 

dies die vimscript bei $ VIMRUNTIME/indent/xml laden wird .vim

dann, wenn Sie tun

:set indentexpr?   

... sage es indentexpr = XmlIndentGet (v: LNUM, 1)

~~

xmllint ist aber besser, siehe ... http://vim.wikia.com/wiki/VimTip349

i praktisch Keybinding, wie dies für sie in meinem .vimrc haben!

" one or more lines: 
vmap ,px !xmllint --format -<CR> 

" pretty-print current line 
nmap ,px !!xmllint --format -<CR> 
+1

Ich bin neugierig, warum Sie glauben, xmllint ist besser. Meiner Erfahrung nach ist es übermäßig aggressiv, leere Zeilenumbrüche und Kommentare zu löschen, während Vims eingebauter XML-Indenter _only_ das führende Leerzeichen wie erwartet eindickt. Als Nebenbei zu den Interessierten: Ich hatte große Schwierigkeiten, Vims eingebauten XML-Formatierer überhaupt arbeiten zu lassen, bis ich tpopes [vim-sensible] adoptierte (https://github.com/tpope/vim-sensible) defaults, zu welchem ​​Zeitpunkt alles "gerade funktioniert", einschließlich vims gleich (=) Operator. Siehe auch http://stackoverflow.com/a/28365920/1207769 – ctrueden

5

Versuchen Sie zu tippen: :set equalprg?. Wenn es equalprg= sagt, bedeutet das, dass Sie kein Programm für den Xml-Einzug haben, also macht es wahrscheinlich eine dumme Standardaktion. Hier ist eine Anleitung für die Einstellung xmllint als Formatierer: http://ku1ik.com/2011/09/08/formatting-xml-in-vim-with-indent-command.html

+0

Danke! Das hat super funktioniert. Ich beobachtete einen von [Derek Wyatts vim Screencasts] (http://vimeo.com/15443936) und nahm an, dass vim weiß, wie man xml selbst verschachtelt. – grimetime

+2

Großer Hinweis auf die Anleitung zum Einrichten von xmllint als Formatierer. Das Formatieren von XML kann eine sehr persönliche Sache sein. Beispielsweise möchten Sie möglicherweise nicht jeden Tag in allen Situationen einrücken lassen, oder Sie möchten möglicherweise den Text für lange text() Knoten umbrechen. Eine Alternative zu xmllint könnte also [xmlformat] (http://www.kitebird.com/software/xmlformat/) sein! – darcyparker