Creando una configuración personalizada para Emacs. Mi .emacs.d con explicaciones detalladas (III – Lenguajes de programación)

Publicado el 12 febrero 2018 por Gaspar Fernández Moreno @gaspar_fm

Seguimos con la serie de posts sobre mi configuración de Emacs. Hoy toca el turno de los lenguajes de programación y de cómo tengo Emacs configurado para soportarlos. En concreto, mi trabajo diario se centra en C, C++, PHP, Python y Bash, aunque me preocupo por el soporte de Emacs Lisp y de algún que otro lenguaje que utilizo de forma esporádica.

Os dejo aquí enlaces a las dos partes anteriores:

Como habéis podido observar tengo la configuración dividida en varios archivos. En la configuración particular de cada lenguaje tendremos cosas como el autocompletado, coloreado, anidado, navegación en el código o plugins que necesitamos activar o desactivar en algunos casos. Todo ello, incorporado en Emacs para que funcione de forma automática.

Compilaciones

Aquí defino algunas directivas para poder lanzar la compilación de un programa. Unas funciones muy sencillas para poder lanzar un Make sobre el código que estoy editando.

init-compile.el

Lenguajes derivados de C

En Emacs CC-Mode, gestiona los buffers escritos en C. Además, muchos modos para lenguajes parecidos a C (C++, PHP, Javascript, Java, y más) heredan partes de este modo, por lo que es uno de los esenciales.

init-cmode.el

Lo primero que configuramos es la compilación. Permitiendo compilar un programa rápidamente utilizando el comando gcc o g++, en modo depuración, lo cual es muy útil para hacer compilaciones rápidas. También se utiliza el magic-fallback-mode-alist para que los archivos que comiencen por dos barras (//) o #include automáticamente utilicen el modo C++ sea cual sea su extensión. Esto es interesante, cuando estoy editando archivos de Arduino, por ejemplo.

En C-mode podemos configurar casi cualquier aspecto acerca de la colocación del código y de cómo lo indentamos. En principio podemos configurar modos de indentación predefinidos con:

Donde en lugar de linux, podemos escribir gnu, bsd, k&r, stroustrup, y algunos más. Si queremos ver el listado completo, basta con hacer M-x (print c-style-alist). Aunque también podemos configurar cada uno de los elementos por separado, como es mi caso. Aunque hay más elementos para configurar, me basta con indent-tabs-mode, tab-width y c-basic-offset.

Ahora, lo más interesante para mí es el auto-completado. Para ello utilizo autocomplete y semantic. En este caso, para que la información salga mejor en semantic utilizo una función para generar el autocompletado. Es cierto que hay varias formas más de generarlo, mucho más rápidas que tirar de Elisp, pero no funciona excesivamente lento (excepto cuando hay muchos archivos en el proyecto para analizar).

En este archivo trataremos la configuración específica para PHP:

En este fichero se definirán dos funciones para consultar ayuda en línea: my/php-function-lookup y my/php-symbol-lookup. Además, estableceremos el estilo de codificación psr2 y algunas teclas rápidas que vemos al final del post.

init-python.el

Mi configuración para Python es reducida, aunque podemos hacer muchas cosas nada más activando el modo jedi para Python. Actúa sobre el auto-completado, aunque tiene algunas utilidades de análisis de código que harán nuestra programación más amena y productiva.

init-javascript.el

Con este fichero configuramos tanto Javascript, ficheros Json y Coffeescript. Hay algunas teclas comentadas porque realmente no las utilizo, pero podríamos utilizar js-comint-mode para ejecutar código javascript en un buffer mientras editamos en otro.

nxml-mode.el

Ahora le toca el turno a los lenguajes XML y derivados. En los que, cuando los editamos podemos tener algunas ventajas, como por ejemplo, ponerlos bonitos. Aunque hay tres funciones para ello, sanityinc/pp-xml-region, sanityinc/tidy-buffer-xml y jta/reformat-xml cada una tiene sus pros y sus contras. Aunque la única que no me ha dejado tirado nunca es jta/reformat-xml aunque puede llegar a ser algo lenta.

init-ruby.el

Aunque no soy muy de Ruby, alguna vez he tenido que editar algún código y esta configuración no me ha ido mal.

Del mismo modo que antes, incluyo init-sql.el para trabajar con archivos SQL:

Otros lenguajes init-langs.el

Aquí vemos cómo se comportará Emacs con archivos HTML, XML, lua, scripts para ansible, gnuplot, Markdown y algunos más. Eso sí, una cosa que me encanta, auto-compression-mode, que es capaz de utilizar archivos comprimidos de forma transparente para nosotros. Emacs se encarga de comprimir y descomprimir cuando lo crea necesario.

Teclas rápidas

En este post he añadido algunas combinaciones de teclas más a mi Emacs, aquí tenemos un resumen:

  • F6: Compilar el código actual.
  • Shift+F6: Recompilar el código actual. Útil para utilizar una ventana de compilación previamente abierta.
  • C-c h (en C): Cambia entre el buffer con el encabezado y las implementaciones.
  • C-c e (en C): Lista los métodos de un archivos.
  • C-c C-r (en C): Busca referencias a una etiqueta (función, variable, clase, tipo...) dentro de
    un buffer.
  • F1 (en PHP): Muestra ayuda del manual sobre una función del lenguaje. La busca en php.net y visualiza las primeras líneas.
  • F1 (en Python): Muestra ayuda del manual sobre una función o cualquier símbolo
    del lenguaje.
  • C-F1 (en PHP): Se dirige a la ayuda en Internet a través del navegador.
  • C-] (en PHP y Python): Mueve el cursor hacia la definición de la función. Cuando ésta está en el mismo buffer.
  • C-t (en PHP): Vuelve donde estábamos antes. Si por ejemplo, nos hemos movido hacia la definición de función.

Más modos y configuraciones

Seguro que existen muchísimos modos de Emacs más para programar. Me gustaría saber si utilizas alguno que te haya salvado la vida, o funcione realmente bien para los lenguajes con los que trabajas a diario.

También podría interesarte...