Есть ли способ автоматически переформатировать скобки с помощью Vim? - PullRequest
4 голосов
/ 16 декабря 2010

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

if (cond) {
  foo;
}

в

if (cond)
{
  foo;
} 

Поскольку это код C, я смотрю на cindent / cinoptions для использования с =, но, похоже, он не имеет отношения к многострочным правилам.

Я искал formatoptions для использования с gq, и это также не представляется возможным.

Так возможно ли использовать параметры Vim по умолчанию или мне следует использовать определенный плагин или функцию?

Ответы [ 4 ]

5 голосов
/ 16 декабря 2010
:%s/^\(\s*\).*\zs{\s*$/\r\1{/

Разбивка:

^\(\s*\) = захватить пробел в начале строки

.* = все остальное

\zs = начать замену после этого

{ = открытая фигурная скобка

\s*$ = завершающий пробел до конца строки

\r\1{ = перевод строки, захваченный пробел, скобка

5 голосов
/ 16 декабря 2010

Я не знаю, полностью ли это решает вашу проблему, но если это однократная операция, вы можете попробовать регулярные выражения:

:%s/^\(\s*\)\(.*)\)\s*{\s*$/\1\2^M\1{/

Обратите внимание, что ^M - это управляющий символ, который обычно генерируется (в зависимости от вашего терминала) нажатием CTRL-V , за которым следует ENTER .

EDIT : Как указано в комментариях Джея и Zyx, \r - лучший способ вставить разрыв строки в замененную строку. Я не знал об этом, большое спасибо за подсказку.

4 голосов
/ 16 декабря 2010

Если вы установите Художественный стиль , вы можете сделать что-то вроде:

:set formatprg=astyle\ -b

Затем используйте gq, чтобы переформатировать куски кода. подчеркнутотекст

Если вы хотите, чтобы это было включено каждый раз, когда вы редактируете файл C, вы можете добавить следующее к вашему .vimrc файлу.

autocmd BufNewFile,BufRead *.c set formatprg=astyle\ -b
1 голос
/ 16 декабря 2010

Я не знаю, можете ли вы сделать это внутри самого vim, но вы можете попробовать команду BSD indent с опцией -bl. С помощью курсора на первом { вы можете набрать ! % indent -bl Введите .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...