दृश्य मोड में चयनित लाइनों का एक सेट कैसे टिप्पणी करें?


35

मैं दृश्य मोड चयनित लाइनों में एकाधिक कैसे टिप्पणी करूं? मैं इसे भाषा विशेष कैसे बनाऊं?

उदाहरण के लिए, यदि पहली 4 पंक्तियों को चुना गया है:

def foo(a,b):
    for each in (a,b):
        print each
    return a+b
print "2"

कमांड / मैक्रो के संचालन में परिणाम होना चाहिए (अजगर में):

#def foo(a,b):
#    for each in (a,b):
#        print each
#    return a+b
print "2"

जवाबों:


31

यदि आप भाषा विशिष्ट टिप्पणी चाहते हैं तो आपको nerdcommenter जैसे प्लगइन की आवश्यकता होगी ।

वैकल्पिक रूप से, हालांकि यह आपके वास्तविक प्रश्न का उत्तर नहीं देता है, आप बिल्ट वीम क्रियाओं और प्रत्येक भाषा के टिप्पणी पात्रों के अपने ज्ञान का उपयोग कर सकते हैं ...

विकल्प # 1: वी-ब्लॉक

  1. :1 Enter (पंक्ति 1 पर जाएं)
  2. Ctrl-वी (वी-ब्लॉक मोड)
  3. jjj (नीचे 3 और लाइनें)
  4. Shift-I (ब्लॉक से पहले इन्सर्ट मोड डालें)
  5. # ('#' डालें)
  6. Esc (सामान्य मोड पर वापस)

विकल्प # 2: प्रतिस्थापन

:1,4s/^/#/

टूट - फूट:

  1. : पूर्व कमान इस प्रकार है
  2. 1,4 4 के माध्यम से 1 से लाइनों पर
  3. s विकल्प
  4. /प्रतिस्थापन कमांड के टुकड़ों के लिए विभाजक।
    (आप एक अलग चरित्र का भी उपयोग कर सकते हैं, उदाहरण के लिए :)
  5. ^ लाइन की शुरुआत
  6. / विभाजक
  7. # अजगर के लिए टिप्पणी चरित्र
  8. / अंतिम विभाजक

विकल्प # 3: किसी मैक्रो ( स्रोत ) का दोहराव

  1. :1 Enter (पंक्ति 1 पर जाएं)
  2. qa(रजिस्टर पर रिकॉर्डिंग शुरू करें a)
  3. Shift-I (लाइन के आरंभ में इंसर्ट डालें)
  4. # (पंक्ति की शुरुआत में '#' जोड़ें)
  5. Esc (सामान्य मोड पर वापस)
  6. q (रिकॉर्डिंग बंद करें)

  7. :2,4 normal @a( a2 और 4 के बीच लाइनों पर रजिस्टर करने के लिए रिकॉर्ड किए गए मैक्रो को फिर से चलाएँ )

    या

    आप दृश्य मोड में लाइनों का चयन कर सकते हैं और :स्वचालित रूप से एक्स लाइन के साथ पॉप्युलेट करने के लिए हिट कर सकते हैं :'<,'>(दृश्य चयन के शुरू से अंत तक एक सीमा) फिर टाइप करें normal @aऔर हिट Enter( स्रोत )।

अब, जब भी आप कुछ लाइनों पर टिप्पणी करना चाहते हैं, तो aउन लाइनों पर रजिस्टर करने के लिए रिकॉर्ड किए गए मैक्रो को फिर से चलाएं :

:9,22 normal @a (comment out lines 9-22)

1
विकल्प 4: प्लगिन
कोडी पोल

मुझे समझ नहीं आता कि आप एकल कमांड के लिए मैक्रो का उपयोग क्यों करते हैं, जब आप :9,22 normal I#मेरे उत्तर के अनुसार कर सकते हैं ।
बेन

आप उपयोग क्यों करेंगे: 1 <दर्ज करें> जब आप जीजी का उपयोग कर सकते हैं?
तनत

@ तनाथ पहली पंक्ति से टिप्पणी करना इस उदाहरण के लिए विशिष्ट था। यदि लेखक 9 से 22 की पंक्तियों में टिप्पणी करना चाहता है तो वे gg का उपयोग नहीं कर पाएंगे।
bsmith89

@ normalइस उत्तर को लिखने से पहले मुझे कमांड के बारे में कुछ भी पता नहीं था । आप सही हे; :9,22 normal I#साथ ही काम करेगा।
22

26

विज़ुअल ब्लॉक मोड ( CtrlV) का उपयोग करके , लाइनों की शुरुआत का चयन करें। फिर उन लाइनों में से प्रत्येक पर हैश चरित्र डालने के लिए I#(यह एक बड़ा अक्षर है I) मारा । फिर Escइन्सर्ट मोड से नॉर्मल मोड पर लौटने के लिए दबाएँ ।


यह मेरे लिए काम नहीं करता है। यह केवल पहली पंक्ति में एक टिप्पणी सम्मिलित करता है।
gon1332

क्या आप धक्का दे रहे हैं ctrl? क्योंकि ctrl+vबस एक अलग बात है v
कोडी पोल

@ कोडीपोल मुझे पता है। सब कुछ ठीक है I। जब मैं दबाऊंगा I, तो #वसीयत केवल पहली पंक्ति के सामने रखी जाएगी।
gon1332

@ कोडीपोल ओके .. मैं सिर्फ इनफैंटिव था। मैंने Escवर्णित प्रक्रिया के बाद प्रेस नहीं किया।
22

@ gon1332 जहां तक ​​मैं जानता हूं कि आपको Escअंत में प्रेस करने की जरूरत है ।
गोनकेलो रिबेरो

18

यदि आप अभी जिस भाषा में हैं, उसके लिए एक त्वरित समाधान की आवश्यकता है, और आपके पास पहले से ही दृश्य मोड में चयनित पाठ है, तो

:norm 0i#

काम करता है। (प्रत्येक पंक्ति के लिए, सामान्य मोड में, पहले कॉलम पर जाएं और सम्मिलित करें #:norm I#पहले गैर-व्हाट्सएप वर्ण से पहले इसे सम्मिलित करना होगा, जो कि आप जो चाहते हैं वह नहीं हो सकता है।) का उपयोग :norm i#करना भी काम करेगा, क्योंकि :normशुरुआत में शुरुआत होती है। लाइन, लेकिन यह कम स्पष्ट और कम स्पष्ट है यदि आप यह नहीं जानते हैं।

बेशक, यदि आप अक्सर ऐसा करने का इरादा रखते हैं, तो आप एक मानचित्रण स्थापित करना चाहते हैं या एक प्लगइन की तलाश करेंगे।


1
डिफ़ॉल्ट रूप से 0 की आवश्यकता नहीं है, normalकमांड लाइन की शुरुआत में कर्सर के साथ निष्पादित की जाती है।
निशिच

1
कोर्स, लाइन नंबर,%, अंकों को इस कमांड के साथ उपसर्ग किया जा सकता है। उदाहरण:: 1,5norm i # (या): 'a,' bnorm i # (या): 10% आदर्श i #
SibiCoder

9

इसे स्वचालित रूप से करने से आपको अपनी vimrcफ़ाइल ( स्रोत ) में निम्न जैसा कुछ जोड़ना होगा :

au FileType haskell,vhdl,ada let b:comment_leader = '-- '
au FileType vim let b:comment_leader = '" '
au FileType c,cpp,java let b:comment_leader = '// '
au FileType sh,make let b:comment_leader = '# '
au FileType tex let b:comment_leader = '% '
noremap <silent> ,c :<C-B>sil <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:noh<CR>
noremap <silent> ,u :<C-B>sil <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:noh<CR>

,cकिसी क्षेत्र पर टिप्पणी करने और किसी क्षेत्र ,uको असहज करने के लिए उपयोग करना । यह अलग-अलग भाषाओं के लिए टिप्पणी प्रतीकों को मैन्युअल रूप से सेट करता है।

दूसरा विकल्प एक प्लगइन का उपयोग करना है जैसे कि tcomment , vim-commentary या comments.vim । मैं ख़ुद ही tcomment का इस्तेमाल करता हूं। कृपया, उनके पृष्ठों पर उपयोग और स्थापना के निर्देशों को पढ़ें, क्योंकि मैं प्रश्न के विषय से परे हूं।

मेरा सुझाव है कि आप अपने vimrcफ़ाइल में कोड का एक टुकड़ा बनाए रखने की तुलना में एक प्लगइन (ऊपर या किसी अन्य से जुड़ा हुआ) का उपयोग करें।

संपादित करें: मैंने मैनुअल तरीके को हटा दिया था क्योंकि प्रश्न को बदल दिया गया था और 200_success द्वारा सही तरीके से उत्तर दिया गया था।


एक अतिरिक्त प्लगइन सुझाव: एनईआरडी टिप्पणीकार
vim.org/scripts/script.php?script_id=1218

नोट: यह केवल linewise टिप्पणियों का समर्थन करता है। उदाहरण के लिए, एएनएसआई सी //(केवल /* */) को नहीं पहचानता है ।
21

जबकि मुझे यह दृष्टिकोण पसंद है, क्या यह टिप्पणी करने का एक तरीका है?
ideasman42

1
@ ideasman42 आपको इसके बजाय एक फ़ंक्शन बनाना होगा और जांच करनी होगी कि क्या वर्तमान लाइन एक टिप्पणी के साथ शुरू होती है और फिर उस कॉल के आधार पर या तो :sउत्तर में दिखाए गए आदेशों में दिखाया गया है। चेक ही कुछ ऐसा होगा getline('.') =~ "^" . escape(b:comment_leader, '\/')। अगर यह सच है, अन्यथा टिप्पणी करें। यह परीक्षण नहीं किया गया है और केवल एक उदाहरण के रूप में काम करना चाहिए।
टोकियोमी

5

मैं इसके लिए scrooloose / nerdcommenter का उपयोग करता हूं

इस प्लगइन के साथ आप अपनी लाइनों का चयन कर सकते हैं और टिप्पणी टॉगल करने के लिए leader+ हिट कर सकते हैं c। फ़ाइल प्रकार के आधार पर यह टिप्पणी करने के लिए विभिन्न प्रतीकों का उपयोग करेगा।


5

आपके द्वारा लाइनों का चयन करने के बाद, बस टाइप करें

:norm I#

:स्वचालित रूप '<,'>से आपकी कमांड लाइन पर डाल देगा , जो आपके चयन की शुरुआत से लेकर अंत तक की एक सीमा है; normएक सामान्य मोड कमांड निष्पादित करता है, और उस सीमा पर कार्य करेगा; I#सामान्य मोड कमांड है जो लाइन की शुरुआत में '#' को सम्मिलित करता है।


4

मैं इसके लिए TComment का बहुत बड़ा प्रशंसक हूं ; न केवल मैं विशिष्ट टिप्पणी शैलियों को फ़िल्टाइप कर सकता हूं, बल्कि ब्लॉक टिप्पणियों का समर्थन करने वाली भाषाओं के लिए प्रति बनाम ब्लॉक भी निर्दिष्ट कर सकता हूं।

    gc{motion}   :: Toggle comments (for small comments within one line 
                    the &filetype_inline style will be used, if 
                    defined)
    gcc          :: Toggle comment for the current line

Explicit commenting/uncommenting:

    g<{motion}   :: Uncomment region
    g<c          :: Uncomment the current line
    g<b          :: Uncomment the current region as block

    g>{motion}   :: Comment region
    g>c          :: Comment the current line
    g>b          :: Comment the current region as block

In visual mode:

    gc           :: Toggle comments
    gC           :: Comment selected text

आपके उत्तर के लिए धन्यवाद! क्या आप शायद इसका विस्तार कर सकते हैं? प्लगइन-उत्तर प्रदान करना ठीक है, लेकिन अभी यह एक प्लगइन का सिर्फ एक लिंक है। बहुत कम से कम, यह क्या करता है और इसका उपयोग कैसे करें का एक बुनियादी विवरण उत्तर में अपेक्षित है। इस मेटा पोस्ट को भी देखें
मार्टिन टूरनोइज

कीबाइंड को कॉपी / पेस्ट करने के लिए मूर्खतापूर्ण लगता है लेकिन आप वहां जाते हैं; मैंने पहले ही बताया कि यह क्या करता है।
कोलिन ग्रैडी

3

मुझे लगता है कि विम-कमेंट्री प्लगइन दूर है और ऐसा करने का सबसे आसान तरीका है। लाइनों की एक श्रृंखला का चयन करें, तो बस हिट gc। यह आपके द्वारा खोले गए फ़िलिप्ट के लिए एक उपयुक्त टिप्पणी चरित्र का उपयोग करेगा। यह किसी भी दृश्य चयन के बिना आसन्न टिप्पणी लाइनों के साथ gcuया आसन्न करने के लिए भी संभव है gcgc


2

मान लें कि आप पंक्ति की शुरुआत में 5 लाइनों में उपसर्ग जोड़ना चाहते हैं, तो आप खोज और प्रतिस्थापन का उपयोग कर सकते हैं :

:.,+5s/^/prefix_/g

या लाइनों के अंत में:

:.,+5s/$/suffix_/g

या पाठ के ऊर्ध्वाधर ब्लॉक का चयन करने के लिए दृश्य मोड ( Ctrl+ v) का उपयोग करें, फिर इंसर्ट मोड दर्ज करें ( I) और कुछ टाइप Escकरें और अन्य लाइनों में परिवर्तन की पुष्टि करने और लागू करने के लिए दबाएं ।

सम्बंधित:


2

यह जवाब एक में चिपकाने के लिए सही कोड को दिखाने के 1 करने के लिए यहाँ) है .vimrcप्राप्त करने के लिए vim 7.4+टिप्पणी / जबकि दृश्य मोड में 1 शॉर्टकट और 2) के साथ खरोज स्तर रखते हुए यह समझाने के लिए uncommenting ब्लॉक करने के लिए।

यहाँ कोड है:

let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
function! Docomment ()
  "make comments on all the lines we've grabbed
  execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
endfunction
function! Uncomment ()
  "uncomment on all our lines
  execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
endfunction
function! Comment ()
  "does the first line begin with a comment?
  let l:line=getpos("'<")[1]
  "if there's a match
  if match(getline(l:line), '^\s*'.b:commentChar)>-1
    call Uncomment()
  else
    call Docomment()
  endif
endfunction
vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

यह काम किस प्रकार करता है:

  • let b:commentChar='//': यह vim में एक वैरिएबल बनाता है। bयहाँ गुंजाइश है, जो इस मामले में बफर करने के लिए निहित है, वर्तमान में खोला फ़ाइल अर्थ को दर्शाता है। आपके टिप्पणी वर्ण तार हैं और उद्धरणों में लिपटे रहने की आवश्यकता है, उद्धरण उन बातों का हिस्सा नहीं हैं जिन्हें टिप्पणी करते समय प्रतिस्थापित किया जाएगा।

  • autocmd BufNewFile,BufReadPost *...: ऑटोकॉमैंड्स अलग-अलग चीजों पर ट्रिगर करते हैं, इस मामले में, ये ट्रिगर होते हैं जब एक नई फ़ाइल या रीड फ़ाइल एक निश्चित एक्सटेंशन के साथ समाप्त होती है। एक बार ट्रिगर हो जाने के बाद, निम्न कमांड को निष्पादित करें, जो हमें commentCharफिलाटाइप के आधार पर बदलने की अनुमति देता है । ऐसा करने के अन्य तरीके हैं, लेकिन वे नौसिखियों (मेरे जैसे) के लिए अधिक भ्रमित हैं।

  • function! Docomment(): कार्य शुरू करने functionऔर समाप्त होने के साथ घोषित किए जाते हैं endfunction। कार्य एक पूंजी से शुरू होना चाहिए। यह !सुनिश्चित करता है कि यह फ़ंक्शन Docomment()इस संस्करण के साथ परिभाषित किसी भी पिछले फ़ंक्शन को ओवरराइट करता है Docomment()। मेरे बिना !, मेरे पास त्रुटियां थीं, लेकिन ऐसा इसलिए हो सकता है क्योंकि मैं vim कमांड लाइन के माध्यम से नए कार्यों को परिभाषित कर रहा था।

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': निष्पादित एक कमांड को बुलाता है। इस मामले में, हम निष्पादित कर रहे हैं substitute, जो एक सीमा ले सकता है (डिफ़ॉल्ट रूप से यह वर्तमान लाइन है) जैसे %कि पूरे बफर के लिए या '<,'>हाइलाइट किए गए अनुभाग के लिए। ^\s*किसी भी राशि के व्हाट्सएप के बाद शुरू होने वाली रेखा से मेल खाने के लिए regex है, जिसे तब (कारण &) से जोड़ा जाता है । .यहाँ, स्ट्रिंग संयोजन के लिए इस्तेमाल के बाद से किया गया है escape()सकते हैं उद्धरण में लिपटे नहीं किया। escape()आपको उन चरित्रों से बचने की अनुमति देता है commentCharजो तर्कों (इस मामले में, \और /) से मेल खाती हैं \। इसके बाद, हम अपने substituteस्ट्रिंग के अंत के साथ फिर से समतल करते हैं , जिसमें हैeझंडा। यह ध्वज हमें चुपचाप विफल होने देता है, जिसका अर्थ है कि यदि हम किसी दिए गए लाइन पर मैच नहीं पाते हैं, तो हम इसके बारे में चिल्लाएंगे नहीं। एक पूरे के रूप में, यह पंक्ति हमें पहले पाठ से ठीक पहले एक स्थान के बाद एक टिप्पणी चरित्र डालती है, जिसका अर्थ है कि हम अपना इंडेंटेशन स्तर रखते हैं।

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': यह हमारे पिछले विशाल लंबे आदेश के समान है। इस के लिए अद्वितीय, हमारे पास है \v, जो यह सुनिश्चित करता है कि हमें अपने से बचने की ज़रूरत नहीं है (), और 1, जो हमारे द्वारा बनाए गए समूह को संदर्भित करता है ()। मूल रूप से, हम एक ऐसी पंक्ति से मेल खाते हैं, जो किसी भी राशि के व्हाट्सएप से शुरू होती है और उसके बाद किसी भी राशि के व्हाट्सएप पर हमारे कमेंट कैरेक्टर और हम केवल व्हाट्सएप का पहला सेट रखते हैं। eयदि हम उस लाइन पर कोई टिप्पणी चरित्र नहीं रखते हैं , तो फिर से हमें चुपचाप विफल होने दें।

  • let l:line=getpos("'<")[1]: यह एक वैरिएबल को बहुत सेट करता है, जैसे हमने अपने कमेंट कैरेक्टर के साथ किया था, लेकिन lयह लोकल स्कोप (इस फंक्शन पर लोकल) को दर्शाता है। getpos()इस स्थिति में, हमारे हाइलाइटिंग की शुरुआत, और [1]इसका मतलब है कि हम केवल पंक्ति संख्या के बारे में परवाह करते हैं, कॉलम नंबर जैसी अन्य चीजों की नहीं।

  • if match(getline(l:line), '^\s*'.b:commentChar)>-1: आप जानते हैं कि कैसे ifकाम करता है। match()जाँच करता है कि पहली चीज़ में दूसरी चीज़ है या नहीं, इसलिए हम उस लाइन को पकड़ लेते हैं जिस पर हमने अपनी हाइलाइटिंग शुरू की है, और जाँचें कि क्या यह व्हाट्सएप के साथ शुरू होता है और उसके बाद हमारा कमेंट कैरेक्टर। match()इंडेक्स लौटाता है जहां यह सच है, और -1अगर कोई मैच नहीं मिला। चूंकि ifसभी गैर-संख्याओं के सही होने का मूल्यांकन करते हैं, हमें अपने आउटपुट की तुलना यह देखने के लिए करनी होगी कि क्या यह -1 से अधिक है। vimरिटर्न में तुलना 0 अगर गलत है और 1 अगर सही है, तो वही है जो ifसही मूल्यांकन करना चाहता है।

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: का vnoremapअर्थ है दृश्य मोड में निम्न कमांड को मैप करें, लेकिन इसे पुनरावर्ती रूप से मैप न करें (मतलब किसी भी अन्य कमांड को न बदलें जो अन्य तरीकों से उपयोग कर सकते हैं)। मूल रूप से, यदि आप एक विम नौसिखिया हैं, तो हमेशा noremapयह सुनिश्चित करने के लिए उपयोग करें कि आप चीजों को तोड़ न दें। <silent>इसका मतलब है "मुझे आपके शब्द नहीं चाहिए, बस आपके कार्य" और यह बताता है कि कमांड लाइन में कुछ भी प्रिंट न करें। <C-r>वह चीज़ है जो हम मैप कर रहे हैं, जो इस मामले में ctrl + r है (ध्यान दें कि आप इस मैपिंग के साथ सामान्य मोड में "redo" के लिए अभी भी Cr का उपयोग कर सकते हैं)। C-uथोड़े भ्रामक है, लेकिन मूल रूप से यह सुनिश्चित करता है कि आप अपने दृश्य हाइलाइटिंग का ट्रैक न खोएं ( इस उत्तर के अनुसार यह आपकी आज्ञा को शुरू करता है '<,'>जिसके साथ हम चाहते हैं)।callयहाँ केवल हमारे द्वारा नामित फ़ंक्शन को निष्पादित करने के लिए विम को बताता है, और बटन <cr>को हिट करने के लिए संदर्भित करता है enter। हमें वास्तव में फ़ंक्शन को कॉल करने के लिए इसे एक बार हिट करना होगा (अन्यथा हमने केवल call function()कमांड लाइन पर टाइप किया है, और हमें अपने सभी विकल्पों के माध्यम से जाने के लिए इसे फिर से हिट करना होगा (वास्तव में निश्चित रूप से क्यों नहीं, लेकिन जो भी हो)।

वैसे भी, उम्मीद है कि यह मदद करता है। इस के साथ प्रकाश डाला कुछ भी ले जाएगा v, Vया C-v, जांच करता है, तो पहली पंक्ति टिप्पणी की है, हाँ अगर, सभी पर प्रकाश डाला लाइनों uncomment करने की कोशिश, और यदि नहीं, प्रत्येक पंक्ति को टिप्पणी पात्रों में से एक अतिरिक्त परत जोड़। यह मेरा इच्छित व्यवहार है; मैं नहीं चाहता था कि यह टॉगल किया जाए कि ब्लॉक में प्रत्येक पंक्ति पर टिप्पणी की गई थी या नहीं, इसलिए यह विषय पर कई प्रश्न पूछने के बाद मेरे लिए पूरी तरह से काम करता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.