Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: juvf от Сентябрь 28, 2020, 07:15



Название: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 28, 2020, 07:15
Есть ли Автоматическое форматирование кода в QtCreator?

Например в Eclipse открываешь такой код
Код:
void f(){

if(a){s=0;}
                 else
{s=1;}}


Настраиваешь свой стиль (я свой стиль храню в облаке/нафлешке в xml и просто подцепляю его на новом рабочем месте), нажимаешь Ctrl+Shift+F, и подобный код превращается в такой

Код:
void f()
{

    if(a)
    {
         s=0;
    }
    else
    {
        s=1;
    }
}

Нашел в QtCreator-e настройку стиля, но как его применить к написанному коду?



ps Хорошо, если QtCreator это ещё не подрос и этого не умеет, то может кто-нибудь знает какую-нибудь утилиту, в которой можно выбрать папку, и "сказать - Переформатируй все файлы *.c, *.cpp, *.h, ... в формат вот такой" и одним махом у всех исходников поменять стиль? Можно каждый файл открыть в Eclipse и переформатировать, но проект большой и это будет долго и муторно...


Название: Re: Автоматическое форматирование кода
Отправлено: Пантер от Сентябрь 28, 2020, 08:06
Судя по stackoverflow https://stackoverflow.com/questions/37597117/what-is-the-shortcut-to-format-code-in-qt-creator#40174996 это решается отдельным плагином. facepalm... Изкоробки есть автоформатирование qml кода.


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 28, 2020, 10:54
одним отдельным плагином это не решается. Плагин может только вызвать внешний форматер. Ещё нужно установить сам форматтер. См тут   (https://doc.qt.io/qtcreator/creator-beautifier.html)
Я выбрал форматтер ClangFormat. В ClangFormat есть несколько дефолтных стилей (есть CNU, но Qt не предлагает gnu). Новый свой стиль настроить - это адский текстовый конфиг. Сделаю свой стиль, закину в своё облако для креатора.


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 11:19
в репе Креатора есть конфигурации для клана формата. требует небольшого допила на мой вкус но хорошая отправная точка


Название: Re: Автоматическое форматирование кода
Отправлено: kambala от Сентябрь 28, 2020, 11:47
чет не понял, Ctrl+I не работает что ли?


Название: Re: Автоматическое форматирование кода
Отправлено: Пантер от Сентябрь 28, 2020, 11:48
А люди еще спорят, когда я говорю, что QtCreator отстойное IDE... Автоформатирование это какбэ базовая функциональность.


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 12:00
Пантер
Ты не путаешь автоформатирование с выравниванием отступов?
Креатор предлагает на выбор 2-3 внешних тулзы для форматирования. Зачем им писать 4ю которая будет хуже чем шланг-формат?


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 28, 2020, 12:07
чет не понял, Ctrl+I не работает что ли?
не работает и ни когда не работало. Ctrl+I вам расставит отступы/табы, а форматирование не сделает. Скобочки не расставит, новые строки и т.п. не расставит. Попробуйте мой код в первом посте по Ctrl+I. Получиться гэ. 

Цитировать
когда я говорю, что QtCreator отстойное IDE...
Да конечно отстойное.... во времена тролтеча был годный Qt плуг для эклипса. Сейчас плуга нет, приходиться пользоваться тем, что есть.

ps в ClangFormat  нашел
Цитировать
This will align the assignment operators of consecutive lines. This will result in formattings like

int aaaa           = 12;
int b                = 23;
int ccаааааааc  = 23;



Название: Re: Автоматическое форматирование кода
Отправлено: Пантер от Сентябрь 28, 2020, 12:18
Пантер
Ты не путаешь автоформатирование с выравниванием отступов?
Креатор предлагает на выбор 2-3 внешних тулзы для форматирования. Зачем им писать 4ю которая будет хуже чем шланг-формат?
Почему нет хоть одной тулзы в стандартной поставке? Выравнивание отступов это не то, нужно именно форматирование. Отступы есть и в виме :)


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 12:21
Почему нет хоть одной тулзы в стандартной поставке? Выравнивание отступов это не то, нужно именно форматирование. Отступы есть и в виме :)

Так какую из 3х тащить?


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 28, 2020, 12:27
Зачем им писать 4ю которая будет хуже чем шланг-формат?
Зачем они написали свой редактор, который был хуже существующих (тех же эклипсок или kdevelop)? Вот сейчас дебажу код...  в брейкпоинте не показывает мне элемент QDomNode, только его адрес и тип. Через 5-10 шагов дебага креатор вылетает.

Я тоже считаю, что автоформатирование должно быть из коробки.


Название: Re: Автоматическое форматирование кода
Отправлено: Пантер от Сентябрь 28, 2020, 12:32
Почему нет хоть одной тулзы в стандартной поставке? Выравнивание отступов это не то, нужно именно форматирование. Отступы есть и в виме :)

Так какую из 3х тащить?

Допустим, самую распространенную.


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 28, 2020, 12:40
а шланг может (без креатора) все исходные файлы проекта в папке и в подпапаках одной командой переформатировать?


Название: Re: Автоматическое форматирование кода
Отправлено: Racheengel от Сентябрь 28, 2020, 12:58
Зачем они написали свой редактор, который был хуже существующих (тех же эклипсок или kdevelop)?
Потому что посоны и МОГУТ. :) Иначе как? Своя ИДЕ - как свой калькулятор.

Я тоже считаю, что автоформатирование должно быть из коробки.
+1


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 13:16
Допустим, самую распространенную.

Это какая?


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 13:17
который был хуже существующих (тех же эклипсок или kdevelop)?

Смешно, кроме Эклипса только Хром жрет больше памяти.
КДевелоп уже не тащит половину кедов за собой и работает под маком?

https://www.kdevelop.org/download
Код:
No official pre-built installers available currently
Код:
No official pre-built installers available yet


Название: Re: Автоматическое форматирование кода
Отправлено: kambala от Сентябрь 28, 2020, 13:24
чет не понял, Ctrl+I не работает что ли?
не работает и ни когда не работало. Ctrl+I вам расставит отступы/табы, а форматирование не сделает. Скобочки не расставит, новые строки и т.п. не расставит. Попробуйте мой код в первом посте по Ctrl+I. Получиться гэ.  
понял, спасибо
а шланг может (без креатора) все исходные файлы проекта в папке и в подпапаках одной командой переформатировать?
может, но список файлов ему надо скормить (например, через команду find):
Код:
❯ clang-format -h 
OVERVIEW: A tool to format C/C++/Java/JavaScript/Objective-C/Protobuf/C# code.

If no arguments are specified, it formats the code from standard input
and writes the result to the standard output.
If <file>s are given, it reformats the files. If -i is specified
together with <file>s, the files are edited in-place. Otherwise, the
result is written to the standard output.

USAGE: clang-format [options] [<file> ...]

также есть удобная штука git-clang-format, которая форматирует только файлы, добавленные в индекс гита (т.е. в состоянии staged).


Название: Re: Автоматическое форматирование кода
Отправлено: ViTech от Сентябрь 28, 2020, 13:36
ClangFormat plugin in Qt Creator 4.9 (https://www.qt.io/blog/2019/04/17/clangformat-plugin-qt-creator-4-9) в коробке, вроде как. Я пользуюсь, вполне нормально.

а шланг может (без креатора) все исходные файлы проекта в папке и в подпапаках одной командой переформатировать?

ClangFormat (https://clang.llvm.org/docs/ClangFormat.html), можно подать на вход несколько файлов. Список файлов в папке/подпапках можно получить другой утилитой, unix-way....


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 13:38

ClangFormat (https://clang.llvm.org/docs/ClangFormat.html), можно подать на вход несколько файлов. Список файлов в папке/подпапках можно получить другой утилитой, unix-way....

Есть же compilation database и jq. Выцепить файлы проекта задача тривиальная, нет?


Название: Re: Автоматическое форматирование кода
Отправлено: ViTech от Сентябрь 28, 2020, 13:54
Есть же compilation database и jq. Выцепить файлы проекта задача тривиальная, нет?

Как один из вариантов получения списка файлов проекта, может быть и тривиальная. Но в compilation database разве не только *.cpp файлы перечислены? Можно её сгенерировать так, чтобы и *.h тоже там были?


Название: Re: Автоматическое форматирование кода
Отправлено: Авварон от Сентябрь 28, 2020, 13:58
да, о хедерах я не подумал=)


Название: Re: Автоматическое форматирование кода
Отправлено: ViTech от Сентябрь 28, 2020, 14:16
да, о хедерах я не подумал=)

Если проект собирается CMake'ом, то более подробную структуру проекта можно получить с помощью cmake-file-api (https://cmake.org/cmake/help/latest/manual/cmake-file-api.7.html), там и хидеры и исходники перечислены. Сгенерировать структуру проекта не сложно, но я бы не сказал, что просто и тривиально, одной командой не отделаешься. Проще будет каким-нибудь find'ом в папке проекта список файлов получить.

В самом креаторе явно есть средства, чтобы получить все файлы проекта и скопом их отформатировать. Но вот такую фичу для него, похоже, ещё никто не запилил.


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 30, 2020, 12:09
не едут лыжи.
вот фрагмент кода
Код:
void _put_pixel(tContext *pContext, int X, int Y, int sx, int sy, long Es,
                uint8_t color)
{
  if (color)
{
         ...
Что я хочу? Перед if один ТАБ, не пробелы, а ТАБ. На следующей строчке перед фигурной скобкой один ТАБ.
настроил шланг-формат, креатор, горячие клавиши. Убрал галку "автоформатирование при сохранении".
Нажимаю гор.клав. - получаю перед if два пробела, перед { один таб. Нажимаю "Сохранить" файл меняется и стновиться перед if 2 пробела, перед { четыре пробела. Wtf?
Кто разбирается в конфигурировании clang-format? Какую опцию и как настроить?

есть UseTab, указал
UseTab: ForIndentation получаю 2 пробела и 1 таб. а после сохраниния одни пробелы.
указал
UseTab: Always получаю  2 пробела и 1 таб. а после сохраниния одни пробелы.

1) как настроить clang-format на табы?
2) почему говнокреатор при сохранении меняет табы на пробелы?


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 30, 2020, 12:17
2-ой вопрос решил, в 2-х местах нужно править
Код:
Tools -> Options -> Text Editor -> Behaviour -> Tabs and Indentation    &    Tools -> Options -> C++ -> Code Styles -> Edit


Название: Re: Автоматическое форматирование кода
Отправлено: kuzulis от Сентябрь 30, 2020, 12:56
Цитировать
В самом креаторе явно есть средства, чтобы получить все файлы проекта и скопом их отформатировать. Но вот такую фичу для него, похоже, ещё никто не запилил.

Эмм.. а clang-format?

ЗЫ: Ах, ты хочешь прям сразу весть проект... Хм.. Ну да, вроде нету такого.

Тут как-бы не все так просто: а какие файлы из проекта должен форматтер форматировать? Т.к. кроме *.h / *.cpp (и их производных), есть и другие, например, какие-нить шаблоны, файлы ассемблера и прочее. Поэтому, наверное и не запилили это.


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 30, 2020, 13:13
а какие файлы из проекта должен форматтер форматировать? Т.к. кроме *.h / *.cpp
тут всё очень просто. мне нужно *.h, *.c, *.cpp.

1)
IndentWidth:     4
UseTab:          Always
TabWidth:        4

если IndentWidth:     2, то перед if будет два пробела, если 4, то будет 1 таб.


Название: Re: Автоматическое форматирование кода
Отправлено: kuzulis от Сентябрь 30, 2020, 13:15
Цитировать
мне нужно *.h, *.c, *.cpp.

а кому-то нужно еще что-то и он будет хныкать, что у него ничо не работает кроме *.h, *.c, *.cpp.  :)


Название: Re: Автоматическое форматирование кода
Отправлено: juvf от Сентябрь 30, 2020, 13:19
мля.... я что, нельзя указать что форматировать? будет время, напишу утилиту, которая переберёт в папке все файлы и найдет те, которые хочет пользователь и каждый файл отформатирует шлангом.

возможно всё уже украли ужа такая утилита есть...


Название: Re: Автоматическое форматирование кода
Отправлено: kuzulis от Сентябрь 30, 2020, 15:48
Во, можешь в QtC это запилить (типа добавить фичу форматирования всего проекта)


Название: Re: Автоматическое форматирование кода
Отправлено: AkonResumed от Октябрь 31, 2020, 10:11
А как для встроенного стиля (точнее, Qt-based и отредактированный с использованием табов, а не пробелов) добиться выравнивания не по открывающей скобке, а просто с регулярным отступом:
Код:
	
while (a ||
       b)

нужно:

while (a ||
    b)
Эта настройка находится на вкладке "Alignment" диалога редактирования стиля. Проблема в том, что при выставлении нужного отступа он не сохраняется.

QtCreator v4.12, но так было у меня всегда ... и в QtCreator v1.x.x.