Использование AStyle в Vim

Я пытаюсь заставить AStyle работать с Vim, чтобы я мог использовать ключ "=" для повторного ввода различных разделов кода. Например, я бы хотел, чтобы мой обычный =iB набирал текущий блок кода, используя AStyle, а не встроенный индентор.

Я попробовал просто установить equalprg = astyle в моем vimrc, но проблема в том, что астиль получает только выделенный блок, но думает, что он получает целый файл. Поэтому отступ полностью отключается, когда я пытаюсь только отступать от вложенного класса.

Я знаю, что я всегда могу переформатировать весь файл сразу, но есть способ использовать астиль в vim, который полностью реплицирует исходное поведение форматирования vim (все мои команды = -movement работают) и бонусные баллы для autoindent с использованием астиля!)?

Ответ 1

Если не существует версии AStyle с параметром частичного форматирования файлов, вам необходимо применить дополнительный отступ после запуска AStyle.

Я не уверен, как вы можете сделать это с помощью движений.

С визуальным выбором вы можете захватить отступ в первой строке, передать код равнымprg и затем добавить этот отступ ко всем строкам:

vnoremap = <Esc>`<dwgv=`<<C-v>`>I<C-r>"<Esc>

Разрушение:

vnoremap -- so we can use = for equalprg
<Esc>`< -- stop selecting and go to beginning of line at beginning of selection
dw -- grab the initial indentation
gv= -- reselect and indent as normal
`<<C-v>`> -- block select the selection
I<C-r>"<Esc> -- insert the initial indentation

Может быть, вы можете сделать что-то подобное с движениями?

Ответ 2

Он работает только для форматировщиков, у которых есть опция форматирования частичного файла, как уже указывал idbrii. Пример форматирования, который делает это clang-format.

Один из способов интегрировать это в vim - это vim-autoformat. Используя этот плагин, вы можете viB, а затем нажмите клавишу самоопределения формата, например <F3>. Затем будет отформатирован только выделенный внутренний блок кода.