Domanda

Io uso emacs per modificare il mio file xml (nxml-mode) e i file sono stati generati dalla macchina, che non hanno alcun bella formattazione dei tag.

Ho cercato piuttosto di stampa l'intero file con l'indentazione e salvarlo, ma non sono riuscito a trovare un modo automatico.

C'è un modo?O almeno alcuni editor su linux che può farlo.

È stato utile?

Soluzione

Io uso modalità nXML per l'editing e la In ordine quando ho voglia di formattare e di rientro XML o HTML.C'è anche un'interfaccia Emacs per Riordinare.

Altri suggerimenti

Non hai nemmeno bisogno di scrivere la vostra propria funzione - sgml-mode (gnu emacs core module), che ha un built-in graziosa stampa funzione chiamata (sgml-bella stampa ...) che prende in regione inizio e la fine di argomenti.

Se si deve tagliare e incollare xml e si trova che il terminale è tagliare le linee arbitrarie posti è possibile utilizzare questo bella stampante che fissa le linee interrotte prima.

Se avete solo bisogno di abbastanza rientro senza introdurre nuove interruzioni di linea, è possibile applicare il indent-region comando per l'intero buffer con questi tasti:

C-x h
C-M-\

Se avete anche bisogno di introdurre interruzioni di linea, in modo che il tag di apertura e chiusura sono su righe separate, si può usare la seguente molto bello elisp funzione, scritto da Beniamino Ferrari.L'ho trovato sul suo blog e la speranza è ok per me, per riprodurre qui:

(defun bf-pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
      (nxml-mode)
      (goto-char begin)
      (while (search-forward-regexp "\>[ \\t]*\<" nil t) 
        (backward-char) (insert "\n"))
      (indent-region begin end))
    (message "Ah, much better!"))

Questo non contare su di uno strumento esterno come Ordinato.

Emacs può eseguire comandi arbitrari con M-|.Se si dispone di xmllint installato:

"M-| xmllint --format -" sarà formato la regione selezionata

"C-u M-| xmllint --format -" faremo lo stesso, la sostituzione, la regione con l'uscita

Grazie a Tim Helmstedt sopra ho fatto st come questo:

(defun nxml-pretty-format ()
    (interactive)
    (save-excursion
        (shell-command-on-region (point-min) (point-max) "xmllint --format -" (buffer-name) t)
        (nxml-mode)
        (indent-region begin end)))

veloce e facile.Molte grazie.

Per introdurre le interruzioni di riga e quindi piuttosto di stampa

M-x sgml-mode
M-x sgml-pretty-print

ecco un paio di modifiche che ho fatto a Beniamino Ferrari versione:

  • il search-forward-regexp non specificare un termine, in modo che potrebbe operare su roba da inizio regione per la fine del buffer (e non alla fine di regione)
  • Ora incrementi end correttamente, come Cheeso notato.
  • si potrebbe inserire una pausa tra <tag></tag>, che modifica il suo valore.Sì, tecnicamente siamo di modifica dei valori di tutto qui, ma un vuoto di inizio/fine, è molto più probabile che sia significativo.Ora utilizza due distinti, leggermente più stretto ricerche per evitare che.

Ha ancora il "non si basa sull'esterno ordinato", etc.Tuttavia, esso richiede cl per il incf macro.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; pretty print xml region
(defun pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    (goto-char begin)
    ;; split <foo><foo> or </foo><foo>, but not <foo></foo>
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))

Un modo di fare è Se hai qualcosa in seguito formato

<abc>     <abc><abc>   <abc></abc> </abc></abc>       </abc>

In Emacs, provare

M-x nxml-mode
M-x replace-regexp RET  > *< RET >C-q C-j< RET 
C-M-\ to indent

Questo sarà il rientro di sopra xml di esempio di seguito

<abc>
  <abc>
    <abc>
      <abc>
      </abc>
    </abc>
  </abc>
</abc>

In VIM si può fare questo

:set ft=xml
:%s/>\s*</>\r</g
ggVG=

Spero che questo aiuta.

  1. Emacs nxml-modalità di lavoro presentato formato, ma dovrete dividere le linee.
  2. Per più file che semplicemente non vale la pena.Eseguire questo foglio di stile (idealmente con Sassone che IMHO ottiene la riga di trattini sulla destra) contro la più file per ottenere una bella stampa.Per qualsiasi elementi di cui si desidera mantenere lo spazio bianco aggiungere i loro nomi accanto ai "programlisting' come in 'programlisting yourElementName'

HTH

Ho preso Jason Viers' versione e ha aggiunto logica di mettere xmlns dichiarazioni sulle proprie linee.Questo presuppone che xmlns= e xmlns:senza spazi.

(defun cheeso-pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    ;; split <foo><bar> or </foo><bar>, but not <foo></foo>
    (goto-char begin)
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    ;; put xml namespace decls on newline
    (goto-char begin)
    (while (search-forward-regexp "\\(<\\([a-zA-Z][-:A-Za-z0-9]*\\)\\|['\"]\\) \\(xmlns[=:]\\)" end t)
      (goto-char (match-end 0))
      (backward-char 6) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))

Ordine sembra un buon modo.Deve guardare.Lo userà se ho davvero bisogno di tutte le caratteristiche che offre.

Comunque, questo problema è stato fastidioso a me per circa una settimana e io non ero alla ricerca correttamente.Dopo la pubblicazione, ho iniziato la ricerca e ho trovato un sito con un elisp funzione che fa abbastanza bene.L'autore suggerisce anche utilizzando in Ordine.

Grazie per la risposta Marcel (peccato che non ho abbastanza punti per upmod si).

Posto su di esso presto sul mio blog. Qui è un post (con un link a Marcel sito).

Io uso xml-reformat-tags da xml-analizzare.el.Di solito si desidera avere il punto all'inizio del file durante l'esecuzione di questo comando.

È interessante che il file è incorporato in Emacspeak.Quando ero con la Emacspeak su giorno per giorno, ho pensato xml-reformat-tags è un Emacs builtin.Un giorno l'ho perso e ho dovuto fare una ricerca su internet, e così entrò nella pagina wiki di cui sopra.

Vi allego anche il mio codice per avviare xml parse.Non sono sicuro se questo è il pezzo migliore di Emacs codice, ma sembra funzionare per me.

(if (file-exists-p "~/.emacs.d/packages/xml-parse.el")
  (let ((load-path load-path))
    (add-to-list 'load-path "~/.emacs.d/packages")
    (require 'xml-parse))
)

Se si utilizza spacemacs, basta utilizzare il comando 'spacemacs/rientro-regione-o-tampone'.

M-x spacemacs/indent-region-or-buffer

Ho paura di come Benjamin Ferrari versione molto meglio.L'interno di una bella stampa pone sempre il tag di fine in una nuova riga dopo il valore, l'inserimento indesiderati CR nel tag valori.

come 2017 emacs viene fornito già con questa funzionalità di default, ma è necessario scrivere questa piccola funzione nel ~/.emacs.d/init.el:

(require 'sgml-mode)

(defun reformat-xml ()
  (interactive)
  (save-excursion
    (sgml-pretty-print (point-min) (point-max))
    (indent-region (point-min) (point-max))))

quindi basta chiamare M-x reformat-xml

fonte: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top