Як вподобати / відформатувати буфер XML?


17

У мене є файл з xml все в одному рядку. Чи існує функціональність для переформатування цього буфера, щоб його можна було прочитати чимало користувачів?


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префікс.
FredrikHedman

3
Відповідь означає, що emacs не може цього зробити.
Сергій Коструков

13

Вбудований sgml-modeмає команду , щоб зробити це: sgml-pretty-print. Якщо ви знаходитесь у nxml-modeній, схоже, sgml-modeспочатку вам потрібно перейти . Ви можете написати команду тимчасово перейти в режим sgml, запустити симпатичний друк, а потім перейти в режим 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)))

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/


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переформатування буфера.


0

Позначте свій xml і зробіть:

M-x sgml-pretty-print

Або просто запустіть команду без відміченої області, щоб покращити весь буфер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.