¿Cómo embellecer / formatear un búfer XML?

Respuestas:

24

¿Ya existe la funcionalidad para reformatear este búfer para que el usuario pueda leerlo?

Por supuesto, y tienes muchas opciones. Probablemente lo alimentaría a un programa externo usando:

C-x h C-u M-| xmllint --format - RET

Este programa viene con libxml2. También podrías usar tidy. Aquí hay una lista de herramientas de formato xml de línea de comandos: /programming/16090869/how-to-pretty-print-xml-from-the-command-line

También puede hacer una búsqueda y reemplazar y luego sangrar:

M-% > < RET > C-q C-j < RET ! C-M-\

Truco ordenado: puede copiar y pegar la cadena anterior en M-:( eval-expression) de esta manera:

(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
niñera
fuente
Una buena respuesta, pero tenga cuidado de que el comando como está escrito ahora reemplazará el contenido del búfer con la salida del comando de shell. Esto se debe al C-uprefijo.
FredrikHedman
3
La respuesta significa que emacs no puede hacerlo.
Sergey Kostrukov
13

El built-in sgml-modetiene un comando para hacer esto: sgml-pretty-print. Si estás dentro nxml-mode, parece que debes cambiar a sgml-modeprimero. Puede escribir un comando para cambiar temporalmente al modo sgml, ejecutar pretty-print y luego volver al modo nxml.

Por ejemplo, aquí hay un comando que imprimirá bastante la región, opcionalmente con autocompletar habilitado:

(defun xml-pretty-print (beg end &optional arg)
  "Reformat the region between BEG and END.
    With optional ARG, also auto-fill."
  (interactive "*r\nP")
  (let ((fill (or (bound-and-true-p auto-fill-function) -1)))
    (sgml-mode)
    (when arg (auto-fill-mode))
    (sgml-pretty-print beg end)
    (nxml-mode)
    (auto-fill-mode fill)))
glucas
fuente
7

escribe esto en tu ~/.emacs.d/init.el:

(require 'sgml-mode)

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

vuelva a cargar emacs, luego solo llame M-x reformat-xmlal búfer xml mal formateado.

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

ninrod
fuente
0

Siguiendo la pista de la respuesta anterior, y suponiendo que haya tidyinstalado una variación podría ser:

`C-x h M-| tidy -quiet -xml -utf8 -indent -`

Esto abrirá un nuevo búfer en *Shell Command Output*lugar de reemplazar directamente el contenido del búfer. Después de verificar el resultado, reemplace el contenido anterior por el nuevo con:

C-x h M-insert-buffer

elija el valor predeterminado sugerido que probablemente sea *Shell Command Output*. Puede guardar el comando para más tarde con una macro de teclado:

C-x ( C-x h M-| tidy -quiet -xml -utf8 -indent - C-x)
C-x C-k n pretty-xml

Con esto puede ejecutar M-x pretty-xmlpara formatear el búfer.

FredrikHedman
fuente
0

Marque su xml y haga:

M-x sgml-pretty-print

O simplemente ejecute el comando sin una región marcada para embellecer todo el búfer.

draxil
fuente