Pertanyaan lama "bagaimana cara melipat XML"

42

Saya melakukan sedikit penyuntingan XML manual (definisi sumber dari beberapa pembuatan kode yang saya lakukan adalah format XML khusus) dan tentu saja lebih suka menggunakan Emacs daripada editor XML tujuan khusus (biasanya jelek). nXml mode telah mendukung saya dengan baik di masa lalu, tetapi saya tidak bisa mendapatkan dukungan "outline" nya. Berbagai posting internet dan SO secara efektif tidak mengatakan apa-apa - Saya ingin tahu apakah ada yang punya pengalaman praktis dengan menguraikan / melipat XML di Emacs (mode apa pun) apakah itu memerlukan perubahan struktur XML itu sendiri atau tidak.

Tandai Aufflick
sumber
Lihatlah ke luar.
Malabarba
Berikut adalah tautan ke contoh yang saya lakukan beberapa waktu lalu ketika berurusan dengan kode lipat untuk tag arbitrer dalam mode nxml - mungkin ini dapat membantu Anda mengembangkan kode Anda sendiri: superuser.com/a/787030/206164 Tag khusus yang saya tangani adalah xsl- - Saya memasukkan penghitung untuk menangani tag bersarang dengan nama yang sama.
hukum

Jawaban:

39

Saya menemukan posting SO ini: https://stackoverflow.com/questions/944614/emacs-does-honton-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)

Anda dapat menggunakan kode dari sana, sedikit dimodifikasi, untuk mode-nxml dengan mudah.

Ini akan memungkinkan Anda untuk beralih menyembunyikan / tidak menyembunyikan elemen xml dengan C-chdan akan mendukung garis bawah dalam nama-nama.

masukkan deskripsi gambar di sini

Jordon Biondo
sumber
2
salah ketik:, nxmltidaknmxl
Sean Allred
3
@SeanAllred: Saya memperbaiki kesalahan ketik. Cut-and-pasters akan berterima kasih atas tangkapannya!
Dan
Cemerlang! Tampaknya juga akan mudah untuk menulis fungsi khusus untuk hideshowseperti memindai buffer untuk mengaktifkan semua contoh tag yang diberikan dll. Juga akan lebih baik jika mengklik elipsis dengan mouse akan disembunyikan, tetapi saya akan mencoba untuk tidak terlalu banyak mencukur yak :)
Mark Aufflick
Jam tangan @MarkAufflick memiliki dukungan mouse, secara default, shift + mouse 2 terikat pada hs-mouse-toggle-hiding, yang seharusnya berfungsi persis seperti yang Anda inginkan.
Jordon Biondo
2
+1000. Jawaban ini menyelamatkan kewarasan saya. Saya suka nxml-mode tetapi terus-menerus beralih di antara itu dan editor XML khusus hanya untuk dukungan tag-lipat yang terakhir. Saya bertanya-tanya, apakah mungkin untuk mengimplementasikan fungsi ini menggunakan perpustakaan yang sama dengan dirtree.el , yang mendukung lipatan / buka dengan mouse dan gambar garis struktur pohon di GUI Emacsen?
dodgethesteamroller
12

web-mode memiliki elemen lipat bawaan dan terikat C-c C-f. Tetapi Anda akan kehilangan beberapa fitur menggunakan nxml-mode jelas.

Jordon Biondo
sumber
Saya tidak tahu tentang web-mode (jangan lakukan banyak web dev hari ini). Saya akan mencobanya dan melaporkan kembali, terima kasih.
Mark Aufflick
1
Sangat dekat! Sayangnya mode web tidak memungkinkan untuk menggarisbawahi dalam nama tag xml (yang kami gunakan). Berserakan di seluruh kode mode web adalah ratusan string regex kode yang hampir sama. Saya pernah mencoba yang harus dimodifikasi tetapi karena melelahkan! Jika tidak, pelipatan dalam mode web memang berhasil :)
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
sumber