¿Hay alguna manera de decirle a vim que dé formato a los corchetes en una nueva línea?
Por ejemplo:
public class Foo {
private Foo(int a) {
if (a > 30) {
// do stuff
}
for (int i = 0; i < a; i++) {
// more stuff
}
}
}
Debe convertirse:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
¿Por qué esto? Porque al presionar zc
VIM se doblan los bloques de código muy bien si tienen el formato como en el segundo ejemplo. En este caso, VIM plegará sólo el contenido entre corchetes. Si el código tiene el formato como en el primer ejemplo, VIM plegará no solo el contenido entre corchetes, sino que también plegará if (...)
, for (....)
, function f()
,
class Foo()
y así sucesivamente. Entonces me gustaría saber si hay alguna manera de decirle a VIM que formatee el archivo como en el segundo ejemplo.
Otra alternativa sería decirle a VIM que no doble el contenido antes de los corchetes.
Respuesta1
Sí, puedes hacerlo con bastante facilidad: para sustituir los caracteres '{' existentes al final de las líneas ( $
) con un retorno de carro ( \r
) y un nuevo '{', y luego formatear bien las cosas, puedes usar los dos comandos siguientes (aunque vea la edición al final de la respuesta para un caso extremo):
:%s/{$/\r{
:%norm ==
El primer comando llegará a esto:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
El segundo comando llegará a esto:
public class Foo
{
private Foo(int a)
{
if (a > 30)
{
// do stuff
}
for (int i = 0; i < a; i++)
{
// more stuff
}
}
}
(El %
signo en los comandos anteriores significa aplicar a todas las líneas del archivo. En su lugar, podría proporcionar un rango como :5,10s/{$/\r{
, o podría usar números de línea relativos como -2,+3s/{$/\r{
, o seleccionar las líneas en modo visual y presionar :
y el comando de sustitución se aplicará a esas líneas).
(También puede aplicar el formato con =ap
para dar formato a
p
a un párrafo, consulte
:help =
para obtener más detalles)
Editar
Del comentario de @blackwhite: Es una buena solución, pero un problema es que también reemplaza las líneas con '}' que ya están formateadas correctamente. Un patrón mejor es :%s/[^( |\t)]}$/\r{
, que no reemplazará las líneas con '}' al final si '}' está precedido por dos espacios o una tabulación, lo que indica que probablemente tenga la sangría correcta.