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.


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


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.


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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.