viernes, 11 de noviembre de 2011

Identando groovy:



Supongamos que tenemos un archivo como el siguiente:



Cuando hacemos la típica secuencia de vim para identar que sería:
- gg: ir al inicio,
- =: identar...
- G: ...hasta el final
gg=G

Queda así:


Notar que no está bien identado, por ejemplo líneas 12, 17, 27 deberían estar un nivel antes.


gg=G funciona muy bien para C, java, javascript, xml pero no en groovy.

Hay una forma mejor?

Sería ideal que cada vez que vim encuentre un {\n idente un nuevo nivel a lo que está adentro.

Para eso podemos hacer dentro del { un:

>: identar lo que está...
i: dentro de...
{: la llave

>i{

También funciona con corchetes u otros wrappers (>i[, >i", etc).

De esta forma podemos ir a mano llave por llave ejecutando la secuencia >i{.

Para facilitar la tarea vim tiene un comando llamado globals, con lo cual le podemos decir que cada vez que encuentre una regexp haga una secuencia.

Sería:

: : entra en modo comando
g : globalmente...
/{\n: a todo lo que matchea con una llave seguida de un newline...
/normal : ejecutá en modo normal...
j: baja una línea
0: ir posición 0 (para no hacer conflicto con una llave que se pueda abrir en la misma posición
>i{: identá lo que está dentro de llaves

:g/{\n/normal j0>i{

Antes de eso deberíamos des-identar, para eso pintamos todo el código y lo bajamos a nivel 0

con:

ggvG: pinto todo el código
1000<: desidentar 1000 veces (exagerado?) quedaría así:

Y luego aplicamos la secuencia:
:g/{\n/normal j0>i{

y queda así:


Luego de aprender podemos escribir una función que haga todo esto llamada GIdent y también pensar en los closures que en vez de comenzar con { comienzan con { argumentos ->\n.




Por cualquier cosa pueden bajarse addiciones de mis dotfiles en github.com

1 comentario:

sebagun dijo...

Muy bueno Damián, seguí posteando estas cosas útiles!
Aunque quizás no lo use sirve para aprender.