EditorConfig y Emacs
Una de las cosas que suele extrañar a los nuevos usuarios de Emacs es su manera de realizar las indentaciones. Muchas veces puede ser percibido como un problema y es que, en la mayoría de los casos, dependen del modo de edición y no hay un comando estándar que permita realizarlas. En la mayoría de los casos, eso se debe a que quien programa el modo ajusta la indentación a las recomendaciones, costumbres y convenios de estilo más aceptados para cada lenguaje. No es muy intuitivo para el usuario primerizo y para algunos puede ser un problema. Aunque, en general no lo es, hay ocasiones en que uno, participando en un grupo de trabajo se encuentra con políticas específicas para el código y ajustar el comportamiento de Emacs puede ser un dolor de cabeza para el usuario novel. En este artículo hablaré de cómo hacerlo de manera muy sencilla.
La respuesta corta es: Descarga editorconfig-mode
y configúralo.
La respuesta larga será el resto del artículo, donde contaré cómo
instalarlo, configurarlo y utilizarlo.
¿Qué es EditorConfig?
El proyecto EditorConfig es un proyecto que intenta crear un estándar para ayuda a mantener de forma consistente el estilo de código, bien sea entre distintos desarrolladores o bien sea entre distintos editores de código.
La configuración se carga en un fichero de nombre .editorconfig
que
puede dividirse en varios directorios o utilizar uno para cada
proyecto. El editor lo buscará en el directorio actual y realizará una
búsqueda en el path
hasta llegar al archivo .editorconfig
que esté
marcado con la propiedad root = true
. Si es un estándar ¿Qué
editores lo soportan?
- De manera nativa: BBEdit, CodeCrusader, CodeLite, elementaryCode, Builder, Gitea, GitHub, GitLab, GitBucket, Gogs, IntelliJidea, jdTextEdit, Kate, KTextEditor, Komodo, Kakoune, MonoDevelop, Nova, PyCharm, ReSharper, Rider, RubyMine, Sourcehut, SourceLair, TortoiseGit, VisualStudio (no la versión Code, que necesita plugin), WorkingCopy
- Con plugin:, AppCode, Atom, Brackets, C Lion, Coda, Code::Blocks, Eclipse, Emacs, FarManager, Geany, Gedit, jEdit, Lazarus, Micro, NetBeans, Notepad++, Pluma, PhpStorm, Sublime Text, Textadept, textmate, Vim, VSCodium, VisualStudio Code
La lista puede ser más larga, pero aquí están los principales editores de código. Si estás utilizando alguno que no se encuentre en ella, debes buscar en la documentación de tu editor si soporta el estándar EditorConfig, si lo hace de forma nativa o mediante plugin y cómo puedes instalarlo y configurarlo. Yo me voy a centrar en configurarlo en Emacs, que es mi editor principal.
Configuración
Antes de nada, pondré el código del fichero que estoy utilizando yo para que sirva de guía o de base para que cada uno se haga el suyo:
# El principal .editorconfig root = true # Fin de linea estilo UNIX, acabar con un salto de línea # y elimitar espacios al final de la línea [*] end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true # Especificar el `charset` para javascript, python y erlang [*.{js,py,erl}] charset = utf-8 # Para python: indentación de cuatro espacios en blanco [*.py] indent_style = space indent_size = 4 # Makefile necesita tabuladores para funcionar [Makefile] indent_style = tab tab_width = 8 # Para javascript: indentación de dos espacios en blanco [*.js] indent_style = space indent_size = 2 # Indentación para erlang: cuatro espacios en blanco [*.{erl,hrl,app}] indent_style = space indent_size = 4 # Indentación para C/C++: cuatro espacios en blanco [*.{c,cc,cpp,h,hpp}] indent_style = space indent_size = 4 # Indentación para R: dos espacios en blanco [*.R] indent_style = space indent_size = 2
Utiliza un formato muy parecido a los ficheros de configuración
habituales y no creo que se necesite explicar mucho más. Cada bloque
consiste en una cabecera delimitada por caracteres [...]
y tras ella
las propiedades que se aplicarán a los ficheros que coincidan con la
misma. Para dichas cabeceras se utilizan una serie de caracteres que
nos permiten establecer expresiones de manera muy similar a como lo
hacen las expresiones regulares, pero bastante más simplificado.
Carácter | Descripción |
---|---|
* |
Cualquier cadena que no contenga / |
** |
Cualquier cadena |
? |
Cualquier caracteres |
[nombre] |
Coincidencia carácter a carácter |
[!nombre] |
Que no coincida con nombre |
{c1,c2,c3} |
Coincidencia con cualquiera de las cadenas |
{num1..num2} |
Con cualquier entero entre num1 y num2 |
Los caracteres especiales se pueden introducir escapándolos con
backslash, como por ejemplo \[
.
La lista de propiedades no es muy larga:
indent_style
- Especifica si queremos que utilice tabulador con
tab
o espacios en blanco conspace
. indent_size
- La cantidad de columnas de ancho que tendrá cada nivel de indentación, cuando se utilizan espacios en blanco.
tab_width
- Ancho del carácter tabulador. Normalmente no se
necesita, pues utiliza como valor por defecto el
indent_size
. end_of_line
- establece el tipo de final de línea y admite los
valores
lf
(tipo UNIX),cr
(tipo Mac) ocrlf
(tipo Windows). charset
- establece el tipo de código que se utilizará. Los
valores admitidos son:
latin1
,utf-8
,utf-8-bom
,utf-16be
outf-16le
. trim_trailing_whitespace
- Si lo establecemos a
true
elimina cualquier espacio en blanco al final de las líneas y puesto afalse
para que no lo haga. insert_final_newline
- puesto a
true
se asegura de que el fichero finalice con un carácter de salto de línea. Puesto afalse
no lo comprobará. root
- debe especificarse en lo alto del fichero de
configuración, siendo la primera propiedad especificada. Cuando lo
configuramos a
true
estamos especificando que se deje de realizar la búsqueda del fichero de configuración en éste.
Configurar Emacs para EditConfig
Como he dicho antes, Emacs está en la lista de editores que soportan
EditConfig mediante un plugin, lo que en Emacs se llama un
paquete de modo. En este caso, editorconfig.el
proporciona un
modo menor para Emacs. La instalación es muy sencilla pues el
paquete está en MELPA
.
M-x package-install RET editorconfig RET
Una vez instalado podemos configurarlo para que funcione adecuadamente con nuestros proyectos. En su página, recomiendan:
(require 'editorconfig) (editorconfig-mode 1)
O, en caso de que utilices use-package
, la configuración recomendada
es:
(use-package editorconfig :ensure t :config (editorconfig-mode 1))
Ambas configuraciones son válidas si quieres que Emacs utilice dicho modo por defecto y siempre. Sin embargo, en mi caso no es así: sólo necesito que lo haga en un proyecto donde el trabajo conjunto con otros programadores con otros usos y costumbres y que me obliga a usarlo para modificar el indentado por defecto del modo mayor sin volverme loco.
En mi init.el
he añadido lo siguiente:
(use-package editorconfig :defer t :init (add-hook 'ess-mode-hook 'editorconfig-mode-apply))
No voy a explicar mucho, porque creo que las cuatro líneas están
autoexplicadas. Básicamente, la diferencia es que sólo quiero que se
active la configuración cuando se entra en el modo ESS
, es decir,
cuando trabajo con R
. Para ello he añadido un :defer t
y también
he añadido un add-hook
para que dispare el editconfig
al entrar en
el modo ess-mode
. Con una particularidad: al principio utilizaba
editorconfig-mode
a secas, pero eso activaba el modo para todos los
buffers y lo mantenía activo una vez cerrados los ficheros de R
que es, únicamente, donde lo necesito. Sin embargo, con
editorconfig-mode-apply
establezco el modo únicamente para el
buffer concreto, cuando lo cierro, los demás buffers no se ven
afectados por el modo.
Conclusiones
El resultado de utilizar EditorConfig es la homogeneización del
código entre distintos editores o desarrolladores. En mi caso lo
utilizo para un proyecto conjunto en R
con otro compañero que ya lo
tenía iniciado y al que le molestan los anchos de 4 espacios que
introduce mi Emacs sin añadirle nada más. Puesto que tenía que
amoldarme al código ya escrito era muy incómodo escribir cualquier
función teclear directamente todos los espacios, o peor aún, pulsar
tabulador y luego borrar los espacios que me sobraban. Otra solución
es utilizar un editor distinto para ese trabajo específico. Las
opciones, que me planteé, eran utilizar o bien RStudio o bien
Kate. Ambos potentes editores, el primero dedicado casi
exclusivamente al trabajo sobre R
, aunque también esté configurado
para asistir con lenguajes complementarios como LaTeX. Kate es un
editor muy potente perteneciente al proyecto KDE/Plasma y que
proporciona soporte para la mayoría de los lenguajes de programación
habidos y por haber. También soporta nativamente el estándar
EditorConfig. Sin embargo, no quería renunciar a mi editor favorito
y editorconfig-mode
me proporciona la manera de salvar ese escollo.
Comentarios