Código accionable plegable en la franja de Emacs

15

Me gustaría configurar mi franja Emacs para mostrar secciones plegables de código.

Por ejemplo, BBEdit en Mac mostraría lo siguiente al editar un archivo JSON:

Código BBEdit marcas plegables

Las marcas en sí son accionables: hacer clic en una marca expandiría o contraería la sección de código correspondiente. Cuando el documento no tiene un modo que admita el plegado de código, no se muestra la franja.

¿Es posible expandir la funcionalidad marginal de Emacs de tal manera?

Mathieu Legrand
fuente

Respuestas:

16

Hideshowvis agrega íconos en los que se puede hacer clic al margen, pero por alguna extraña razón no está incluido en elpa o melpa. De forma predeterminada, muestra un -código marginal en el borde que se puede plegar y luego elide el contenido con un .... Al habilitarlo hideshowvis-symbols, agrega un +y hace que las sugerencias para contenido plegado sean un poco más fuertes.

Hideshow también permite hacer clic con el mouse en la línea para alternar la visualización usando S-mouse-2(o hacer clic con el botón central). Eso está integrado y se puede habilitar con hs-minor-mode.

dgtized
fuente
1
Agradable, hideshowvis.el usa un truco similar al que estoy sugiriendo, pero sin la fealdad de tener que hacer doble clic (leyendo el evento sin procesar). Gracias por la anotación.
Sigma
3
Hideshowvis.elfunciona muy bien, gracias! Tuve algunos problemas para que funcione con archivos JSON js3-mode; Para solucionar estos problemas, tuve que asegurarme de que hideshowvis solo esté habilitado después de todas las acciones en la cola, por ejemplo:(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
Está en Melpa ahora.
dshepherd
4

Si bien no creo que los elementos marginales puedan recibir clics directamente (aunque podría estar equivocado), un posible hack sería vincular (kbd "<left-fringe> <double-mouse-1>")

Dado que el primer clic movería el punto al comienzo de la línea que corresponde al ícono de franja, probar el valor de (point)en su función hipotética (des) plegar le permitiría identificar qué parte del código (des) doblar, o si debe hacer cualquier cosa (en caso de que no haya un icono de franja para esta línea)

ejemplo con un búfer de modo org:

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

Al hacer doble clic en la franja, se alterna el subárbol correspondiente.

Sigma
fuente