VIM - красивый формат столбца структур в C

У меня есть код C с большим количеством typedefed struct, и он выглядит так в VIM:

typedef struct {
  int         a;
  someValue*    b;
  someOtherValue* c;
} val_t;

Когда я включаю «печатать пробельные символы» в VIM через :set list, я вижу, что код выглядит так (с символами ., обозначающими пробелы, и -->, обозначающими жесткие вкладки):

typedef struct {
  int->-->-->-->a;
  someValue*....b;
  someOtherValue*>>c;
} val_t;

Таким образом, кажется, что этот код имеет смесь жестких вкладок и пробелов повсюду, вероятно, из-за того, что для его поддержки используются разные редакторы. Я пытаюсь написать несколько команд, чтобы привести его в порядок. Я знаю, что могу сделать визуальный выбор с помощью SHIFT+V, а затем передать выделение на col через:

:'<:'>!col

Однако вывод в VIM выглядит ужасно, так как кажется, что col просто разделяет столбцы «логически» (т. е. с помощью трех жестких вкладок), а не лексически, и вывод выглядит так:

typedef struct {
  int--->--->--->a;
  someValue*>--->--->b;
  someOtherValue*--->--->--->c;
} val_t;

Есть ли способ указать col выровнять столбцы данных с помощью жестких вкладок фиксированной ширины (т.е.: 4 «пробела» на вкладку), как показано ниже, чтобы начало имен переменных в структуре визуально выровнялось? Желаемый результат:

typedef struct {
  int--->--->--->--->a;
  someValue*>--->--->b;
  someOtherValue*--->c;
} val_t;

Это позволило бы мне реорганизовать кучу файлов заголовков на уровне блоков/структур, а не тратить часы вручную на отступы блоков кода, чтобы они выглядели красиво.

Спасибо.


person Cloud    schedule 20.07.2015    source источник
comment
Я думаю, что типизированный код может быть довольно свободным при форматировании. Что мешает ему найти/воздействовать на что-то вроде "\t someValue \t* \tname\n\n\t ;"? Это достаточно умно?   -  person    schedule 20.07.2015
comment
Я мог бы просто поменять местами вкладки с пробелами через s/\t/ /g, а затем заменить последовательные разделители одним через s/\t\{1,\}/\t/g. Это означает, что я знаю, что просто ищу два поля, разделенные одной вкладкой.   -  person Cloud    schedule 20.07.2015


Ответы (1)


Вы застряли на жестких вкладках? Если нет, вы можете изучить таблицу или vim-easy-align.

С табличным вы можете сделать что-то вроде этого:

:?{?+,/}/-Tabularize/\ze\w\+;/

Для получения дополнительной помощи см.:

:h \ze
:h range
person Peter Rincker    schedule 20.07.2015
comment
Я застрял с использованием жестких вкладок, поэтому он правильно отображается в других редакторах. - person Cloud; 21.07.2015
comment
Это точная причина использования пробелов. Измените 'tabstop' на 4 (например, set ts=4), а затем 8 в вашем примере. Это изменится, если они выровняются или нет. Использование табуляции для отступа подойдет, но для выравнивания могут возникнуть проблемы. Использование пробелов полностью решает эту проблему. - person Peter Rincker; 21.07.2015
comment
Я согласен с вашим утверждением, но в настоящее время я вынужден использовать настройку, в которой используются жесткие вкладки шириной 4 пробела, как и все другие люди, работающие над одним и тем же проектом. - person Cloud; 21.07.2015
comment
Приведенный выше ответ работает и, вероятно, лучше, чем функция сценария оболочки, которую я написал для достижения той же функциональности, поэтому помечаю ее как принятую. Спасибо! - person Cloud; 01.08.2015