LINUX.ORG.RU

Убрать пробелы между идентификаторами

 , ,


0

1

Пользуюсь Astyle для форматирования кода и он работает великолепно, за исключением одной вещи:

struct      sched_param   params;
Как сделать так, чтобы пробелы убрались и стало:
struct sched_param params;
Для этого вероятно существует некоторая опция, которую я не увидел во время чтения интернетов и манов

Аналогично перед началом комментария тоже может быть так:

int test;          // куча пробелов перед комментом, бесит

Можно конечно сделать замену всех двойных пробелов на одинарные и так 15 раз пока не полегчает в любом редакторе, к сожалению оно залезет в строковые константы, чего не хотелось бы

Тут говорят, что если бы у Astyle была опция --unpad-oper, то в паре с --pad-oper они бы решили твою проблему. Вот только насчёт их воздействия на struct/classes есть сомнение.

blexey ★★★★★ ()
Последнее исправление: blexey (всего исправлений: 1)
Ответ на: комментарий от blexey

Спасибо, это попробую. А про комментарии тоже большой вопрос. Странно что такие форматтеры не учитывают подобный кейс, ведь он сплошь и рядом

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

Развлечения ради набросал решение на регулярках vis:

  1. :y/^\s+/ x/[\ \t]+/ c/ / – заменить все последовательности пробелов/табов, не начинающиеся с начала строки, одиночными пробелами.
  2. :x/[[(<]\s/ x/\s/ d – удалить пробелы после открывающихся скобок.
  3. :x/\s[])>]/ x/\s/ d – удалить пробелы перед закрывающимися скобками.
  4. :x/\s+;/ x/\s+/ d – удалить пробелы перед ;.

Было:

#include <iostream> // Хорошо
#include       <cmath>        //       Плохо

auto     foo      (int x    )          -> int {
    return x;
}

template < typename T    >
T bar(    T    x)      {
    return x;
} 

struct Struct { 
    int a; 
        double             b                ; } 

int main(                    ) {
    int      x    = bar (   1 );
    return                     foo (   41 ) +      x  ;
}

Стало:

#include <iostream> // Хорошо
#include <cmath> // Плохо

auto foo (int x) -> int {
    return x;
} 

template <typename T>
T bar(T x) {
    return x;
} 

struct Struct {
    int a;
        double b; }

int main() {
    struct Struct s
    int x = bar (1);
    return foo (41) + x;
}

По идее, пункты 2 и 3 должно быть можно объединить, но мне лень, да и так проще и понятнее. Еще выравнивание индентации можно было бы накостылять, но мне тоже лень. Попробую сейчас переписать на sed.

Siborgium ()
Последнее исправление: Siborgium (всего исправлений: 2)
Ответ на: комментарий от Siborgium

Ура! Спасибо! И я так понимаю это не повлияет на строки в двойных кавычках? Решение на sed будет полезно многим

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

Но проблема во множестве строк, внутри которых чистить нельзя

У меня есть мысль, как и советовал анонизмус, это накатать простой Python скрипт и он будет уничтожать все двойные пробелы и табы до тех пор пока не будут убраны вообще все за исключением строк в двойных кавычках и одинарных кавычках, а потом просто рестайлером прочесать поверх результата

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft
ftp://ftp.gnu.org/gnu/indent/indent-2.2.12.tar.xz          Утилита для форматирования исходного кода на C и C++  

https://github.com/dck/SourceAnalyzer                      SourceAnalyzer is a free open-source set of tools to analyze source code. http://sourceanalyzer.org

https://github.com/agudulin/pyparser                       Python parser for SourceAnalyzer http://habrahabr.ru/post/141756/

Владимир

anonymous ()
Ответ на: комментарий от I-Love-Microsoft

Нет, ерунда получается, ничего достаточно хорошего не вышло, а портянка уже в два раза длиннее.

И в sed, и в awk такое сделать затруднительно. Как минимум, потому что они line-oriented, и разбирают текст по строкам, при этом крайне сложно описать такое простое действие как «оперируй только над тем, что удовлетворяет предыдущей регулярке». Как корректно обрабатывать строки – ума не приложу. В vis проблема строк решилась бы простой вставкой y/".*"/ в начало каждой команды.

В любом случае, костылям нужно предпочесть тот же clang-format, или любой другой предложенный вариант.

Siborgium ()
Последнее исправление: Siborgium (всего исправлений: 1)