Старый вопрос «как сложить XML»

42

Я занимаюсь ручным редактированием XML (исходное определение некоторой генерации кода, которое я делаю, это пользовательский формат XML) и, конечно, предпочитаю использовать Emacs над любыми специальными (обычно некрасивыми) редакторами XML. Режим nXml хорошо меня держал в прошлом, но я не могу разобраться с его «контурной» поддержкой. Различные посты в Интернете и SO фактически ничего не говорят - мне интересно, есть ли у кого-нибудь практический опыт обрисовывания / свертывания XML в Emacs (любой режим), требует ли это изменения самой структуры XML.

Марк Ауффлик
источник
Посмотри в тени.
Малабарба
Вот ссылка на пример, который я сделал некоторое время назад, имея дело со свертыванием кода для произвольных тегов в режиме nxml - возможно, это могло бы помочь вам разработать ваш собственный код: superuser.com/a/787030/206164 Конкретный тег, который я использовал, был xsl- - Я включил счетчик для работы с вложенными тегами с тем же именем.
юрист

Ответы:

39

Я нашел этот пост: https://stackoverflow.com/questions/944614/emacs-does-hideshow-work-with-xml-mode-sgml-mode

(require 'hideshow)
(require 'sgml-mode)
(require 'nxml-mode)

(add-to-list 'hs-special-modes-alist
             '(nxml-mode
               "<!--\\|<[^/>]*[^/]>"
               "-->\\|</[^/>]*[^/]>"

               "<!--"
               sgml-skip-tag-forward
               nil))



(add-hook 'nxml-mode-hook 'hs-minor-mode)

;; optional key bindings, easier than hs defaults
(define-key nxml-mode-map (kbd "C-c h") 'hs-toggle-hiding)

Вы можете легко использовать слегка измененный код для nxml-режима.

Это позволит вам переключать скрытие / отображение элементов XML с помощью символов C-chподчеркивания в именах.

введите описание изображения здесь

Джордон Биондо
источник
2
опечатка: nxmlнетnmxl
Шон Оллред
3
@SeanAllred: я исправил опечатку. Вырезанные люди будут благодарны вам за улов!
Дан
Brilliant! Кроме того, похоже, что будет легко написать пользовательские функции, hideshowтакие как сканирование буфера для переключения всех экземпляров данного тега и т. Д. Также было бы неплохо, если бы щелкнуть мышью по многоточию мышью, чтобы скрыть, но я постараюсь не слишком сильно сбрить яка :)
Марк Ауффлик,
@MarkAufflick hideshow поддерживает мышь, по умолчанию shift + mouse 2 привязано к hs-mouse-toggle-hiding, что должно работать именно так, как вы этого хотите.
Джордон Биондо
2
+1000. Этот ответ спас мое здравомыслие. Мне нравится nxml-режим, но я постоянно переключался между ним и специальным редактором XML только для поддержки свертывания тегов. Интересно, однако, было бы возможно реализовать эту функциональность, используя ту же библиотеку, что и dirtree.el , которая поддерживает сложение / развертывание мышью и рисование линий древовидной структуры в графическом интерфейсе Emacsen?
dodgethesteamroller
12

В веб-режиме встроены элементы сворачивания и привязки к ним C-c C-f. Но вы, очевидно, потеряете некоторые особенности использования nxml-режима.

Джордон Биондо
источник
Я не знал о веб-режиме (не делайте много веб-разработки в эти дни). Я попробую и сообщу, спасибо.
Марк Ауффлик
1
Так близко! К сожалению, веб-режим не допускает подчеркивания в именах тегов xml (которые мы используем). В коде веб-режима замусорены сотни практически одинаковых строк регулярных выражений. У меня был удар при разработке, который должен быть изменен, но это потому, что утомительно! В противном случае сворачивание в веб-режиме действительно работает :)
Марк Ауффлик,
0
(add-to-list
 'hs-special-modes-alist
 '(nxml-mode
   "<!--\\|<[^/>][^>]*>" "-->\\|</[^/>]+>" "<!--" #'nxml-forward-element nil))
(add-hook 'nxml-mode-hook #'hs-minor-mode)
;; (setcdr (assoc 'nxml-mode hs-special-modes-alist) (list "<!--\\|<[^/>][^>]*>" "-->\\|</[^/>]+>" "<!--" #'nxml-forward-element nil))
gavenkoa
источник