A velha pergunta "como dobrar XML"

42

Estou fazendo um pouco de edição manual de XML (a definição de origem de alguma geração de código que estou fazendo é um formato XML personalizado) e, é claro, prefiro usar o Emacs sobre qualquer editor de XML de propósito especial (geralmente feio). O modo nXml me manteve bem no passado, mas não consigo entender o suporte "básico". Várias postagens da Internet e da SO não dizem nada - estou me perguntando se alguém tem alguma experiência prática em delinear / dobrar XML no Emacs (qualquer modo), independentemente de isso exigir ou não alterar a própria estrutura XML.

Mark Aufflick
fonte
Olhe para ofuscar.
Malabarba
Aqui está um link para um exemplo que fiz há algum tempo lidando com o código dobrável para tags arbitrárias no modo nxml - talvez isso possa ajudá-lo a desenvolver seu próprio código: superuser.com/a/787030/206164 A tag específica que eu lidei era xsl- - Incorporei um contador para lidar com tags aninhadas com o mesmo nome.
lawlist

Respostas:

39

Encontrei esta postagem do 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)

Você pode usar o código de lá, ligeiramente modificado, para o modo nxml facilmente.

Isso permitirá que você alterne a ocultação / exibição de elementos xml com C-che apoiará sublinhados nos nomes.

insira a descrição da imagem aqui

Jordon Biondo
fonte
2
erro de digitação:, nxmlnão #nmxl
Sean Allred
3
@ SeanAllred: Corrigi o erro de digitação. O recortar e agradecer pela captura!
Dan
Brilhante! Também parece fácil escrever funções personalizadas, hideshowcomo escanear um buffer para alternar todas as instâncias de uma determinada tag etc. Também seria bom se clicar em uma elipse com o mouse não ocultasse, mas tentarei não para raspar o iaque muito :)
Mark Aufflick
A apresentação de slides do @MarkAufflick tem suporte para mouse, por padrão, shift + mouse 2 está vinculado a hs-mouse-toggle-hiding, que deve funcionar exatamente como você deseja.
Jordon Biondo
2
+1000. Essa resposta salvou minha sanidade. Eu amo o modo nxml, mas estava alternando constantemente entre ele e um editor XML dedicado apenas para o suporte à dobragem de tags deste último. Eu me pergunto, no entanto, se seria possível implementar essa funcionalidade usando a mesma biblioteca que dirtree.el , que suporta dobras / desdobramentos com o mouse e o desenho de linhas da estrutura da árvore na GUI Emacsen?
Dodgethesteamroller
12

O modo Web possui elementos dobráveis ​​embutidos e vinculados a C-c C-f. Mas você perderá alguns dos recursos do uso do modo nxml, obviamente.

Jordon Biondo
fonte
Eu não sabia sobre o modo web (não faça muito web dev hoje em dia). Vou experimentar e informar, obrigado.
Mark Aufflick
1
Tão perto! Infelizmente, o modo web não permite sublinhados nos nomes de tags xml (que usamos). Em todo o código do modo da web, há centenas de seqüências de caracteres regex codificadas praticamente iguais. Eu tive uma facada em trabalhar fora, que deve ser modificado, mas porque cansativo! Caso contrário, a dobradura em modo web realmente 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
fonte