Vim indent file xml


101

Sto imparando Vim ma pensavo fosse un compito semplice ma non riesco a farlo funzionare. Ho un browser COSÌ ma le soluzioni non funzionano per me.

Sto cercando di indentare correttamente un file (xml). Il comando che utilizzo è:

gg=G 

o ggVG = (l'ho inventato io stesso probabilmente fa qualcosa di diverso;))

Il mio .vimrc è:

syntax on 
filetype plugin indent on 
set nu 

Qual è l'originale, il risultato e l'output previsto?
— Ingo Karkat

Qual è l'output di :set ft? indentexpr?Legge filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
— Ingo Karkat

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


1
Mi piace aggiungere solo un po 'a questa mappa e m'ggVG=''crearla, che salva semplicemente la linea su cui ti trovi e torna su di essa dopo aver reindentato il file.
— Hovis Biddle

Risposte:


193

Mi piace la risposta di Berei. Tuttavia, penso che quanto segue sia un po 'più flessibile in quanto non devi modificare il tuovimrc file. Inoltre è più facile formattare determinate porzioni del file XML (cosa che faccio spesso).

Innanzitutto, evidenzia l'XML che desideri formattare.

Quindi, in modalità normale, digitare ! xmllint --format -

La tua riga di comando in basso sarà simile a questa:

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

Quindi premi invio.

Spiegazione tecnica

Il testo selezionato viene inviato al xmllintcomando, quindi --format'ed, ei risultati di xmllintvengono posizionati sul testo selezionato in vim. La -fine del comando serve per ricevere lo standard input - che, in questo caso, è il testo selezionato a cui vim invia xmllint.


6
Questo ovviamente funziona solo se hai lo strumento esterno xmllint installato e aggiunto al tuo percorso.
— Polymorphix

66
di semplificare il comando :%!xmllint --format -, %significa l'intera portata di questo file XML.
— hakunami

1
Perché tutti si aspettano che esista uno strumento xmllint? In Ubuntu 15.04 non ce n'è e nemmeno apt-get ne trova uno.
— erikbwork

8
@ erikb85 Da usare apt-cache search, no apt-get, durante la ricerca di pacchetti e contenuto di pacchetti. libxml2-utilscontiene lo strumento mancante.
— ParanoiaPuppy

@hakunami vorrei poterti votare 1000 volte per aver semplificato quel processo
— niken

69

Usa un programma esterno per far rientrare i tuoi xmlfile. In questo caso ho scelto xmllint, quindi imposta il comando equalprgsull'opzione:

:set equalprg=xmllint\ --format\ -

Ora puoi eseguire

gg=G

per far xmllintformattare il tuoxml file.

Per ottenerlo ogni volta che usi , usa un autocommandper impostarlo.

autocommand da un commento qui sotto

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

Non sono sicuro del motivo per cui funziona quindi il principiante, ma lo
— scoprirò

8
Puoi usare quanto segue nel tuo .vimrc per abilitarlo quando modifichi i file xml - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null. Fonte - ku1ik.com/2011/09/08/…
— studgeek

1
Grazie! Molto frustrato con file XML di grandi dimensioni e vim, in Sublime reindirizzano molto rapidamente (5000-10000 linee e dati base64), ma in Vim reindentano diversi minuti. Questa soluzione risolve il problema con file XML di grandi dimensioni. Di nuovo sono felice con Vim.
— Sonique

se sei su Ubuntu, dovrai installare il libxml2-utilspacchetto per ottenere xmllint
— hoffmanc

33

Una soluzione semplice che mi piace e che non richiede alcuno strumento di terze parti è inserire una nuova riga prima di ogni tag di apertura "<...>". Quindi puoi usare l'autoindentazione standard di vim. In breve:

  1. %s/</\r</g
  2. gg=G per rientrare automaticamente

L'ho provato con un grande file xml ed è molto lungo da elaborare.
— Luc M

Grazie. Questo è abbastanza facile e fa il lavoro senza richiedere strumenti esterni.
— attacco aereo

6
Preferisco %s/></>\r</g, in modo che ogni elemento di testo rimanga sulla stessa riga.
— Nicola Musatti

2
@NicolaMusatti O se a volte ci sono spazi tra i tag,%s/> *</>\r</g
— Arthur Tacca

11

Questo è facile da ottenere una volta che ~ / .vimrc è configurato correttamente.

Imposta le seguenti opzioni in ~ / .vimrc:

filetype indent on
set smartindent

Ciò consente di spostare il cursore all'inizio del file e di rientrare alla fine: gg = G

Puoi anche selezionare il testo desiderato con la modalità visuale e premere = per farlo rientrare.


2
Suppongo che sarà .vimrcinvece di .bashrc.
— Birei

1
Ops. Esattamente. Risolto. Grazie.
— jarederaj

Funzionerebbe quando ogni tag è in una riga. Se l'XML non ha spazi né righe finali, questo non farà nulla.
— José Ramón

Ha sempre funzionato per me finché il markup è valido.
— jarederaj

Se il tuo markup non è (coerentemente?) Su linee distinte, puoi cambiarlo in modo sciatto con:% s / </ \ r </ ge quindi:% s / \ n \ n / \ r /
— jarederaj

11

Risposta breve: attiva matchit.vim . Puoi aggiungere packadd matchital tuo .vimrc, o usare vim-sensible , che lo abilita per impostazione predefinita.

Risposta lunga: ho provato molte strategie per indentare automaticamente XML in Vim, incluso l' approccio xmllint discusso nel wiki di Vim . Il problema con xmllint(e lo stesso approccio con altri strumenti CLI esterni come xmlformate tidy, anche) è che tutti insistono per eliminare le nuove righe vuote. Se tutto ciò che vuoi è indentare il tuo XML, senza rimuovere righe vuote, commenti e / o altre formattazioni intenzionali, allora xmllintnon è la scelta migliore.

Si scopre che il comando equals (=) di Vim supporta già XML, a patto che lo script matchit.vim sia abilitato. Un modo semplicissimo per abilitarlo è adottare vim-sensible di tpope . Un altro è aggiungere packadd matchital tuo .vimrc. Quindi, la formattazione XML "funzionerà" immediatamente.


1
Per essere più precisi, sembra che matchit.vimsia la soluzione effettiva. Puoi abilitarlo nel tuo vimrcaggiungendo questa riga:packadd matchit
— Christian Rondeau

1
Grazie Christian; Ho aggiornato la risposta per chiarire che matchit.vim è ciò che risolve il problema.
— ctrueden

Votato perché questo ha funzionato meglio per me. Tuttavia, suggerirei di aggiungere il suggerimento di Christian (packadd matchit) alla risposta breve in quanto è molto semplice e fa il lavoro (almeno per me)
— segna il

@mark Ho aggiornato la risposta per includere il suggerimento di Christian.
— ctrueden

4

In VIM, indento automaticamente l'intero file (utilizzando schede rigide) utilizzando il seguente comando:

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

Il ^Iè un singolo carattere si genera attraverso: CTRL+ v, CTRL+i


1

Ho avuto lo stesso problema. Si è scoperto che la linea

set viewdir=~\.vim\views\

nel mio ha .vimrccausato il problema. Assicurati solo di non averlo.


1

La risposta di Jesse Hogan è buona, ma preferirei una risposta più semplice:

Mentre sei in vim e il tuo file XML è aperto, in modalità normale scrivi questo:

:%!xmllint --format %

quindi premere Invio. Tutto il tuo file XML verrà formattato.

ricorda che dovresti aver installato xmllint prima.


0

per quelli uno che sta usando coc.nvimplug-in, è possibile installare coc-xmlda :CocInstall coc-xml , poi la mappatura dei tasti formato nel file di configurazione: nmap <silent> fm <Plug>(coc-format). D'ora in poi, puoi formattare non solo file xml ma altri file molto facilmente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.