La vecchia domanda "come piegare XML"


42

Sto facendo un po 'di modifica manuale dell'XML (la definizione del codice sorgente di una generazione di codice che sto facendo è un formato XML personalizzato) e ovviamente preferisco usare Emacs su qualsiasi editor XML per scopi speciali (di solito brutti). La modalità nXml mi ha aiutato bene in passato, ma non riesco a trovare la testa sul suo supporto "contorno". Vari post su Internet e SO in realtà non dicono nulla: mi chiedo se qualcuno abbia qualche esperienza pratica nel delineare / piegare XML in Emacs (qualsiasi modalità) se ciò richiede o meno di modificare la struttura XML stessa.


Guarda in fuori.
Malabarba,

Ecco un link a un esempio che ho fatto qualche tempo fa riguardo al codice pieghevole per tag arbitrari in modalità nxml - forse potrebbe aiutarti a sviluppare il tuo codice: superuser.com/a/787030/206164 Il tag particolare che ho affrontato era xsl- - Ho incorporato un contatore per gestire i tag nidificati con lo stesso nome.
elenco delle leggi

Risposte:


39

Ho trovato questo post 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)

È possibile utilizzare il codice da lì, leggermente modificato, per la modalità nxml facilmente.

Ciò ti consentirà di attivare / disattivare nascondere / nascondere elementi xml C-che supporterà i caratteri di sottolineatura nei nomi.

inserisci qui la descrizione dell'immagine


2
errore di battitura:, nxmlnonmxl
Sean Allred,

3
@SeanAllred: ho corretto l'errore di battitura. I tagliafuoco ti ringrazieranno per la cattura!
Dan

Brillante! Sembra anche che sarà facile scrivere funzioni personalizzate hideshowcome scansionare un buffer per attivare tutte le istanze di un determinato tag ecc. Sarebbe anche bello se fare clic su un puntino di sospensione con un mouse si nascondesse, ma proverò a non farlo radere troppo lo yak :)
Mark Aufflick

@MarkAufflick hideshow ha il supporto del mouse, per impostazione predefinita, shift + mouse 2 è associato a hs-mouse-toggle-hiding, che dovrebbe funzionare esattamente come vuoi tu.
Jordon Biondo,

2
+1000. Questa risposta mi ha salvato la sanità mentale. Adoro la modalità nxml ma sono passato costantemente tra esso e un editor XML dedicato solo per il supporto del tag-folding di quest'ultimo. Mi chiedo, tuttavia, se sarebbe possibile implementare questa funzionalità usando la stessa libreria di dirtree.el , che supporta fold / unfold con il mouse e il disegno della struttura ad albero nella GUI Emacsen?
dodgethesteamroller,

12

la modalità web ha la piegatura degli elementi integrata e legata a C-c C-f. Ma perderai alcune delle funzionalità dell'uso della modalità nxml ovviamente.


Non sapevo della modalità web (non fare molti sviluppatori web in questi giorni). Lo proverò e riporterò indietro, grazie.
Mark Aufflick,

1
Così vicino! Sfortunatamente la modalità web non consente di sottolineare i nomi dei tag xml (che usiamo). Sparsi nel codice in modalità web sono centinaia di stringhe regex quasi identiche. Ho avuto una pugnalata all'allenamento che dovrebbe essere modificato, ma perché faticoso! Altrimenti, la piegatura in modalità web funziona davvero :)
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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.