Cuando trabajamos con código legado, especialmente en proyectos de Java y Groovy, es común encontrar ruido acumulado: punto y coma innecesario, modificadores redundantes, getters/setters generados automáticamente, comentarios antiguos o demasiadas líneas en blanco.
Vim puede convertirse en una herramienta extremadamente poderosa para limpiar todo eso sin salir del editor. Los comandos siguientes usan tres ideas centrales:
- Buscar patrones en múltiples archivos con
:vimgrep - Aplicar cambios masivos con
:cfdo - Eliminar bloques completos usando
:gy expresiones regulares
:vimgrep /;/ src/main/groovy/com/expresso/actionForms/*.groovyEste comando busca el carácter ; dentro de todos los archivos .groovy ubicados en:
src/main/groovy/com/expresso/actionForms/
Los resultados se cargan automáticamente en la lista quickfix.
:copen:cnext
:cprev:cfdo %s/\;//g | update:cfdoAplica el comando siguiente a cada archivo de la lista quickfix.
%s/\;//gElimina todos los ; del archivo actual.
updateAntes:
String name;
Integer age;Después:
String name
Integer age:vimgrep /public / src/main/groovy/com/expresso/collections/**/*.groovyLuego:
:cfdo %s/public //g | updateGroovy no necesita explícitamente public en muchos casos.
Antes:
public String nameDespués:
String name:vimgrep /private / src/main/groovy/com/expresso/collections/**/*.groovy
:cfdo %s/private //g | updateAntes:
private String codeDespués:
String code:g/\v^\s*(\w)\s+(get|set)\w*\(\)\s*\{/,/^\s*\}/dElimina bloques completos que parecen métodos get o set.
\vHace más simple escribir regex en Vim.
^\s*\w+(get|set)\w*Coincide con:
getName
setValue
getUserData
\(\)\s*\{/^\s*\}/Busca la llave de cierre.
:g/\v^\s*\w+\s+(get|set)\w*\(\)\s*\{/,/^\s*\}/dString getName() {
return name
}:g/\v^\s*\w+\s+get\w*\(\)\s*\{/,/^\s*\}/dAntes:
String getName() {
return name
}Después:
:g/\v^\s+\/\*\*/,/^\s*\*\//dAntes:
/**
* Nombre del cliente
*/
String nameDespués:
String name:g/\v^\s*\w+\s+is\w*\(.*\)\s*\{/,/^\s*\}/dBoolean isActive() {
return active
}:g/\v^\s*\w+.*\s+get\w*\(\)\s*\{/,/^\s*\}/dList<String> getItems() {
return items
}:g/\v^\s*\w+\s+set\w*\(.+\)\s*\{/,/^\s*\}/dvoid setName(String name) {
this.name = name
}:vimgrep /\v^\s*\w+.*\s+get\w*\(\)\s*\{/,/^\s*\}/ src/main/groovy/com/expresso/collections/**/*.groovyLuego:
:cfdo g/\v^\s*\w+.*\s+get\w*\(\)\s*\{/,/^\s*\}/d | update:vimgrep /\v^\s*\w+.*\s+set\w*\(.+\)\s*\{/ src/main/groovy/com/expresso/collections/**/*.groovyLuego:
:cfdo g/\v^\s*\w+.*\s+set\w*\(.+\)\s*\{/,/^\s*\}/d | update:vimgrep /\v^\s+\/\*\*/,/^\s*\*\// src/main/groovy/com/expresso/collections/**/*.groovyLuego:
:cfdo g/\v^\s+\/\*\*/,/^\s*\*\//d | update:vimgrep /\n\{3,}/ src/main/groovy/com/expresso/collections/**/*.groovy:%s/\n\{3,}/\r\r/eEsto convierte secuencias de 3 o más saltos de línea en únicamente 2.
:vimgrep /patron/ ruta/**/*.groovy:copen:cfdo comando | updategit diffHaz este tipo de limpieza en una rama separada:
git checkout -b cleanup/groovy-vim-refactorY realiza commits pequeños:
git add .
git commit -m "Remove unnecessary semicolons"Luego:
git add .
git commit -m "Remove redundant visibility modifiers"Vim no es solamente un editor de texto. Con vimgrep, quickfix, cfdo, :g y expresiones regulares, puede convertirse en una herramienta muy poderosa de refactorización textual.
En proyectos Groovy heredados, estos comandos permiten:
- eliminar ruido sintáctico
- remover getters/setters innecesarios
- limpiar documentación obsoleta
- normalizar formato
- hacer refactors masivos extremadamente rápidos
La clave está en trabajar cuidadosamente:
- Buscar
- Revisar
- Modificar
- Validar con Git
Vim aquí funciona como un bisturí de mantenimiento: pequeño, preciso y extremadamente poderoso.