Yorumlar nasıl katlanır?


16

Sözdizimi foldmethodharika, ancak bazen yorumları bir kaynak dosyada katlamak istiyorum.

Ayrıca yorumların sözdizimi katlanması sadece aşağıdaki C-stili yorumlarda işe yarar:

/*
 ...
 */

Ama açıklama için değil gibi demirbaş:

//
//
// ...
//

Veya C gibi olmayan dillerde yorum blokları için bile:

#
#
# ...
#

Bunu vim ile nasıl yapılandırabilirim?


Sözdizimi katlama ve yorum katlama kullanmak istiyor musunuz ? Yoksa sadece yorum katlama?
Martin Tournoij

@Carpetsmoker, sözdizimi katlama + yorum katlama, 'yorumlar hariç tüm kıvrımları aç' diyebilirse tamam olurdu. Aksi takdirde, sözdizimi katlaması olmadan yorum katlama da iyi olur.
maxschlepzig

Yanıtlar:


14

Sadece yorumları katlamak oldukça kolaydır foldmethod=expr:

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

Bu, satırın herhangi bir miktarda boşluk + yorum karakteri ile başlayıp başlamadığını kontrol edecektir. Bunun oldukça naif olduğunu ve tüm dillerde çalışmayabileceğini unutmayın. Bu nedenle, daha spesifik olmak için bir autocmd kullanmak isteyebilirsiniz:

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

Kapak ifadesi hakkında daha fazla bilgi için, bkz:


Sözdizimi katlama ve yorum katlama kullanmak daha karmaşıktır; bu sözdizimi dosyasının değiştirilmesini gerektirir /usr/share/vim/vim74/syntax/*.vimve kullandığınız dile özgüdür.

Bazı dosya türlerinin bunu zaten yaptığını unutmayın ! Örneğin 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

Girinti ile katlama gibi ama kat yorumları dahil (her yorum önceki satır ile aynı düzeyde kat olsun demek).

Ne yazık ki, foldignore anahtar kelimesi yalnızca bir satır yorum için çalışır. Ben vimrc ifade ile katlayın:

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

Son blok:

indent(a:lnum)/&shiftwidth

Girintide bir kat düzeyli taban döndürür.

Ve diğeri :

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

Satırın ilk karakterinin sözdizimiyle bir yorum olarak değerlendirilip değerlendirilmeyeceğini denetler. Bu nedenle, girintiyi ve sözdizimi katlamayı en gelişmiş katlama olan ifade ile birleştirmenin iyi bir yoludur.

Sonucun nasıl görünmesini istediğinize bağlı olarak "katlama metnini de ayarlayabileceğinizi" unutmayın.


0

Yorumlu bloğu ile görsel olarak seçebilir vacve ardından manuel bir katlama oluşturabilirsiniz zf.

Yorum metni nesnesi, standart vim metin nesneleri kümesinin dil uzantısı olabilir. Go sözdizimi ile test edildi.


1
Gerçekten de acbir yerleşik değildir. Ama tpope'in yorumu gcile bir metin nesnesi var. Yani daha iyi çözümleridir zfac, zfgcya zfipen kötü
D. Ben Knoble
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.