Como pré-modificar / formatar um buffer XML?

17

Eu tenho um arquivo com xml tudo em uma linha. A funcionalidade já existe para reformatar esse buffer para ser um pouco legível pelo usuário?

wdkrnls
fonte
4
FWIW esta pergunta foi feita no stackoverflow: stackoverflow.com/questions/12492/…
YoungFrog

Respostas:

24

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-\\"))
babá
fonte
Uma boa resposta, mas tenha cuidado para que o comando, como está escrito agora, substitua o conteúdo do buffer pela saída do comando shell. Isso ocorre por causa do C-uprefixo.
precisa saber é o seguinte
3
Resposta significa que o emacs não pode fazê-lo.
Sergey Kostrukov
13

A built-in sgml-modetem um comando para fazer isso: sgml-pretty-print. Se você estiver participando nxml-mode, parece que precisa mudar para o sgml-modeprimeiro. 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)))
glucas
fonte
7

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-xmlo buffer xml mal formatado.

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

ninrod
fonte
0

Seguindo a dica da resposta acima, e supondo que você tenha tidyinstalado 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-xmlpara reformatar o buffer.

FredrikHedman
fonte
0

Marque seu xml e faça:

M-x sgml-pretty-print

Ou apenas execute o comando sem uma região marcada para prettificar todo o buffer.

draxil
fonte