Álvaro González Sotillo

Folding inicial en Emacs

Tras mi primer paquete para Emacs, presento ahora este otro para ocultar inicialmente secciones de código fuente.

1. Motivación

Hay varios paquetes que se dedican a ocultar secciones de código, basándose simplemente en la indentación de las líneas o en la detección de estructuras y funciones.

Pero en todos ellos el fichero aparece inicialmente desenrollado, sin ocultar ninguna sección. Pero a mí me gustaría que se ocultasen inicialmente algunas secciones que estuvieran marcadas con algún tag especial. Decidí extender Origami e implementar esa funcionalidad.

2. Cómo se usa

Se puede instalar desde Melpa. Cuando se desea que un bloque aparezca oculto al abrir un fichero, se añade *autofold* en la primera línea del bloque.

   public void boringMethod(){ // *autofold*
      foo();
      bar();
   }

En algunos casos no se puede añadir nada en la primera línea del bloque. Por ejemplo, tengo algunos shell scripts con variables que ocupan muchas líneas. En ese caso uso *autofold:*, que colapsa la línea siguiente.

   # A very long shell variable with newlines
    # *autofold:*
   LOREM="
     Pellentesque dapibus suscipit ligula.  
     Donec posuere augue in quam.  
     Etiam vel tortor sodales tellus ultricies commodo. 
     Suspendisse potenti.
     Aenean in sem ac leo mollis blandit. 
     ...
   "

En otros casos, las secciones a ocultar se pueden identificar con un patrón del propio código fuente. Por ejemplo, puede ser interesante ocultar todos los métodos privados en un fichero java. Para ello pueden usarse expresiones regulares que los encuentren cada vez que se active el java-mode:

  (defun origami-predef-java()
    "Close some predefined patterns, useful in java."
    (interactive)
    (origami-predef-apply-patterns '("private .*{" "protected .*{")))
  (add-hook 'java-mode-hook #'origami-predef-java)

El código anterior forma parte del fichero de inicialización de Emacs. Crea una función de nombre origami-predef-java que cierra todos los bloques que encajen con la expresiones regulares private .*{ y protected .*{, por lo que se cierran todos los métodos privados y protegidos. Después, engancha esa función a los ficheros con el modo java-mode.

Como ejemplo adicional, cuando abro los ficheros sql oculto todas las creaciones de tablas y vistas, y también los cuerpos de los procedimientos y funciones:

 (defun origami-predef-sql()
    "Close some predefined patterns, useful in SQL."
    (interactive)
    (origami-predef-apply-patterns '("create .*table" "create .*view" "begin")))
  (add-hook 'sql-mode-hook #'origami-predef-sql)

3. Cómo está hecho

El código fuente puede encontrarse en el repositorio de Github.