Lipat kode yang dapat ditindaklanjuti di pinggiran Emacs

15

Saya ingin mengkonfigurasi pinggiran Emacs saya untuk menunjukkan bagian kode lipat.

Misalnya, BBEdit di Mac akan menampilkan yang berikut saat mengedit file JSON:

Tanda lipat kode BBEdit

Tanda itu sendiri dapat ditindaklanjuti: mengklik tanda akan memperluas atau menutup bagian kode yang sesuai. Ketika dokumen tidak memiliki mode yang mendukung pelipatan kode, pinggiran tidak ditampilkan.

Apakah mungkin untuk memperluas fungsionalitas pinggiran Emacs sedemikian rupa?

Mathieu Legrand
sumber

Jawaban:

16

Hontonvis menambahkan ikon yang dapat diklik ke pinggiran, tetapi untuk beberapa alasan aneh itu tidak termasuk dalam elpa atau melpa. Secara default itu menunjukkan -di pinggiran untuk kode yang dapat dilipat, dan kemudian elides konten dengan a .... Dengan mengaktifkannya, hideshowvis-symbolsia menambah +dan membuat isyarat untuk konten yang dilipat sedikit lebih keras.

Honton itu sendiri juga memungkinkan klik mouse pada baris untuk beralih tampilan menggunakan S-mouse-2(atau menggeser klik tengah). Itu sudah terpasang dan dapat diaktifkan dengan hs-minor-mode.

dgtized
sumber
1
Bagus, hontonvis.el menggunakan retasan yang mirip dengan yang saya sarankan, tetapi tanpa keburukan karena harus mengklik dua kali (dengan membaca acara mentah). Terima kasih untuk penunjuknya.
Sigma
3
Hideshowvis.elbekerja dengan baik, terima kasih! Saya punya beberapa masalah untuk membuatnya bekerja pada file JSON dengan js3-mode; untuk mengatasi masalah ini, saya harus memastikan bahwa hontonvis hanya diaktifkan setelah semua tindakan dalam antrian, misalnya:(dolist (hook '(emacs-lisp-mode-hook c++-mode-hook)) (add-hook hook 'hideshowvis-enable)) (defun hideshowvis-enable-immediately () (run-at-time "0 seconds" nil 'hideshowvis-enable)) (add-hook 'js3-mode-hook 'hideshowvis-enable-immediately)
Mathieu Legrand
Ada di melpa sekarang.
dshepherd
4

Meskipun saya tidak berpikir item pinggiran dapat langsung menerima klik (meskipun saya mungkin salah), hack mungkin akan mengikat (kbd "<left-fringe> <double-mouse-1>")

Karena klik pertama akan memindahkan titik ke awal baris yang sesuai dengan ikon pinggiran, menguji nilai (point)dalam fungsi lipat (tidak) hipotetis Anda akan memungkinkan Anda untuk mengidentifikasi bagian kode mana ke (tidak) lipat, atau jika Anda perlu melakukan apa saja (jika tidak ada ikon pinggiran untuk garis ini)

contoh dengan buffer mode-org:

(define-key org-mode-map (kbd "<left-fringe> <double-mouse-1>") 'org-cycle)

Mengklik dua kali pada pinggiran membentuk subtree yang sesuai.

Sigma
sumber