Как складывать комментарии?

16

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

Также синтаксическое сворачивание комментариев работает только для комментариев в стиле C, например:

/*
 ...
 */

Но не для комментария, как:

//
//
// ...
//

Или даже для блоков комментариев в не-C-подобных языках, таких как:

#
#
# ...
#

Как я могу настроить это с vim?

maxschlepzig
источник
Вы хотите использовать синтаксис складывание и комментарий сворачивание? Или только комментарий сворачивается?
Мартин Турной
@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")') )

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

Обратите внимание, что вы также можете «установить foldtext» в зависимости от того, как вы хотите, чтобы результат выглядел.

tinmarino
источник
0

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

Текстовый объект комментария может быть расширением языка до набора стандартных текстовых объектов vim. Протестировал его с помощью синтаксиса Go.

AB
источник
1
Действительно, acне является встроенным. Но с комментариями tpope gcэто текстовый объект. Так что лучшие решения есть zfac, zfgcили zfipв худшем случае
Д. Бен Нобл