Подтвердить что ты не робот

Можно ли форматировать код С++ с помощью VIM?

Я новичок в VIM. У меня есть исходный код, и это беспорядок. На первый взгляд я хотел бы получить хотя бы четкое и упорядоченное представление кода, поэтому мне нравится его правильно отформатировать, я имею в виду отступы в зависимости от глубины функций и так далее.

Интересно, может ли это быть сделано с VIM, и в противном случае другие инструменты командной строки для этого вы можете порекомендовать.

Спасибо

4b9b3361

Ответ 1

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

В случае отступов я фильтрую весь буфер файла через астиль. Астиальные параметры намного проще схватить за пару минут, особенно если вы не являетесь гуру vim. Кроме того, астиль обеспечивает гораздо большую гибкость при тонкой настройке выходного сигнала.

Сначала установите астиль:
# apt-get install astyle

Тогда внутри vim:
:%!astyle (простой случай - астайл по умолчанию - C/С++)
или
:%!astyle --mode=c --style=ansi -s2 (ansi С++ style, используйте два пробела на уровне отступа)
или
:1,40!astyle --mode=c --style=ansi (ansi С++ style, фильтровать только строки 1-40)

Ответ 2

вы можете сделать следующее:

gg=G

Ответ 3

Я бы очень рекомендовал clang-format в наши дни. Это позволяет просто интегрировать clang-format в Vim, как только у вас установлен формат clang:

http://clang.llvm.org/docs/ClangFormat.html#vim-integration

Это единственный корректор кода, который действительно понимает ваш код на С++, и действительно разумно украсить код больше как человек, чем машину. Например:.

void TestFunction(int argument1, int argument2,
                  int argument3);
void TestFunctionVeryLongName(int argument1,
                              int argument2,
                              int argument3);
void TestFunctionWithRidiculouslyLongName(
    int argument1, int argument2, int argument3);

Ответ 4

Vim обязательно это сделает, хотя результаты могут быть не идеальными:

  • Сначала выберите весь файл в визуальном режиме: ggVG
  • Затем нажмите = для повторного использования всего.

Вы можете узнать больше об равной команде с помощью: :help =

Ответ 5

Существует vim-плагин, который позволяет форматировать ваш код из vim. Он называется vim-autoformat, и вы можете скачать его здесь:

https://github.com/Chiel92/vim-autoformat

Он интегрирует внешние программы форматирования кода в vim. Например, если вы хотите форматировать код C, С++, С# или Java, вам необходимо установить программу astyle, а vim автоматически устанавливает ее как программу формата.

Ответ 6

Существует также плагин Vim, основанный на clang-format: vim-clang-format

Затем вы можете просто сопоставить команду форматирования с тем, что вам подходит.

Ответ 7

Я не пишу код на С++, но пишу код Java.

Вместо этого Vim поддерживает форматирование некоторых общих языков. Я настроил короткий отрезок для меня, чтобы отформатировать весь код в буфере. Он вернется к только что отредактированной строке:)

" format the file
map <leader>fm gg=G'. 

Ответ 8

Общее решение в соответствии с идеей m000 состоит в том, чтобы использовать UniversalIndentGUI в качестве внешнего инструмента.

Ответ 9

Просто нужно было решить эту точную проблему, поэтому я подумал, что буду способствовать спасению других.

Вы можете использовать gg=G для отступов кода. Но вам становится трудно понять, как вы хотите настроить, как происходит автоматическое отступы. Поэтому, если вам все равно, что удаленные пробелы удалены и на самом деле не заботятся о стиле форматирования, gg=G - это самый быстрый способ сделать это, потому что его встроенный.

Если вы хотите управлять стилем (например, вы пытаетесь сделать свой код соответствующим руководству по стилю), тогда вам понадобится внешний инструмент для обработки вашего файла. Вы можете вызвать этот инструмент из vim с помощью: :%!<toolname> <options>. Он обрабатывает файл через инструмент и повторно загружает обработанный результат. (Очевидно, вы можете использовать это для чего-либо еще, что вы хотите сделать для своего файла)

Итак, следующий вопрос: какой внешний инструмент вы должны выбрать? Независимо от того, метод один и тот же:

  • Установите подходящий инструмент
  • Убедитесь, что на вашем пути
  • Добавьте строку в ваш файл vimrc, который создает комбинацию клавиш, чтобы вы могли экономить время
  • Используйте его.

Теперь, какой инструмент вы используете, зависит от стиля, который вы пытаетесь реплицировать. Если вы пытаетесь воспроизвести широко используемый стиль, то шансы astyle - это все, что вам нужно.

Если вы пытаетесь воспроизвести пользовательский стиль, вам понадобятся две вещи:

  • UniversalIndentGui - интерфейс, который позволяет вам играть с различными опциями и просматривать предварительный просмотр их в исходном файле.
  • Набор инструментов форматирования исходного кода, установленных и на вашем пути

Между uncrustify и greatcode, вы должны полностью воспроизвести стиль, который вы хотите.

Собственно, я солгал. Существует другой способ и его называемый clang-format. Тем не менее, вы захотите прочитать документацию на нем и ее еще на ранних этапах, чтобы некоторые варианты не работали очень хорошо. Это прекрасный инструмент, хотя (определенно, самый умный из них, потому что он создает AST вашего кода), и он даже доступен для Windows.

Если вы потратите время на ознакомление с руководством, вы также захотите проверить Отступ GNU.

Конечно, есть последний способ, который на самом деле занимает время, чтобы узнать правила отступа vim и написать один для вашего стиля. Это займет время, но оно будет работать с gg=G.

Некоторые заметки об астиле против uncrustify vs greatcode:

  • Astyle хорош для общего форматирования, но не может делать такие вещи, как выравнивание декларации переменных и повторное создание комментариев.
  • Uncrustify может сделать много вещей, которые не могут астилы, но будьте готовы потратить час, пока вы не найдете правильную комбинацию параметров, которые вам нужны. (Или, если вам кажется, что тратить много времени, используйте генетические алгоритмы, чтобы выяснить, какая комбинация вариантов для вашего стиля и когда вы делитесь кодом и даете мне ссылку, чтобы я мог использовать ее:):)

Обратите внимание, что вам не нужно выбирать один инструмент. С помощью vim вы можете отобразить одно нажатие клавиши для выполнения нескольких команд подряд, поэтому теоретически вы можете использовать комбинацию этих инструментов, чтобы получить именно то, что вы ищете.

И последнее, но не менее важное: вот выдержка из моего файла .vimrc, где я отобразил F12, чтобы вызвать астиль с некоторыми параметрами:

"A2 = attached brackets
"-s8 indent 8 spaces
"-xc attached braces to class declarations
"-xj remove braces for single statement ifs and elses
"-c convert tabs to spaces in the non-indentation part of the line
map <F12> :%!astyle -A2 -s8 -xc -xj -c<CR>

Не судите меня по стилю. Просто используйте инструмент, чтобы воспроизвести то, что вы хотите.