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 eloutline-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.