Jak składać komentarze?

16

Składnia foldmethodjest świetna, ale czasami po prostu chcę złożyć komentarze w pliku źródłowym.

Również składanie komentarzy w składni działa tylko w przypadku komentarzy typu C, takich jak:

/*
 ...
 */

Ale nie dla komentarza:

//
//
// ...
//

Lub nawet dla bloków komentarzy w językach innych niż C, takich jak:

#
#
# ...
#

Jak mogę to skonfigurować za pomocą vima?

maxschlepzig
źródło
Czy chcesz używać zwijania składni i zwijania komentarzy? Czy tylko składanie komentarzy?
Martin Tournoij,
@Carpetsmoker, składanie składni + składanie komentarzy byłoby w porządku, gdyby można powiedzieć „otwórz wszystkie fałdy, z wyjątkiem komentarzy”. W przeciwnym razie dobrze byłoby również składać komentarze bez składania składni.
maxschlepzig

Odpowiedzi:

14

Składanie tylko komentarzy jest dość łatwe przy użyciu foldmethod=expr:

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

Spowoduje to po prostu sprawdzenie, czy linia zaczyna się od dowolnej ilości białych znaków + znaku komentarza. Pamiętaj, że jest to dość naiwne i może nie działać we wszystkich językach. Możesz więc użyć autocmd, aby być bardziej szczegółowym:

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

Aby uzyskać więcej informacji o fold-expr, zobacz:


Korzystanie ze składania składni i składania komentarzy jest bardziej zaangażowane; wymagałoby to modyfikacji pliku składni /usr/share/vim/vim74/syntax/*.vimi będzie specyficzne dla używanego języka.

Pamiętaj, że niektóre typy plików już to robią! Na przykład z 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
Martin Tournoij
źródło
2

Lubię składać z wcięciem, ale włączanie komentarzy w fold (oznacza to, że każdy komentarz ma taki sam poziom foldowania jak poprzednia linia).

Niestety słowo kluczowe foldignore działa tylko w przypadku komentarzy w jednym wierszu. Więc składam z expr w 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

Ostatni blok:

indent(a:lnum)/&shiftwidth

Zwraca składaną podstawę na wcięcie.

I kolejny :

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

Sprawdza, czy pierwszy znak linii jest uważany za komentarz ze składnią. Jest to więc dobry sposób na połączenie wcięcia i składania składni z ekspresją, najbardziej zaawansowanego składania.

Pamiętaj, że możesz także „ustawić tekst rozkładany” w zależności od tego, jak chcesz, aby wyglądał wynik.

tinmarino
źródło
0

Możesz wizualnie wybrać komentowany blok za pomocą, vaca następnie utworzyć ręczne składanie zf.

Obiekt tekstu komentarza może być rozszerzeniem języka dla zestawu standardowych obiektów tekstu vim. Przetestowałem to ze składnią Go.

AB
źródło
1
Rzeczywiście, acnie jest wbudowany. Ale z komentarzem tpope'a gcjest obiekt tekstowy. Tak więc lepszymi rozwiązaniami są zfac, zfgclub zfipw najgorszym wypadku
D. Ben Knoble,