Respostas:
A funcionalidade já existe para reformatar esse buffer para ser um pouco legível pelo usuário?
Claro, e você tem muitas opções. Eu provavelmente iria alimentá-lo para um programa externo usando:
C-x h C-u M-| xmllint --format - RET
Este programa vem com libxml2
. Você também pode usar tidy
. Aqui está uma lista de ferramentas de formatação de linha de comando xml: /programming/16090869/how-to-pretty-print-xml-from-the-command-line
Você também pode fazer uma pesquisa e substituir e depois recuar:
M-% > < RET > C-q C-j < RET ! C-M-\
Truque: você pode copiar e colar a string acima em M-:
( eval-expression
) assim:
(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
C-u
prefixo.
A built-in sgml-mode
tem um comando para fazer isso: sgml-pretty-print
. Se você estiver participando nxml-mode
, parece que precisa mudar para o sgml-mode
primeiro. Você pode escrever um comando para alternar temporariamente para o modo sgml, executar pretty-print e retornar ao modo nxml.
Por exemplo, aqui está um comando que imprimirá bastante a região, opcionalmente com o preenchimento automático ativado:
(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)))
escreva isto no seu ~/.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))))
recarregue o emacs e chame M-x reformat-xml
o buffer xml mal formatado.
fonte: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/
Seguindo a dica da resposta acima, e supondo que você tenha tidy
instalado uma variação, pode ser:
`C-x h M-| tidy -quiet -xml -utf8 -indent -`
Isso abrirá um novo buffer em *Shell Command Output*
vez de substituir diretamente o conteúdo do buffer. Após verificar o resultado, substitua o conteúdo antigo pelo novo por:
C-x h M-insert-buffer
escolha o padrão sugerido que provavelmente será *Shell Command Output*
. Você pode salvar o comando para mais tarde com uma macro do teclado:
C-x ( C-x h M-| tidy -quiet -xml -utf8 -indent - C-x)
C-x C-k n pretty-xml
Com isso, você pode executar M-x pretty-xml
para reformatar o buffer.