Як скласти коментарі?


16

Синтаксис foldmethodчудовий, але іноді просто хочеться скласти коментарі у вихідний файл.

Крім того, складання синтаксису коментарів працює лише для коментарів C-Style, таких як:

/*
 ...
 */

Але не для коментування шаблону типу:

//
//
// ...
//

Або навіть для блоків коментарів мовами, які не схожі на C, як-от:

#
#
# ...
#

Як я можу налаштувати це за допомогою vim?


Ви хочете використовувати складання синтаксису та складання коментарів? Або лише складання коментарів?
Мартін Турноїй

@Carpetsmoker, складання синтаксису + складання коментарів було б нормальним, якби можна сказати "відкрити всі складки, крім коментарів". Інакше складання коментарів без складання синтаксису також буде добре.
maxschlepzig

Відповіді:


14

Складати лише коментарі досить легко, використовуючи foldmethod=expr:

set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*'.&commentstring[0]

Це буде просто перевірити, чи починається рядок з будь-якої кількості пробілів + символу коментаря. Зауважте, що це досить наївно, і може працювати не для всіх мов. Тому ви можете використовувати autocmd, щоб бути більш конкретними:

autocmd FileType c setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*//'
autocmd FileType python setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'

Для отримання додаткової інформації про fold-expr див.


Використання складання синтаксису та складання коментарів більше задіяне; для цього знадобиться змінити файл синтаксису /usr/share/vim/vim74/syntax/*.vimі буде специфічно для мови, якою ви користуєтесь.

Зауважте, що деякі файли вже роблять це! Наприклад з ruby.vim:

if !exists("ruby_no_comment_fold")
  syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyC
  syn region rubyDocumentation    start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
else
  syn region rubyDocumentation    start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
endif

2

Мені подобається складання з відступом, але включаючи коментарі в складці (я маю на увазі кожен коментар отримати той же рівень складки, що і попередній рядок).

На жаль, ключове слово foldignore просто працює для коментарів у одному рядку. Тому я складаю з expr у vimrc:

set foldmethod=expr
set foldexpr=FoldMethod(v:lnum)

function! FoldMethod(lnum)
  "get string of current line
  let crLine=getline(a:lnum)

  " check if empty line 
  if empty(crLine) "Empty line or end comment 
    return -1 " so same indent level as line before 
  endif 

  " check if comment 
  let a:data=join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
  if a:data =~ ".*omment.*"
    return '='
  endif

  "Otherwise return foldlevel equal to indent /shiftwidth (like if
  "foldmethod=indent)
  else  "return indent base fold
    return indent(a:lnum)/&shiftwidth
endfunction

Останній блок:

indent(a:lnum)/&shiftwidth

Повертає відступ основи на відступ.

А інший:

join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )

Перевіряє, чи вважається перший символ рядка коментарем із синтаксисом. Тож це хороший спосіб злиття відступів та складання синтаксису з виразом, найдосконалішим складанням.

Зауважте, що ви також можете "встановити складний текст" залежно від того, як ви хочете виглядати результат.


0

Ви можете візуально вибрати коментований блок за допомогою, vacа потім створити ручну складку zf.

Текстовим об'єктом коментаря може бути розширення мови до набору стандартних текстових об'єктів vim. Випробували його за допомогою синтаксису Go.


1
Дійсно, acце не вбудований. Але з коментарем tpope gc- це текстовий об’єкт. Тож кращі рішення є zfac, zfgcабо, zfipв гіршому випадку,
Д. Бен Нобл,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.