2010-08-13 3 views
20

В нашей базе кода на C++ мы сохраняем 99 строк столбцов, но многострочные комментарии 79-нечетных столбцов. Есть ли хорошая стратегия, чтобы сделать это автоматически? Я предполагаю, что режимы уже известны из-за умных комментариев, соединяющих строки и ведущих * вставки.Vim разная ширина текста для многострочных комментариев C?

+0

Вы можете установить пользовательские 'formatexpr' или' formatprg', однако для этого потребуется написать vim-плагин или внешнюю программу форматирования, см. Справку для получения дополнительной информации. Я не знаю плагинов, которые сделают это для вас, но я не уверен, что их не существует. – ZyX

+0

Не могли бы вы либо отправить образец кода или предоставить ссылку на какой-то код, который вы хотите отформатировать? Никаких обещаний, но я мог бы написать простую программу форматирования. –

+0

@molecules: Я не ищу программу форматирования, просто то, что автоматически знает, что моя текстовая ширина - 79 вместо обычного 99, когда я печатаю в многострочном комментарии. – cdleary

ответ

15

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

:autocmd CursorMoved,CursorMovedI * :if match(getline(.), '^\s*\*') == 0 | :setlocal textwidth=79 | :else | :setlocal textwidth=99 | :endif 

Здесь критическая часть обнаружения, когда мы находимся в комментарии. Если вы только форматировать комментарии так:

/* 
* my comment 
*/ 

мое регулярное выражение должно работать ... если у вас есть строки в коде, начиная с * (который я думаю, может произойти в C, реже в C++). Если вы используете такие комментарии, как:

// comment line 1 
// comment line 2 

regex еще проще написать. Если вы хотите охватить все возможные ситуации, в том числе угловые, хорошо ... Я думаю, лучше всего было бы определить отдельную функцию обнаружения и вызвать ее из :autocmd вместо match().

+0

+1, я бы опубликовал подобное предложение, но оно было бы идентично этому. – progo

+0

Какое влияние это оказывает на производительность? Если я нахожусь на сервере SSHed, возможно, это заметно увеличит мою задержку? –

+0

Это не будет @ Kazark, вся логика выполняется внутри Vim (то есть на стороне сервера). Сказав это, это повлияет на производительность так же, как это было затронуто, если вы использовали его локально (то есть не через SSH) –

1

Я столкнулся с этой проблемой и считаю, что нашел подходящее решение.

То, что я хотел, чтобы мои комментарии переносились словами, чтобы при вводе текста мне не пришлось беспокоиться о формировании текста. Это хорошо работает с текстом комментария. Но мне было неудобно иметь формат VIM моего кода. Поэтому я хотел, чтобы vim выделял каждую вещь в красном столбце x.

Чтобы сделать это с помощью только кода cpp, вы должны добавить следующее в свой файл ~/.vim/ftdetect/cpp.vim.

set textwidth=79 
match ErrorMsg '\%>99v.\+' 

Примечание: вам может потребоваться создать файл и папки, если они не существуют.

Если у вас есть проблемы с этим убедитесь, что у вас есть FormatOptions значение:

formatoptions=croql 

Вы можете увидеть это, запустив: набор FormatOptions внутри Vim.

+0

Извините, но нет - это то же самое решение, которое я получил по этому вопросу, который я спросил: http://stackoverflow.com/questions/235439/ Выделение мусора по всему месту намного менее изящно, чем я надеюсь! – cdleary