Как выровнять имена параметров функций в формате clang?

Можно ли использовать clang-format для форматирования членов структуры и имен параметров функций в столбцы?

Например:

struct
{
   int           alpha; //aligned to 'b' of "beta"
   unsigned int  beta;
   MyObject     *gamma; //aligned with 'g' not '*'
};

void foobar (int           alpha, //aligned to 'b' of "beta"
             unsigned int  beta
             MyObject     *gamma) //aligned with 'g' not '*'
{
}

Если это невозможно, могу ли я как-то расширить clang-format для этого?


person lanoxx    schedule 20.09.2015    source источник


Ответы (3)


Что ж, можешь подойти поближе.

Для объявлений функций:

Вы можете установить BinPackParameters=false, что приведет к тому, что все параметры объявления функции будут либо в одной строке, либо каждый в другой строке, и они будут выровнены, как вы показываете.

(Но не с табуляцией между типами и идентификаторами. Это невозможно в формате clang прямо сейчас, afaik.)

Также см. Вариант AllowAllParametersOfDeclarationOnNextLine

Разрешить помещать все параметры объявления функции в следующую строку, даже если BinPackParameters имеет значение false.

Для структур я не думаю, что вы сможете этого добиться.

Я сам писал патчи для clang-формата в прошлом, и думаю, что потребуется много работы, чтобы добиться такого выравнивания, как вы предлагаете. Чтобы это поддержать, вам придется самостоятельно написать немного C ++ в формате clang lib.

person Chris Beck    schedule 20.09.2015
comment
Я не уверен, что это правда, если я использую BinPackParameters=false, то каждый параметр выравнивается по отдельной строке, но только типы параметров выравниваются по своей первой букве, а не сами имена параметров. Или я ошибся? Я использую clang-format-3.6 кстати. - person lanoxx; 20.09.2015
comment
Да, это то, что я имел в виду, говоря в скобках. Я не думаю, что вы можете получить выравнивание точно так, как вы показываете, используя формат clang. - person Chris Beck; 20.09.2015
comment
Хорошо, я понимаю, хорошо, спасибо за ответ, особенно последний абзац, так как это был бы мой следующий вопрос. Я бы очень хотел увидеть эту функцию, но на данный момент у меня нет времени, чтобы написать такой патч, особенно, если он требует большой работы. Тем не менее, эта функция была бы очень полезной, потому что я пишу много кода, где рекомендации по стилю кода требуют, чтобы я написал выровненные параметры функций и элементы структуры. Использование clang-format с хук pre-commit в git было бы просто идеальным. - person lanoxx; 20.09.2015
comment
Очень жаль отсутствие поддержки табуляции - person Tatiana Racheva; 06.04.2021

clang-format недавно (3.7 или 3.8) получил несколько дополнительных опций для настройки выравнивания, то, что я задавал в моем вопросе, все еще не полностью поддерживается, но теперь мы можем подойти немного ближе:

AlignConsecutiveDeclarations: true

который выравнивает объявления, как показано выше.

К сожалению, управление форматированием звездочки указателя все еще ограничено, см. clang-format: выровняйте звездочку (*) объявления указателя с переменной имя

person lanoxx    schedule 15.07.2016
comment
В более новых версиях clang-формата мне нравится идти дальше и использовать AcrossEmptyLinesAndComments вместо true - person jav; 28.05.2021

Следуя вашему сообщению, я могу получить следующее:

struct
{
  int          alpha;
  unsigned int beta;
  MyObject *   gamma;
};

void foobar( int          alphaXXXXXXXXXX,
             unsigned int betaXXXXXXXXX,
             MyObject *   gammaXXXXXXXX )
{
}

с BinPackArguments и BinPackParameters оба false, а для AlignConsecutiveAssignments и AlignConsecutiveDeclarations установлено значение true (документация из эти параметры). Мне пришлось увеличить длину переменных до функции, потому что оригинал мог уместить их все на одной строке.

person Ahmed Fasih    schedule 23.01.2018
comment
Можете ли вы расположить звездочку * объекта MyObject справа от белого пространства, непосредственно перед g гаммы? - person lanoxx; 24.01.2018
comment
Извините, @lanoxx, это невозможно (пока): для PointerAlignment можно установить значение Left / Справа / посередине, но это относится к одному пробелу между типом и звездочкой, поэтому нет возможности поставить звездочку рядом с переменной. - person Ahmed Fasih; 24.01.2018