как заставить VIM форматировать скобки функций, условных операторов и циклов на новой строке?

как заставить VIM форматировать скобки функций, условных операторов и циклов на новой строке?

Есть ли способ указать vim форматировать скобки на новой строке?

Например:

public class Foo {
    private Foo(int a) {
        if (a > 30) {
            // do stuff
        }
        for (int i = 0; i < a; i++) {
            // more stuff
        }
    }
}

Должно стать:

public class Foo
{
    private Foo(int a)
    {
        if (a > 30)
        {
            // do stuff
        }
        for (int i = 0; i < a; i++)
        {
            // more stuff
        }
    }
}

Почему это? Потому что нажатие zcVIM аккуратно сворачивает блоки кода, если они отформатированы как во втором примере. В этом случае VIM свернёт только содержимое внутри скобок. Если код отформатирован как в первом примере, VIM свернёт не только содержимое внутри скобок, но и свернёт if (...), for (....), function f(), class Foo(), и так далее. Поэтому я хотел бы узнать, есть ли способ сказать VIM отформатировать файл как во втором примере.

Другой альтернативой было бы указать VIM не сворачивать содержимое перед скобками.

решение1

Да, это можно сделать довольно легко: чтобы заменить существующие символы '{' в конце строк ( $) на возврат каретки ( \r) и новый '{', а затем аккуратно отформатировать все, можно выполнить следующие две команды (хотя см. правку в конце ответа для пограничного случая):

:%s/{$/\r{

:%norm ==

Первая команда приведет к следующему:

public class Foo 
{
    private Foo(int a) 
{
        if (a > 30) 
{
            // do stuff
        }
        for (int i = 0; i < a; i++) 
{
            // more stuff
        }
    }
}

Вторая команда выведет следующее:

public class Foo 
{
    private Foo(int a) 
    {
        if (a > 30) 
        {
            // do stuff
        }
        for (int i = 0; i < a; i++) 
        {
            // more stuff
        }
    }
}

( %Знак в приведенных выше командах означает применить ко всем строкам файла. Вместо этого вы можете указать диапазон, например :5,10s/{$/\r{, или использовать относительные номера строк, например -2,+3s/{$/\r{, или выбрать строки в визуальном режиме и нажать , : и команда подстановки будет применена к этим строкам).

(Вы также можете применить форматирование с помощью =apдля форматирования a paragraph, см. :help =подробности)

Редактировать

Из комментария @blackyellow: Это хорошее решение, но проблема в том, что оно также заменяет строки с '}', которые уже отформатированы правильно. Лучшим шаблоном является :%s/[^( |\t)]}$/\r{, который не будет заменять строки с '}' в конце, если '}' предшествует два пробела или табуляция, что указывает на то, что отступ, вероятно, правильный.

Связанный контент