Notxor tiene un blog

Defenestrando la vida

EditorConfig y Emacs

2021-12-30

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 con space.
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) o crlf (tipo Windows).
charset
establece el tipo de código que se utilizará. Los valores admitidos son: latin1, utf-8, utf-8-bom, utf-16be o utf-16le.
trim_trailing_whitespace
Si lo establecemos a true elimina cualquier espacio en blanco al final de las líneas y puesto a false 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 a false 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.

Categoría: emacs editorconfig

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.