Notxor tiene un blog

Defenestrando la vida


Plegando el código

Cuando programo me gusta ver todo el código. A veces en ficheros largos los desplazamientos pueden ser largos, pero me apaño bien poniendo marcas donde saltar o utilizando M-g g (goto-line) para saltar a la línea deseada, o M-g c (goto-char) para ir a un carácter determinado --pero esto es más complicado de saber a priori--. Se puede uno mover de forma directa a otros sitios (al siguiente error, al error previo o a una posición determinada de la línea actual. Pero como ya digo, lo que más utilizo es la función goto-line.

¿Por qué estoy contando esto? Pues hace unos días un amigo ha hecho un cambio de trabajo. Hasta ahora programaba utilizando IDE's y herramientas muy concretas desde el «güindón del Bili Puertas» y ahora se encontraba en otro mundo. Puede utilizar el S.O. que prefiera con las herramientas que quiera para escribir el código. Él, habiéndome leído bastante lo pesadico que me pongo con el software libre en general y emacs en particular, ha decidido que probará a cambiar de herramientas y pasarse a la vía de los libres. Principalmente, porque eso le permite llevarse al trabajo un ordenador viejo en lugar del carísimo de la muerte y si se le escacharra en el tranvía pues tampoco pierde mucho. El caso es que hablando con él me dice que se ha repasado todos los artículos de mi blog sobre emacs y org-mode: se ha configurado la agenda, se ha configurado el correo electrónico, se ha pasado a i3wm como entorno de ventanas (awesomewm no le ha convencido), carga el editor con emacsclient, incluso ha configurado el powerline y el tree-mode, y se ha instalado orgzly en el móvil. Vamos, que va el tío y sigue todos mis consejos, personalizándose algunas cosas incluso metiendo algo de código en elisp que dice haber aprendido de mi minicurso. Y al final va y me hace una pregunta tonta: Oye, tú que sabes mucho de esto ¿Cómo se pliega el código?

Al principio no supe bien a qué se refería... ¿plegar código?.

─ Seguro que se puede. org-mode te lo muestra plegado por defecto si no le especificas otra cosa en el #+STARTUP ─me dijo.

─ ¡Oh! ¡Vaya! ¿¡Te refieres al outline!? ¡Vale! Escribo una minientrada en mi blog para explicarlo, pero la respuesta corta es: activa el outline-minor-mode y podrás plegarlo.

─ ¡Otro paquete que instalar!

─ No, no. outline viene de serie con emacs, no tienes que instalar nada. Lo único que tienes que hacer es configurar las teclas si quieres, pero eso ya te lo explico en el blog que es más largo.

Bueno, el caso es que estoy aquí para explicar básicamente eso y no mucho más. Como he dicho, es un modo que no suelo utilizar porque yo soy de los que les gusta tener todo el código a la vista, pero alguna vez lo he utilizado para plegar comentarios enormes que te hacen perder el hilo del código (es lo que tiene intentar hacer programación literaria escribiéndolo todo en el mismo fichero del código).

Y lo primero un aviso: no confundáis outline-minor-mode con outline-mode. Esto es un modo mayor y por tanto te cerrará el modo en el que estés trabajando para ponerse él. Lo normal, cuando programas es utilizar el minor, que te permite tener activado un modo mayor para Python, por ejemplo, y el plegado de código a la vez.

Comando Acción
M-x outline-minor-mode Establece el modo
C-c @ C-t oculta todo el buffer excepto cabeceras
C-c @ C-a muestra el texto completo del buffer
C-c @ C-q oculta todo menos las cabeceras principales
C-c @ TAB muestra todas las subcabeceras de la actual
C-c @ C-k muestra las subcabeceras pero no los cuerpos
M-x outline-previous-heading va a la cabecera anterior
M-x outline-next-heading va a la siguiente cabecera
C-c @ C-p va a la anterior cabecera visible
C-c @ C-n va a la siguiente cabecera visible
   

Como se puede ver la combinación C-c @ no es precisamente de las cómodas, pero en la documentación del paquete se propone o se sugiere, para quien utilice este modo con profusión otra configuración que puede facilitar el acceso un poco, copio el siguiente código de allí (no lo he probado, pero entiendo que estando en la ayuda del paquete del modo, debe ser correcto):

; Outline-minor-mode key map
(define-prefix-command 'cm-map nil "Outline-")
; HIDE
(define-key cm-map "q" 'hide-sublevels)    ; Hide everything but the top-level headings
(define-key cm-map "t" 'hide-body)         ; Hide everything but headings (all body lines)
(define-key cm-map "o" 'hide-other)        ; Hide other branches
(define-key cm-map "c" 'hide-entry)        ; Hide this entry's body
(define-key cm-map "l" 'hide-leaves)       ; Hide body lines in this entry and sub-entries
(define-key cm-map "d" 'hide-subtree)      ; Hide everything in this entry and sub-entries
; SHOW
(define-key cm-map "a" 'show-all)          ; Show (expand) everything
(define-key cm-map "e" 'show-entry)        ; Show this heading's body
(define-key cm-map "i" 'show-children)     ; Show this heading's immediate child sub-headings
(define-key cm-map "k" 'show-branches)     ; Show all sub-headings under this heading
(define-key cm-map "s" 'show-subtree)      ; Show (expand) everything in this heading & below
; MOVE
(define-key cm-map "u" 'outline-up-heading)                ; Up
(define-key cm-map "n" 'outline-next-visible-heading)      ; Next
(define-key cm-map "p" 'outline-previous-visible-heading)  ; Previous
(define-key cm-map "f" 'outline-forward-same-level)        ; Forward - same level
(define-key cm-map "b" 'outline-backward-same-level)       ; Backward - same level
(global-set-key "\M-o" cm-map)

De ese modo establece M-o como la combinación para el plegado y además añade configuración para todas las posibles acciones. Si os fijáis en la tabla anterior, había dos que la forma de acceder era con el comando completo desde el minibuffer. Es una combinación bastante apañá, porque no recuerdo ningún modo que mapee M-o para ninguna acción (así que tendrás pocas colisiones) y la o es fácil recordarlo por lo de outline.

Por último, si vas a utilizar este modo con bastante asiduidad como para configurar las teclas de acceso, lo mismo también quieres que se active cuando abras un archivo de código:

(add-hook 'prog-mode-hook 'outline-minor-mode)

Y esto es todo. Espero haber sido de ayuda.


Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, se ha decidido activar un filtro antispam y guardar las direcciones IP con el único objeto de añadir a la lista de bloqueos las que correspondan a spam y otras actividades maliciosas.

Disculpen las molestias.