Как предварительно откорректировать / отформатировать буфер XML?

17

У меня есть файл с XML все в одной строке. Функциональность уже существует, чтобы переформатировать этот буфер, чтобы быть немного читаемым пользователем?

wdkrnls
источник
4
FWIW этот вопрос был задан на stackoverflow: stackoverflow.com/questions/12492/…
YoungFrog

Ответы:

24

Функциональность уже существует, чтобы переформатировать этот буфер, чтобы быть немного читаемым пользователем?

Конечно, и у вас есть много вариантов. Я бы, вероятно, передал его внешней программе, используя:

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

Эта программа поставляется с libxml2. Вы также можете использовать tidy. Вот список инструментов форматирования XML командной строки: /programming/16090869/how-to-pretty-print-xml-from-the-command-line

Вы также можете выполнить поиск и замену, а затем сделать отступ:

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

Замечательный трюк: вы можете скопировать и вставить указанную выше строку в M-:( eval-expression) следующим образом:

(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
няня
источник
Хороший ответ, но будьте осторожны, так как команда, как написано сейчас, заменит содержимое буфера выводом команды оболочки. Это из-за C-uпрефикса.
Фредрик Хедман
3
Ответ означает, что emacs не может этого сделать.
Сергей Коструков
13

Встроенный sgml-modeимеет команду , чтобы сделать это: sgml-pretty-print. Если вы внутри, nxml-modeпохоже, вам нужно переключиться на sgml-modeпервую. Вы можете написать команду для временного переключения в режим sgml, запустить pretty-print, а затем вернуться обратно в режим nxml.

Например, вот команда, которая будет красиво печатать регион, возможно с включенным автоматическим заполнением:

(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
источник
7

запишите это в свой ~/.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))))

перезагрузите emacs, а затем просто вызовите M-x reformat-xmlплохо отформатированный буфер xml.

источник: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

ninrod
источник
0

Следуя подсказке ответа выше и предполагая, что вы tidyустановили вариант, может быть:

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

Это откроет новый буфер *Shell Command Output*вместо прямой замены содержимого буфера. После проверки результата замените старое содержимое новым:

C-x h M-insert-buffer

выберите предложенное значение по умолчанию, которое, вероятно, будет *Shell Command Output*. Вы можете сохранить команду на потом с помощью макроса клавиатуры:

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

При этом вы можете выполнить, M-x pretty-xmlчтобы переформатировать буфер.

FredrikHedman
источник
0

Отметьте свой XML и сделайте:

M-x sgml-pretty-print

Или просто запустите команду без отмеченной области, чтобы предварительно настроить весь буфер.

draxil
источник