L'ancienne question «Comment plier XML»

42

Je suis en train de faire un peu d’édition XML manuelle (la définition de source de la génération de code que je fais est un format XML personnalisé) et, bien sûr, je préfère utiliser Emacs à tous les éditeurs XML à des fins spéciales (généralement laides). Le mode nXml m'a bien résisté dans le passé, mais je n'arrive pas à comprendre le support "contour". Divers messages sur Internet et SO ne disent rien. Je me demande si quelqu'un a une expérience pratique de la création / réduction du XML dans Emacs (quel que soit le mode), si cela nécessite ou non de modifier la structure XML elle-même.

Mark Aufflick
la source
Regardez en dehors.
Malabarba
Voici un lien vers un exemple que j'ai décrit il y a quelque temps avec le pliage de code pour des balises arbitraires en mode nxml. Peut-être pourrait-il vous aider à développer votre propre code: superuser.com/a/787030/206164 La balise que j'ai abordée était xsl- - J'ai incorporé un compteur pour traiter les tags imbriqués du même nom.
lawlist

Réponses:

39

J'ai trouvé cet article 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)

Vous pouvez utiliser le code à partir de là, légèrement modifié, pour le mode nxml facilement.

Cela vous permettra d’activer et de masquer les éléments xml C-chet de prendre en charge les traits de soulignement dans les noms.

entrez la description de l'image ici

Jordon Biondo
la source
2
faute de frappe:, nxmlpasnmxl
Sean Allred
3
@SeanAllred: J'ai corrigé la faute de frappe. Les cut-pasters vous remercieront pour la prise!
Dan
Brillant! Il semblerait également qu'il sera facile d'écrire des fonctions personnalisées, hideshowtelles que le balayage d'un tampon pour basculer toutes les occurrences d'une balise donnée, etc. Ce serait également bien si cliquer sur un point de suspension avec une souris annulait la suppression, trop raser le yak :)
Mark Aufflick
@ MarkAufflick hideshow prend en charge la souris. Par défaut, Maj + souris 2 est lié à hs-mouse-toggle-hiding, qui devrait fonctionner exactement comme vous le souhaitez.
Jordon Biondo
2
+1000. Cette réponse a sauvé ma santé mentale. J'adore le mode nxml, mais je basculais constamment entre celui-ci et un éditeur XML dédié, juste pour le support de repliement des balises de ce dernier. Je me demande cependant s'il serait possible d'implémenter cette fonctionnalité en utilisant la même bibliothèque que dirtree.el , qui prend en charge le repli / dépliage à la souris et le tracé de la structure arborescente dans l'interface graphique Emacsen?
dodgethesteamroller
12

En mode Web, le repliement des éléments est intégré et lié à C-c C-f. Mais vous allez évidemment perdre certaines fonctionnalités d'utilisation de nxml-mode.

Jordon Biondo
la source
Je ne connaissais pas le mode Web (ne faites pas beaucoup de dev Web ces jours-ci). Je vais l'essayer et faire un compte rendu, merci.
Mark Aufflick
1
Si proche! Malheureusement, le mode Web ne permet pas les traits de soulignement dans les noms de balises XML (que nous utilisons). Le code en mode Web contient des centaines de chaînes de regex codées en dur et pratiquement identiques. J'ai eu un coup de poignard à travailler qui devrait être modifié mais parce que épuisant! Sinon, le pliage en mode web fonctionne effectivement :)
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
la source