La vieja pregunta "cómo plegar XML"

42

Estoy haciendo un poco de edición manual de XML (la definición de origen de cierta generación de código que estoy haciendo es un formato XML personalizado) y, por supuesto, prefiero usar Emacs sobre cualquier editor XML de propósito especial (generalmente feo). El modo nXml me ha mantenido bien en el pasado, pero no puedo entender el soporte de "esquema". Varias publicaciones de Internet y SO efectivamente no dicen nada: me pregunto si alguien tiene alguna experiencia práctica con delinear / plegar XML en Emacs (cualquier modo) si eso requiere o no alterar la estructura XML en sí.

Mark Aufflick
fuente
Mira hacia afuera.
Malabarba
Aquí hay un enlace a un ejemplo que hice hace un tiempo tratando con el código plegable para etiquetas arbitrarias en modo nxml, tal vez podría ayudarlo a desarrollar su propio código: superuser.com/a/787030/206164 La etiqueta particular que abordé fue xsl: - Incorporé un contador para tratar con etiquetas anidadas con el mismo nombre.
abogados el

Respuestas:

39

Encontré esta publicación SO: 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)

Puede usar el código desde allí, ligeramente modificado, para el modo nxml fácilmente.

Esto le permitirá alternar la ocultación / ocultación de elementos xml C-chy admitirá guiones bajos en los nombres.

ingrese la descripción de la imagen aquí

Jordon Biondo
fuente
2
error tipográfico: nxmlnonmxl
Sean Allred
3
@SeanAllred: arreglé el error tipográfico. ¡Los cortes y pasteles te agradecerán la captura!
Dan
¡Brillante! También parece que será fácil escribir funciones personalizadas, hideshowcomo escanear un búfer para alternar todas las instancias de una etiqueta determinada, etc. También sería bueno si al hacer clic en los puntos suspensivos con el mouse no se ocultara, pero intentaré no afeitarse demasiado el yak :)
Mark Aufflick
@MarkAufflick hideshow tiene soporte para mouse, de manera predeterminada, shift + mouse 2 está vinculado a hs-mouse-toggle-hiding, que debería funcionar exactamente como lo desea.
Jordon Biondo
2
+1000. Esta respuesta salvó mi cordura. Me encanta el modo nxml, pero cambiaba constantemente entre él y un editor XML dedicado solo para el soporte de plegado de etiquetas de este último. Sin embargo, me pregunto si sería posible implementar esta funcionalidad usando la misma biblioteca que dirtree.el , que admite doblar / desplegar con el mouse y dibujar líneas de la estructura de árbol en GUI Emacsen.
dodgethesteamroller
12

el modo web tiene elementos plegables integrados y vinculados C-c C-f. Pero obviamente perderá algunas de las características del uso del modo nxml.

Jordon Biondo
fuente
No sabía sobre el modo web (no hago mucho desarrollo web en estos días). Lo intentaré e informaré, gracias.
Mark Aufflick
1
¡Tan cerca! Desafortunadamente, el modo web no permite los guiones bajos en los nombres de etiquetas xml (que usamos). Cubiertos por todo el código del modo web hay cientos de cadenas de expresiones regulares codificadas casi iguales. Tuve una puñalada en el ejercicio que debería modificarse, ¡pero es agotador! De lo contrario, el plegado en modo web sí funciona :)
Mark Aufflick
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
fuente