¿Cómo decirle a VIM que formatee corchetes de funciones, condicionales y bucles en una nueva línea?

¿Cómo decirle a VIM que formatee corchetes de funciones, condicionales y bucles en una nueva línea?

¿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 zcVIM 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 =appara dar formato a pa 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.

información relacionada