Как выровнять код с левым и правым отступом в VIM - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть этот код:

struct
  {
     uint32_t                rsvd0           :  8;
     uint32_t                tag             :  8;       
     uint32_t                status_qualifer : 16;
  } dw0;

Я хочу отформатировать его следующим образом:

struct
  {
     uint32_t                rsvd0 :  8;
     uint32_t                  tag :  8;
     uint32_t      status_qualifer : 16;
  } dw0;

Как мне это сделать в vim.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я придумал что-то вроде этого:

/\v\s{10}(<\w+>)(\s{2,})?\ze :
:%s//\2\1

ПРИМЕЧАНИЕ: я использую очень волшебный поиск \v, чтобы упростить поиск

В подстановочной части мы используем regex groups (), поэтому мы игнорируем 10 пробелов перед вторым словом \s{10}. Вы можете изменить количество пробелов, от которых хотите избавиться. Затем мы создаем группу, которая соответствует второму слову (<\w+>). После этого два пробела или более (необязательно) \s{2,})?. Затем мы завершим матч, используя классную vim \ze, пробел и двоеточие.

Команда использует последний поиск //, который заменяется группой 2, за которой следует группа 1.

Мой окончательный результат был:

struct
  {
     uint32_t                rsvd0 :  8;
     uint32_t                  tag :  8;
     uint32_t      status_qualifer : 16;
  } dw0;

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

:g/_t/normal wel10x
:g/  :/normal wwelldt:bP

ПРИМЕЧАНИЕ: вы можете выбрать строки выше и запустить: :@+. Я протестировал эти команды, и то же самое относится к первому решению.

первая глобальная команда выполняет обычную команду в строках, соответствующих _t команда:

we ....................... jump to the first word and to the end of it
l ........................ move one position to the right
10x ...................... erases 10 chars

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

ww ....................... jump to the second word
e ........................ jump to the end of the word
ll ....................... move the cursor twice to the right
dt: ...................... delete until before :
bP ....................... move to the word before and pastes the default register

Для получения дополнительной информации:

:h \ze
:h magic
:h regex
:h normal
:h global
0 голосов
/ 18 сентября 2018

Для выравнивания есть три известных плагина:

Ваш вопрос - отличный кандидат для оценки каждого плагина. Проверьте их страницы документации, попробуйте тот, который выглядит наиболее перспективным и понятным для вас. (В идеале сообщите здесь, с комментарием, который вы выбрали.)

...