Come riordinare il rientro di un file HTML in VI?


130

Come posso correggere il rientro dei suoi enormi file html che erano tutti incasinati?

Ho provato il solito "gg=Gcomando , che è quello che uso per correggere il rientro dei file di codice. Tuttavia, non sembra funzionare correttamente sui file HTML. Ha semplicemente rimosso tutta la formattazione.

Ho anche provato a impostare :filetype = xml, per vedere se indurlo a pensare che si trattasse di un file XML sarebbe stato d'aiuto, ma non lo ha ancora fatto.

Risposte:


91

Con filetype indent ondentro my .vimrc, Vim indentifica i file HTML abbastanza bene.

Esempio semplice con a shiftwidthdi 2:

<html>
  <body>
    <p>
    text
    </p>
  </body>
</html>

15
Copia incolla l'html di questa pagina delle domande in un file html. Apri con VIM, digita "set smartindent", quindi "gg = G" e non corregge il rientro del file.
mmcdole,

15
Per me funziona. set ft = html <cr> set si <cr> gg = G <cr>. Formatta abbastanza bene questa pagina.
Don Reba,

5
+1 ha verificato che "filetype indent on / off" attiva o disattiva la magia.
Wim Coenen,

4
Sì, dopo aver impostato il rientro intelligente, filetype = html e identet del file su di esso ha funzionato per me.
mmcdole,

22
Da chovy.com/web-development/fix-indentation-and-tabs-in-vim ho scoperto che dovevo ricaricare il file con: e dopo il rientro del tipo di file.
Marc Stober,

189

Ci sono diverse cose che devono essere tutte a posto. Solo per riassumere tutti in una posizione:

Imposta la seguente opzione:

:filetype indent on
:set filetype=html           # abbrev -  :set ft=html
:set smartindent             # abbrev -  :set si

Quindi sposta il cursore nella parte superiore del file e rientra alla fine: gg =G
oppure seleziona il testo desiderato per rientrare e premi =per rientrare.


@tyrel, grazie, ma per me non funziona .. Questo è il contenuto del file: pastebin.com/gagia8W2 . Il file si chiama home.html. Non ho alcun problema a rientrare nei file .php. Ecco qui il mio .vimrc: pastebin.com/FAJ0MCA9
ziiweb

1
C'è un modo per impostare questo nel .vimrc? Non voglio dirlo ogni volta che apro un file HTML che è un file HTML. Grazie mille per il collegamento gg, =, G. Davvero utile.
zakishaheen,

1
Si noti che nel vim 7.4le impostazioni predefinite di rientro saranno fallire per questo esempio, come html, bodye pnon sono rientrato per impostazione predefinita. Vedere questa risposta .
Cory Klein,

2
smartindentnon è necessario. Inoltre è ottimizzato per C e C ++, preferisco autoindentinvece utilizzare più generici .
Kos,

Funziona alla grande con vim7.4. @tylerl c'è un modo per rendere permanente questa configurazione per i file html in 7.4?
xaph,

62

Il problema principale nell'uso del rientro intelligente è che se l'XML (o HTML) si trova su una riga in quanto potrebbe finire per tornare da una richiesta di arricciatura, allora gg=Gnon farà il trucco. Invece ho appena sperimentato una buona rientranza usando l'ordine ordinato direttamente da VI:

:!tidy -mi -xml -wrap 0 %

Questo in pratica dice a VI di chiamare in ordine per ripulire un file XML senza avvolgere le linee per adattarle alle linee larghe predefinite di 68 caratteri. Ho elaborato un grande file XML da 29 MB e ci sono voluti 5 o 6 secondi. Immagino che per un file HTML il comando dovrebbe quindi essere:

:!tidy -mi -html -wrap 0 %

Come menzionato nei commenti, tidyè uno strumento di base che puoi trovare su molti sistemi Linux / MacOS di base. Ecco la pagina del progetto nel caso in cui desideri averlo, ma non farlo: HTML Tidy .


1
Non credo che sia necessario html, in quanto per impostazione predefinita è html
lsiebert,

4
D'accordo con te @Isieber. Tuttavia, suppongo che renda più semplice la comprensione della logica e potrebbe persino essere considerata una buona pratica da alcune persone.
oscaroscar

2
Cordiali saluti, riordina ordinatamente se l'HTML include SVG (ad esempio, grafici, ecc.).
Alex Quinn,

1
Sì, se il codice html è su una riga, il comando vim indent non funzionerà!
Wisbucky,

Cosa c'è di diverso da una parola in un dizionario? Questa non è una risposta completa senza collegamento al progetto.
Bruno Bronosky,

49

Come spiega tylerl sopra, imposta quanto segue:

:filetype indent on
:set filetype=html
:set smartindent

Si noti tuttavia che in vim 7.4 i tag HTML html, head, body, e alcuni altri sono non rientrati per impostazione predefinita. Ciò ha senso, poiché quasi tutto il contenuto di un file HTML rientra in tali tag. Se lo desideri davvero, puoi far rientrare quei tag in questo modo:

:let g:html_indent_inctags = "html,body,head,tbody" 

Vedere " Rientro HTML non funzionante in Vim 7.4 compilato, qualche idea? " E " Script di rientro HTML alternativo " per ulteriori informazioni.


questo è il vincitore nel mio libro! Usando Vim 7.4 su Windows e questo funziona in modo fantastico! : D
Michael J

12

Questa è la mia soluzione che funziona bene per aprire HTML "brutti" in modo ben distanziato:

vim fileIn.html -c "set sw=2 | %s/>/>\r/ | execute 'normal gg=G' | set nohlsearch | g/^\\s*\$/d"
  • Il swcomando è perché il mio valore predefinito è 4, che è troppo alto per HTML.
  • La parte successiva aggiunge una nuova riga (Vim pensa che sia un ritorno a capo, sospiro) dopo ogni elemento ( >).
  • Quindi reindirizzare l'intero file con =.
  • Quindi non evidenziare >(dal momento che ho set hlsearchnel mio VIMRC).
  • Quindi rimuovi tutte le righe vuote / solo per gli spazi bianchi (vedi " Vim elimina le righe vuote " per ulteriori informazioni, anche questo ha un doppio escape perché è nella shell).

Puoi anche aggiungere | wq! fileOut.htmlalla fine se non vuoi inserire Vim, ma pulisci semplicemente il file.


Soluzione ordinata! L'ho modificato in :%s/>\s*/>\r/g(aggiunto a gper la sostituzione globale e \s*per eliminare gli spazi bianchi finali). Ho anche aggiunto :%s/</\r</gper aggiungere una nuova riga prima della parentesi aperta. Altrimenti i tag like <td>foo</td>verrebbero divisi come <td>e foo</td>.
Wisbucky,

Punto giusto, ho la sostituzione globale attivata per impostazione predefinita, motivo per cui non è nella mia soluzione.
adam_0,

7

Uso questo script: https://github.com/maksimr/vim-jsbeautify

Nel link sopra hai tutte le informazioni:

  1. Installare
  2. Configura (copia dal primo esempio)
  3. Correre :call HtmlBeautify()

Fa il lavoro magnificamente!


3
ahah, perché dovresti voler usare node + js per ripulire html in vim, che ha questa capacità incorporata da più tempo di quanto esiste anche il nodo ... confonde la mia mente ..
mb21

4

Hai provato a utilizzare lo script di rientro HTML sul sito Vim?


+1, non l'ho visto. Sarebbe bello se non avessi bisogno di eseguire uno script, ma sembra che questo potrebbe essere l'unico modo.
mmcdole,

Questo script è ora obsoleto e una versione più recente viene fornita con vim (ad es /usr/share/vim/vim74/indent/html.vim.). "2014 lug 04: Vim 7.4.356 o successivo include un discendente di questo script (lo script ufficiale è ora gestito da Bram e include enormi cambiamenti)"
wisbucky

4

Ecco una soluzione pesante che ti fa rientrare, oltre a tutta la bella stampa HTML che non ti interessa necessariamente durante la modifica.

Innanzitutto, scarica Tidy . Assicurati di aggiungere il file binario al tuo percorso, in modo da poterlo chiamare da qualsiasi posizione.

Quindi, crea un file di configurazione che descriva il tuo sapore HTML preferito. La documentazione non è eccezionale per Tidy, ma ecco una panoramica e un elenco di tutte le opzioni . Ecco il mio file di configurazione:

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

Salvalo come tidyrc_html.txtnella tua ftplugincartella (sotto vimfiles).

Un altro file: aggiungi la seguente riga a (o crea) html.vim, anche in ftplugin:

map <leader>tidy :%! tidy -config ~/vimfiles/ftplugin/tidyrc_html.txt <CR>

Per usarlo, basta aprire un file HTML e digitare /tidy. (Questa /è la <leader>chiave.)

Ecco qua! Non è una soluzione rapida, in ogni caso, ma ora sei un po 'meglio attrezzato per modificare quei file HTML enormi e incasinati.



0

Ho provato il solito comando "gg = G", che è quello che uso per correggere il rientro dei file di codice. Tuttavia, non sembra funzionare correttamente sui file HTML. Ha semplicemente rimosso tutta la formattazione.

Se l'autoformat / indent di vim gg=Gsembra essere "rotto" (come lasciare il rientro su ogni riga), molto probabilmente il plugin di rientro non è abilitato / caricato. Dovrebbe davvero dare un messaggio di errore invece di fare solo un rientro errato, altrimenti gli utenti pensano semplicemente che la funzione di formattazione automatica / rientro sia terribile, quando in realtà è abbastanza buona.

Per verificare se il plug-in rientro è abilitato / caricato, eseguire :scriptnames. Vedi se .../indent/html.vimè nella lista. In caso contrario, significa che il plug-in non è caricato. In tal caso, aggiungi questa riga a ~/.vimrc:

filetype plugin indent on

Ora se apri il file ed esegui :scriptnames, dovresti vedere .../indent/html.vim. Quindi eseguire gg=G, che dovrebbe eseguire ora il formato automatico / rientro corretto. (Anche se non aggiungerà nuove righe, quindi se tutto il codice html è su una sola riga, non verrà indentato).

Nota: se si esegue :filetype plugin indent onnella riga di comando di vim anziché ~/.vimrc, è necessario riaprire il file :e.

Inoltre, non devi preoccuparti autoindente le smartindentimpostazioni, non sono rilevanti per questo.

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.