टिप्पणियों को कैसे मोड़ें?


16

वाक्यविन्यास foldmethodमहान है, लेकिन कभी-कभी मैं केवल स्रोत फ़ाइल में टिप्पणियों को मोड़ना चाहता हूं।

इसके अलावा टिप्पणियों का सिंटैक्स तह केवल सी-स्टाइल टिप्पणियों के लिए काम करता है जैसे:

/*
 ...
 */

लेकिन टिप्पणी बॉयलरप्लेट के लिए नहीं जैसे:

//
//
// ...
//

या यहां तक ​​कि गैर-सी जैसी भाषाओं में टिप्पणी ब्लॉक के लिए:

#
#
# ...
#

मैं इसे विम के साथ कैसे कॉन्फ़िगर कर सकता हूं?


क्या आप सिंटेक्स फोल्डिंग और कमेंट फोल्डिंग का उपयोग करना चाहते हैं ? या केवल तह टिप्पणी करें?
मार्टिन टूरनोइज

@ कार्पेट्समोकर, वाक्यविन्यास तह + टिप्पणी तह ठीक होगा यदि कोई कह सकता है कि 'सभी परतों को खोलें, टिप्पणियों को छोड़कर'। अन्यथा, सिंटैक्स तह के बिना टिप्पणी तह भी ठीक होगी।
मैक्सक्लेपजिग

जवाबों:


14

केवल टिप्पणियों का उपयोग करके तह करना काफी आसान है foldmethod=expr:

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

यह केवल यह जांच करेगा कि क्या लाइन व्हॉट्सएप के किसी भी राशि से शुरू होती है + एक टिप्पणी चरित्र। ध्यान दें कि यह काफी भोली है, और सभी भाषाओं के लिए काम नहीं कर सकती है। तो आप अधिक विशिष्ट होने के लिए ऑटोकैड का उपयोग करना चाह सकते हैं:

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

गुना-विस्तार के बारे में अधिक जानकारी के लिए, देखें:


सिंटैक्स फोल्डिंग और कमेंट फोल्डिंग का उपयोग करना अधिक शामिल है; इसके लिए सिंटैक्स फ़ाइल को संशोधित करना होगा /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 कीवर्ड सिर्फ एक लाइन टिप्पणियों के लिए काम करता है। इसलिए मैं vimrc में expr के साथ गुना:

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

टिप्पणी पाठ वस्तु मानक विम पाठ वस्तुओं के सेट के लिए भाषा विस्तार हो सकता है। गो सिंटैक्स के साथ इसका परीक्षण किया।


1
वास्तव में, acएक निर्मित नहीं है। लेकिन tpope की टिप्पणी के साथ gcएक पाठ वस्तु है। तो बेहतर समाधान हैं zfac, zfgcया zfipसबसे खराब
डी। बेन नोबल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.