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.