Stare pytanie „jak złożyć XML”

42

Robię sporo ręcznej edycji XML (tworzę źródłową definicję generowania kodu, to niestandardowy format XML) i oczywiście wolę używać Emacsa niż jakiegokolwiek specjalnego (zwykle brzydkiego) edytora XML. Tryb nXml dobrze mnie znosił w przeszłości, ale nie mogę się skupić na obsłudze „konturu”. Różne posty internetowe i SO skutecznie nic nie mówią - zastanawiam się, czy ktoś ma jakieś praktyczne doświadczenie z kreśleniem / składaniem XML w Emacsie (dowolnym trybie), niezależnie od tego, czy wymaga to zmiany samej struktury XML.

Mark Aufflick
źródło
Spójrz na słońce.
Malabarba
Oto link do przykładu, który zrobiłem jakiś czas temu, zajmując się składaniem kodu dla dowolnych tagów w trybie nxml - być może może pomóc ci rozwinąć własny kod: superuser.com/a/787030/206164 Konkretny tag, którym się zająłem, był xsl- - Włączyłem licznik do obsługi zagnieżdżonych znaczników o tej samej nazwie.
prawnik

Odpowiedzi:

39

Znalazłem ten 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)

Możesz łatwo użyć kodu, nieco zmodyfikowanego, dla trybu nxml.

Umożliwi to przełączanie ukrywania / odkrywania elementów xml C-chi obsługuje znaki podkreślenia w nazwach.

wprowadź opis zdjęcia tutaj

Jordon Biondo
źródło
2
literówka:, nxmlnienmxl
Sean Allred
3
@SeanAllred: Naprawiłem literówkę. Ci pasterze podziękują za haczyk!
Dan
Znakomity! Wygląda również na to, że łatwo będzie napisać niestandardowe funkcje, hideshowtakie jak skanowanie bufora w celu przełączania wszystkich wystąpień danego znacznika itp. Byłoby również miło, gdyby kliknięcie elipsy za pomocą myszy odblokowało, ale postaram się nie zbyt golić jaków :)
Mark Aufflick
@MarkAufflick pokaz slajdów ma obsługę myszy, domyślnie shift + mysz 2 jest przypisany do hs-mouse-toggle-ukrywanie, które powinno działać dokładnie tak, jak chcesz.
Jordon Biondo
2
+1000. Ta odpowiedź uratowała moje zdrowie psychiczne. Uwielbiam tryb nxml, ale ciągle przełączałem się między nim a dedykowanym edytorem XML tylko dla obsługi tego ostatniego. Zastanawiam się jednak, czy byłoby możliwe zaimplementowanie tej funkcji przy użyciu tej samej biblioteki co dirtree.el , która obsługuje składanie / rozkładanie za pomocą myszy i rysowanie linii struktury drzewa w GUI Emacsen?
dodgethesteamroller
12

Tryb web ma wbudowane i powiązane składanie elementów C-c C-f. Ale oczywiście stracisz niektóre funkcje korzystania z trybu nxml.

Jordon Biondo
źródło
Nie wiedziałem o trybie internetowym (w dzisiejszych czasach nie robię dużo web dev). Spróbuję i zdam raport, dzięki.
Mark Aufflick
1
Tak blisko! Niestety tryb sieciowy nie pozwala na podkreślenia w nazwach znaczników xml (których używamy). W całym trybie internetowym zaśmiecone są setki niemal identycznych ciągów regularnych wyrażeń regularnych. Miałem kłopot z opracowaniem, które należy zmodyfikować, ale to z powodu wyczerpującego! W przeciwnym razie składanie w trybie internetowym rzeczywiście działa :)
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
źródło