Die alte Frage, wie man XML faltet


42

Ich mache ziemlich viel manuelle XML-Bearbeitung (die Quelldefinition einiger Codegenerierungen ist ein benutzerdefiniertes XML-Format) und bevorzuge natürlich die Verwendung von Emacs gegenüber speziellen (normalerweise hässlichen) XML-Editoren. Der nXml-Modus hat mir in der Vergangenheit sehr gut gefallen, aber ich kann mich nicht um die "Outline" -Unterstützung kümmern. Verschiedene Internet- und SO-Posts sagen praktisch nichts aus - ich frage mich, ob jemand praktische Erfahrungen mit dem Umreißen / Falten von XML in Emacs (beliebiger Modus) hat, ob dies eine Änderung der XML-Struktur selbst erfordert oder nicht.


Schau in den Sonnenschein.
Malabarba

Hier ist ein Link zu einem Beispiel habe ich eine Weile zurück Umgang mit Code - Folding für beliebige Tags in nxml Modus - vielleicht könnte es Ihnen helfen, Ihren eigenen Code zu entwickeln: superuser.com/a/787030/206164 Der besondere Tag ich in Angriff genommen wurde xsl- - Ich habe einen Zähler für verschachtelte Tags mit demselben Namen eingebaut.
Gesetzesliste

Antworten:


39

Ich habe diesen SO-Beitrag gefunden: 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)

Sie können den Code von dort leicht modifiziert für den nxml-Modus verwenden.

Auf diese Weise können Sie das Ein- C-chund Ausblenden von XML-Elementen mit umschalten und Unterstreichungen in den Namen unterstützen.

Bildbeschreibung hier eingeben


2
Tippfehler: nxmlNichtnmxl
Sean Allred

3
@ SeanAllred: Ich habe den Tippfehler behoben. Die Cut-and-Pasters werden Ihnen für den Fang danken!
Dan

Brillant! Es sieht auch so aus, als ob es einfach sein wird, benutzerdefinierte Funktionen zu schreiben, um beispielsweise hideshoweinen Puffer zu scannen, um alle Instanzen eines bestimmten Tags usw. umzuschalten. Wäre auch schön, wenn ein Mausklick die Ausblendung aufheben würde, aber ich werde es nicht versuchen den Yak zu sehr rasieren :)
Mark Aufflick

@MarkAufflick hideshow hat Mausunterstützung, standardmäßig ist Shift + Maus 2 an hs-mouse-toggle-hiding gebunden, was genau so funktionieren sollte, wie Sie es möchten.
Jordon Biondo

2
+1000. Diese Antwort hat meinen Verstand gerettet. Ich liebe den nxml-Modus, habe aber ständig zwischen ihm und einem dedizierten XML-Editor gewechselt, nur um dessen Unterstützung für das Tag-Folding zu gewährleisten. Ich frage mich jedoch, ob es möglich wäre, diese Funktionalität mit derselben Bibliothek wie dirtree.el zu implementieren , die das Falten / Entfalten mit der Maus und das Strichzeichnen der Baumstruktur in GUI Emacsen unterstützt.
dodgethesteamroller

12

Im Web-Modus ist die Elementfaltung integriert und an diese gebunden C-c C-f. Aber Sie werden offensichtlich einige der Funktionen des nxml-Modus verlieren.


Ich wusste nichts über den Web-Modus (mache heutzutage nicht viel Web-Entwicklung). Ich probiere es aus und melde mich, danke.
Mark Aufflick

1
So nah! Leider erlaubt der Web-Modus keine Unterstriche in XML-Tag-Namen (die wir verwenden). Im gesamten Web-Modus-Code sind Hunderte von nahezu identischen, hartcodierten Regex-Zeichenfolgen enthalten. Ich hatte einen Stich in der Arbeit, die geändert werden sollte, aber es ist anstrengend! Ansonsten funktioniert das Falten im Web-Modus ja :)
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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.