Vi या vim का उपयोग करके, लाइन नंबरों द्वारा निर्दिष्ट कोड की कई पंक्तियों को टिप्पणी करना


20

मैंने इस स्टैक ओवरफ्लो प्रश्न से सीखा है कि लाइन नंबरों की एक निर्दिष्ट सीमा का उपयोग करना vi/ vimटिप्पणी करना संभव है । उदाहरण के लिए, मान लें कि मेरे पास निम्नलिखित बैश स्क्रिप्ट है:

#!/bin/bash

This
is
my
very
very
great
script

अब मान लीजिए कि मैं (जो शब्द शामिल 8 के माध्यम से लाइन नंबर 6 बाहर टिप्पणी करना चाहते हैं very, veryऔर great) का उपयोग कर #टिप्पणी चरित्र। In vi/ vim, मैं केवल :6,8s/^/#निम्नलिखित प्राप्त करने के लिए टाइप कर सकता हूं :

#!/bin/bash

This
is
my
#very
#very
#great
script

जो 8 के माध्यम से 6 लाइनों की टिप्पणी करता है।

मेरा सवाल है, क्या एक समान एक लाइनर टाइप करना संभव है जो टिप्पणी के अक्षर को 6 से 8 के माध्यम से हटा देगा #(लेकिन फ़ाइल में कोई अन्य टिप्पणी की गई पंक्तियाँ नहीं)?

यह कहने के बाद, मुझे एहसास हुआ कि मैं वास्तव में उपयोग viकर रहा हूं या नहीं इस बारे में कुछ बहस है vim। व्यवहार में, मैं script.shकमांड के साथ एक फ़ाइल खोलता हूं vi script.sh। इसके अलावा, जब मैं कमांड टाइप करता which viहूं, मुझे प्राप्त होता है /usr/bin/vi। फिर भी, जब मैं बस टाइप करता हूं viऔर दबाता Enterहूं, तो मैं इसे प्राप्त करता हूं:

~                              VIM - Vi IMproved
~
~                               version 7.2.330
~                           by Bram Moolenaar et al.
~                 Vim is open source and freely distributable
~
~                           Sponsor Vim development!
~                type  :help sponsor<Enter>    for information
~
~                type  :q<Enter>               to exit
~                type  :help<Enter>  or  <F1>  for on-line help
~                type  :help version7<Enter>   for version info

जो यह सुझाव देता है कि मैं वास्तव में उपयोग कर रहा हूं vim। मैं अपने पीसी से SSH का उपयोग करके एक दूरस्थ उबंटू लिनक्स क्लस्टर का उपयोग कर रहा हूं। मैं उबंटू लिनक्स जीयूआई का उपयोग नहीं कर रहा हूं।

जवाबों:


22

आप उपयोग कर सकते हैं:

:6,8s/^#//

लेकिन ब्लॉक विज़ुअल चयन मोड का उपयोग करना बहुत आसान है: लाइन 6 की शुरुआत में जाएं, दबाएं Ctrl-v, नीचे पंक्ति 8 पर जाएं और दबाएं x

वहाँ भी है "बेवकूफ टिप्पणीकार" प्लगइन।


2
NERD Commenterमेरी राय में यहाँ जाने का रास्ता है! +1 के लिए
user1146332

7

मुझे पता है कि आपका प्रश्न उपयोग करने के लिए निर्दिष्ट करता है viया vimयहां है, लेकिन फ़ाइल को मैन्युअल रूप से खोलने के बिना ऐसा करने के लिए कुछ अन्य विकल्प हैं:

  • पर्ल

    perl -ne 'if($. <=8 && $. >= 6){s/^\s*#//;}print' foo.sh 
    
  • पर्ल संस्करण> = 5.10

    perl -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh 
    

    यह फ़ाइल की सामग्री का प्रिंट आउट लेगा, आप या तो दूसरे ( > new_file.sh) में रीडायरेक्ट कर सकते हैं या iफ़ाइल को जगह में संपादित करने के लिए उपयोग कर सकते हैं :

    perl -i -ne '$. ~~ [6..8] && s/^\s*#//;print' foo.sh 
    
  • sed

    sed '6,8 s/^ *#//' foo.sh
    

    फिर, इसे मूल फ़ाइल को संपादित करने के लिए उपयोग करें i:

    sed -i '6,8 s/^ *#//' foo.sh
    
  • awk/ / gawk:

    gawk '(NR<=8 && NR>= 6){sub("^ *#","")}{print}' foo.sh
    
  • शुद्ध bash:

    c=1; while read line; do 
      if [ $c -ge 6 ] && [ $c -le 8 ]; then 
         echo "${line/\#/}"
      else 
         echo $line 
      fi
      let c++; done < foo.sh
    

1
यह "फ़ाइल को मैन्युअल रूप से खोलने के लिए" होने की बात नहीं है, क्योंकि आमतौर पर आप यह तय करते हैं कि दृश्य निरीक्षण पर टिप्पणी करने के लिए कौन सी लाइनें हैं, जबकि संपादन :) लेकिन निश्चित रूप से, यह पूर्णता के लिए एक अच्छा जवाब है।
पाउलो अल्मेडा

2
@PauloAlmeida तुम बिल्कुल सही हो। मुझे लगता है कि यह उपयोगी हो सकता है क्योंकि ओपी पहले से ही लाइन नंबर जानता है (क्योंकि पहले कमांड उन्हें टिप्पणी करता था) और, किसी भी मामले में, मेरे द्वारा दिखाए गए उपकरण विभिन्न प्रकार की समस्याओं पर लागू हो सकते हैं।
terdon

4

vivimअधिकांश जीएनयू / लिनक्स वितरण में एक प्रतीकात्मक लिंक है ताकि vimआप टाइप करते समय वास्तव में उपयोग कर रहे हों vi

टिप्पणियों को हटाने के लिए, आप टाइप कर सकते हैं: :6,8s/^#//या  प्रतीक :6,8s/^\s*#//से पहले कुछ प्रमुख स्थान को छोड़ दें #


1
बहुत बहुत धन्यवाद। ऐसा लगता है कि टाइपो हो सकता है। शायद यह होना चाहिए :6,8s/^#//और 6,8s/^\s*#//?
एंड्रयू

3

आप शायद उपयोग कर रहे हैं vim.tiny। किसी भी स्थिति में, आप निम्न टिप्पणियों को हटा सकते हैं:

:6,8s/^#//

बेशक, यदि आप उन्हें एक अलग तरीके से सम्मिलित करते हैं (उदाहरण के लिए, एक अतिरिक्त स्थान के साथ), तो आपको जो कुछ भी है उसे हटाने की आवश्यकता हो सकती है। पूर्ण विम के साथ, नेत्रहीन स्तंभों का चयन करना और पात्रों को सम्मिलित करना / हटाना एक ही काम करने का एक आसान तरीका है।


3

व्यक्तिगत रूप से मेरा पसंदीदा तरीका विजुअल ब्लॉक मोड का उपयोग कर रहा है

ctrl+ vदृश्य ब्लॉक मोड में प्रवेश करने के लिए, लाइनों का चयन करने के लिए तीर कुंजियों या hjkl का उपयोग करें और दबाएं xया del

उन्हें वापस चाहते हैं?

ctrl+ vचयन करें, फिर I(पूंजी i)#Esc


3

AFAIK, vi आमतौर पर आजकल विम का एक सिम्कल है (सीमलिंक का प्रयास करें which viया type viफिर पालन करें)। शायद, यहां तक ​​कि /usr/bin/vi-> /etc/alternatives/vi-> /usr/bin/vim.basic

व्यक्तिगत रूप से, कई टिप्पणी लाइनों को हटाने के लिए, मैं CtrlVइसके माध्यम से एक ऊर्ध्वाधर ब्लॉक का चयन करना और इसे हटाना पसंद करता हूं । यदि आपको कई पंक्तियों में एक टिप्पणी प्रतीक जोड़ना है CtrlV, तो आप ShiftIटाइप कर सकते हैं , #और Esc, एक टिप्पणी को कई लाइनों में जोड़ा जाएगा।


2

उपरोक्त उत्तर, का उपयोग करते हुए

:6,8s/^#//

सही समाधान कर रहे हैं, लेकिन टाइप करने के लिए थोड़ा बोझिल। इसमें नई कमांड्स को परिभाषित करके इसे सरल बनाया जा सकता है ~/.vimrc

command -range=% C :<line1>,<line2>s/^/#/
command -range=% D :<line1>,<line2>s/^#//

और आप सिर्फ टाइप कर सकते हैं

:6,8C
:6,8D

कमांड रखने / हटाने के लिए।

यदि आप दृश्य मोड पसंद करते हैं, तो आप नक्शे को परिभाषित कर सकते हैं

map <F7> :s/^/#/<CR>
map <F8> :s/^#//<CR>

इस तरह आप केवल दृश्य मोड, और प्रेस में एक पंक्ति श्रेणी का चयन करने के लिए है कि F7और F8क्रमशः टिप्पणियां डाल दिया और दूर करने के लिए।


1

इस जीवन को बदलने के लिए प्लगइन tpopeकहा जाता हैvim-commentary

https://github.com/tpope/vim-commentary

यह प्लगइन प्रदान करता है :

  • मानसिक स्वास्थ्य
  • समुचित रूप से टिप्पणी की गई
  • खाली / अनावश्यक लाइनों पर टिप्पणी नहीं करता है

उपयोग :

  • Vundle (या पथोजेन मुझे लगता है) के माध्यम से स्थापित करें।
  • अपने टेक्स्ट को हाइलाइट करें और प्रेस करें :जो कि इस प्रकार दिखाई देगा:<,'>
  • यहां कमेंट्री टाइप करें :<,'>Commentaryऔर एंटर दबाएं।
  • बोम। तुम्हारी किया कली

1

यह जवाब एक में चिपकाने के लिए सही कोड को दिखाने के 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.