Сведения о вопросе

1234123213

11:40, 2nd August, 2020

Теги

xml   emacs   editor    

Красивая печать XML файлов на Emacs

Просмотров: 535   Ответов: 15

Я использую emacs для редактирования моих xml файлов (nxml-mode), и файлы были сгенерированы машиной не имеют никакого красивого форматирования тегов.

Я искал довольно красивую печать всего файла с отступом и сохранением его, но не смог найти автоматический способ.

Есть ли какой-то выход? Или хотя бы какой-нибудь редактор на linux, который может это сделать.



  Сведения об ответе

davran

04:32, 22nd August, 2020

Вам даже не нужно писать свою собственную функцию-sgml-mode (модуль ядра gnu emacs) имеет встроенную красивую функцию печати под названием (sgml-pretty-print ...) который принимает аргументы начала и конца области.

Если вы режете и вставляете xml, и вы обнаруживаете, что ваш terminal рубит линии в произвольных местах, вы можете использовать этот симпатичный принтер , который сначала исправляет ломаные линии.


  Сведения об ответе

lourence

01:28, 11th August, 2020

Если вам нужен только красивый отступ без введения каких-либо новых разрывов строк, вы можете применить команду indent-region ко всему буферу с помощью этих нажатий клавиш:

C-x h
C-M-\

Если вам также нужно ввести разрывы строк, чтобы открывающие и закрывающие теги находились на отдельных строках, вы можете использовать следующую очень красивую функцию elisp, написанную Бенджамином Феррари . Я нашел его в своем блоге и надеюсь, что это нормально для меня, чтобы воспроизвести его здесь:

(defun bf-pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
      (nxml-mode)
      (goto-char begin)
      (while (search-forward-regexp "\>[ \\t]*\<" nil t) 
        (backward-char) (insert "\n"))
      (indent-region begin end))
    (message "Ah, much better!"))

Это не зависит от внешнего инструмента, такого как Tidy.


  Сведения об ответе

COOL

23:06, 28th August, 2020

Emacs может выполнять произвольные команды с помощью M -|. Если у вас установлен xmllint:

"M - | xmllint --format -" отформатирует выбранный регион

"C-u M-| xmllint --format -" будет делать то же самое, заменяя область выводом


  Сведения об ответе

+-*/

04:36, 10th August, 2020

Я использую режим nXML для редактирования и аккуратности , когда я хочу отформатировать и отступить XML или HTML. Существует также интерфейс Emacs для приведения в порядок.


  Сведения об ответе

SEEYOU

03:53, 10th August, 2020

Спасибо Тиму Хельмштедт выше я сделал ст такой:

(defun nxml-pretty-format ()
    (interactive)
    (save-excursion
        (shell-command-on-region (point-min) (point-max) "xmllint --format -" (buffer-name) t)
        (nxml-mode)
        (indent-region begin end)))

быстро и легко. Большое спасибо.


  Сведения об ответе

dumai

19:40, 8th August, 2020

Для введения разрывов строк и затем красивой печати

M-x sgml-mode
M-x sgml-pretty-print


  Сведения об ответе

прога

03:07, 19th August, 2020

вот несколько настроек, которые я сделал для версии Бенджамина Феррари:

  • search-forward-regexp не указывал конец, поэтому он будет работать с материалом от начала области до конца буфера (вместо конца области)
  • Теперь инкременты end правильно, как заметил Чизо.
  • он вставил бы разрыв между <tag></tag>, который изменяет его значение. Да, технически мы изменяем значения всего здесь, но пустое начало/конец гораздо более вероятно будет значительным. Теперь использует два отдельных, немного более строгих поиска, чтобы избежать этого.

Еще есть "не полагается на внешнюю опрятность" и т. д. Однако для макроса incf требуется cl .

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; pretty print xml region
(defun pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    (goto-char begin)
    ;; split <foo><foo> or </foo><foo>, but not <foo></foo>
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))


  Сведения об ответе

SSESION

09:25, 12th August, 2020

Один из способов сделать это Если у вас есть что-то в формате ниже

<abc>     <abc><abc>   <abc></abc> </abc></abc>       </abc>

В Emacs, попробовать

M-x nxml-mode
M-x replace-regexp RET  > *< RET >C-q C-j< RET 
C-M-\ to indent

Это приведет к отступу над xml примером ниже

<abc>
  <abc>
    <abc>
      <abc>
      </abc>
    </abc>
  </abc>
</abc>

В VIM вы можете сделать это с помощью

:set ft=xml
:%s/>\s*</>\r</g
ggVG=

Надеюсь, это поможет.


  Сведения об ответе

SSESION

09:31, 7th August, 2020

  1. Emacs nxml-mode может работать с представленным форматом,но вам придется разделить строки.
  2. Для более длинных файлов, которые просто не стоят того. Запустите эту таблицу стилей (в идеале с Saxon который IMHO получает отступы строк справа) против более длинных файлов чтобы получить хороший красивый отпечаток. Для любых элементов, где вы хотите сохранить пустое пространство добавьте их имена рядом с 'programlisting', как в 'programlisting yourElementName'

HTH


  Сведения об ответе

padenie

17:33, 9th August, 2020

Я взял версию Джейсона Виерса и добавил логику, чтобы поместить объявления xmlns в их собственные строки. Это предполагает, что у вас есть xmlns= и xmlns: без вмешательства whitespace.

(defun cheeso-pretty-print-xml-region (begin end)
  "Pretty format XML markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    ;; split <foo><bar> or </foo><bar>, but not <foo></foo>
    (goto-char begin)
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    ;; put xml namespace decls on newline
    (goto-char begin)
    (while (search-forward-regexp "\\(<\\([a-zA-Z][-:A-Za-z0-9]*\\)\\|['\"]\\) \\(xmlns[=:]\\)" end t)
      (goto-char (match-end 0))
      (backward-char 6) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))


  Сведения об ответе

padenie

12:11, 28th August, 2020

Аккуратность выглядит как хороший режим. Надо посмотреть на него. Буду использовать его, если мне действительно нужны все функции, которые он предлагает.

Так или иначе, эта проблема мучила меня около недели, и я не искал ее должным образом. После публикации я начал искать и нашел один сайт с функцией elisp, которая делает это довольно хорошо. Автор также предлагает использовать Tidy.

Спасибо за ответ Марсель (жаль, что у меня не хватает очков, чтобы поднять вас) .

Скоро я напишу об этом в своем блоге. Вот сообщение об этом (со ссылкой на сайт Марселя).


  Сведения об ответе

PIRLO

22:56, 27th August, 2020

Я использую xml-reformat-tags из xml-parse.el . Обычно при выполнении этой команды вы хотите иметь точку в начале файла.

Интересно, что файл включен в Emacspeak . Когда я использовал Emacspeak на основе day-by-day, я думал, что xml-reformat-tags -это встроенный Emacs. Однажды я потерял его и должен был сделать поиск в интернете для этого, и таким образом вошел на страницу wiki, упомянутую выше.

Я прилагаю мой код, чтобы начать xml-анализа. Не уверен, что это лучший фрагмент кода Emacs, но, похоже, он мне подходит.

(if (file-exists-p "~/.emacs.d/packages/xml-parse.el")
  (let ((load-path load-path))
    (add-to-list 'load-path "~/.emacs.d/packages")
    (require 'xml-parse))
)


  Сведения об ответе

dumai

05:18, 19th August, 2020

Если вы используете spacemacs, просто используйте команду 'spacemacs/indent-region-or-buffer'.

M-x spacemacs/indent-region-or-buffer


  Сведения об ответе

LIZA

18:43, 19th August, 2020

Боюсь, что версия Бенджамина Феррари мне нравится гораздо больше. Внутренняя симпатичная печать всегда помещает конечный тег в новую строку после значения, вставляя ненужные CR в значения тега.


  Сведения об ответе

SEEYOU

10:09, 3rd August, 2020

по состоянию на 2017 год emacs уже поставляется с этой возможностью по умолчанию, но вы должны записать эту маленькую функцию в свой ~/.emacs.d/init.el :

(require 'sgml-mode)

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

тогда просто позвоните M-x reformat-xml

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться