Я придумал что-то вроде этого:
/\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