ভিআই বা ভিআইএম ব্যবহার করে লাইন সংখ্যা দ্বারা নির্দিষ্ট কোডের একাধিক লাইন মন্তব্য করা


20

আমি এই স্ট্যাক ওভারফ্লো প্রশ্নটি থেকে শিখেছি যে লাইন সংখ্যাগুলির একটি নির্দিষ্ট পরিসীমাটি মন্তব্য করা vi/ ব্যবহার করা সম্ভব vim। উদাহরণস্বরূপ, ধরুন আমার কাছে নিম্নলিখিত বাশ স্ক্রিপ্ট রয়েছে:

#!/bin/bash

This
is
my
very
very
great
script

এখন যে অনুমান আমি (যা শব্দ ধারণ 8 মাধ্যমে লাইন সংখ্যা 6 আউট মন্তব্য করতে চান very, veryএবং great) ব্যবহার করে #মন্তব্য অক্ষর। ইন vi/ vim, আমি কেবল :6,8s/^/#নিম্নলিখিতগুলি পেতে টাইপ করতে পারি :

#!/bin/bash

This
is
my
#very
#very
#great
script

যা লাইনের 6 থেকে 8 পর্যন্ত মন্তব্য করে।

আমার প্রশ্ন হ'ল, কি একই জাতীয় লাইনার টাইপ করা সম্ভব যা মন্তব্য চরিত্রটিকে 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। আমি আমার পিসি থেকে এসএসএইচ ব্যবহার করে একটি দূরবর্তী উবুন্টু লিনাক্স ক্লাস্টার অ্যাক্সেস করছি। আমি উবুন্টু লিনাক্স জিইউআই ব্যবহার করছি না।

উত্তর:


22

তুমি ব্যবহার করতে পার:

:6,8s/^#//

তবে ব্লক ভিজ্যুয়াল নির্বাচন মোডটি ব্যবহার করা আরও সহজ: লাইন 6 এর শুরুতে যান, টিপুন Ctrl-v, 8 নং লাইনে যান এবং টিপুন x

এছাড়াও "দ্য এনইআরডি কমেন্টার" প্লাগইন রয়েছে।


2
NERD Commenterআমার মতে এখানে যাওয়ার উপায় কি! তার জন্য +1
ব্যবহারকারী 1146332

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
@ পাওলোআলমিডা আপনি অবশ্যই আছেন আমি কেবল ভেবেছিলাম এটি কার্যকর হতে পারে যেহেতু ওপি ইতিমধ্যে লাইন নম্বরগুলি জানে (কারণ প্রথম কমান্ড তাদের মন্তব্য করার জন্য ব্যবহৃত হয়েছিল) এবং, যে কোনও ক্ষেত্রে, আমি যে সরঞ্জামগুলি দেখায় তা বিভিন্ন সমস্যার জন্য প্রয়োগ করা যেতে পারে।
টেরডন

4

vivimবেশিরভাগ জিএনইউ / লিনাক্স বিতরণে প্রতীকী লিঙ্ক তাই vimআপনি টাইপ করার সময় আপনি সত্যই ব্যবহার করছেন vi

মন্তব্যগুলি সরাতে, আপনি টাইপ করতে পারেন: :6,8s/^#//বা  প্রতীকের :6,8s/^\s*#//আগে কিছু নেতৃস্থানীয় স্থান ফেলে দিতে পারেন #


1
অনেক ধন্যবাদ. দেখে মনে হচ্ছে টাইপসও থাকতে পারে। এটা হতে হবে :6,8s/^#//এবং 6,8s/^\s*#//?
অ্যান্ড্রু

3

আপনি সম্ভবত ব্যবহার করছেন vim.tiny। যাইহোক, আপনি প্রাথমিক মন্তব্যগুলি এর সাথে সরাতে পারেন:

:6,8s/^#//

অবশ্যই, আপনি যদি এগুলি অন্য কোনও উপায়ে instanceোকান (উদাহরণস্বরূপ, একটি অতিরিক্ত স্থান সহ), আপনার অন্য যে কোনও কিছু সরিয়ে ফেলতে হবে। পূর্ণ ভিম সহ, কলামগুলি চাক্ষুষভাবে নির্বাচন করা এবং অক্ষরগুলি সন্নিবেশ করা / মোছা একই জিনিসটি করার একটি সহজ উপায়।


3

ব্যক্তিগতভাবে আমার প্রিয় উপায়টি ভিজ্যুয়াল ব্লক মোডটি ব্যবহার করছে

ctrl+ + vচাক্ষুষ ব্লক মোড, নির্দেশক তীরচিহ্নগুলি ব্যবহার করুন প্রবেশ করুন বা লাইন এবং প্রেস নির্বাচন করতে hjkl করতে xবা del

তাদের ফিরে চান?

ctrl+ + vনির্বাচন করুন, তারপরে I(মূলধন ঝ)#Esc


3

আফাইক, 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

কমান্ড স্থাপন / মুছতে।

আপনি যদি ভিজ্যুয়াল মোড পছন্দ করেন তবে আপনি মানচিত্র নির্ধারণ করতে পারেন can

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

যেমন আপনাকে কেবল ভিজ্যুয়াল মোডে একটি লাইন রেঞ্জ নির্বাচন করতে হবে এবং টিপুন F7এবং F8যথাক্রমে মন্তব্যগুলি লাগাতে এবং মুছে ফেলতে হবে।


1

tpopeবলা হয় এই জীবন পরিবর্তন প্লাগইন আছেvim-commentary

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

এই প্লাগইন সরবরাহ করে :

  • সদ্বিবেচনা
  • সঠিকভাবে অভিযুক্ত মন্তব্য
  • খালি / অপ্রয়োজনীয় লাইনগুলি মন্তব্য করে না

ব্যবহার :

  • ভন্ডল (অথবা আমার অনুমানকারী প্যাথোজেন) এর মাধ্যমে ইনস্টল করুন।
  • আপনার পাঠ্যটি হাইলাইট করুন এবং টিপুন :যা হিসাবে প্রদর্শিত হবে:<,'>
  • এখানে কমেন্টারি :<,'>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='//': এটি ভিমে একটি পরিবর্তনশীল তৈরি করে। bএখানে সুযোগ, যা এই ক্ষেত্রে বাফার অন্তর্ভুক্ত করা হয়, বর্তমানে খোলা ফাইল অর্থ বোঝায়। আপনার মন্তব্যের অক্ষরগুলি স্ট্রিং এবং কোটগুলিতে মুড়ে ফেলা দরকার, টোটাল টগল করার সময় কোটগুলি কী পরিমাণে প্রতিস্থাপন করা হবে তার অংশ নয়।

  • autocmd BufNewFile,BufReadPost *...: স্বতঃশব্দগুলি বিভিন্ন জিনিসে ট্রিগার করে, এক্ষেত্রে নতুন ফাইল বা পঠন ফাইলটি নির্দিষ্ট এক্সটেনশনের সাথে শেষ হলে এগুলি ট্রিগার হয়। একবার ট্রিগার হয়ে গেলে, নিম্নলিখিত কমান্ডটি কার্যকর করুন যা আমাদের commentCharফাইল টাইপের উপর নির্ভর করে পরিবর্তন করতে দেয় । এটি করার অন্যান্য উপায় রয়েছে তবে তারা নবীনদের (আমার মতো) আরও বিভ্রান্তিকর।

  • function! Docomment(): ফাংশনগুলি শুরু করে functionএবং শেষ করে ঘোষণা করা হয় endfunction। কার্যাদি একটি মূলধন দিয়ে শুরু করা উচিত। !নিশ্চিত করে যে এই ফাংশন পূর্ববর্তী কোনো ফাংশন হিসাবে সংজ্ঞায়িত মুছে ফেলা হয় Docomment()এর এই সংস্করণের সাথে Docomment()। ছাড়া !, আমার ত্রুটি ছিল, তবে এটি সম্ভবত কারণ আমি ভিএম কমান্ড লাইনের মাধ্যমে নতুন ফাংশনগুলি সংজ্ঞায়িত করছি।

  • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e': এক্সিকিউট একটি কমান্ড কল। এই ক্ষেত্রে, আমরা সম্পাদন করছি substitute, যা %পুরো বাফার বা '<,'>হাইলাইটেড বিভাগের জন্য (পূর্বনির্ধারিতভাবে এটি বর্তমান লাইনটি) একটি পরিসর নিতে পারে । ^\s*রেগেক্সটি কোনও লাইন শুরুর সাথে মিলে যায় তার পরে কোনও পরিমাণ শ্বেতস্পেস, যা এরপরে যুক্ত হয় (কারণে &)। .এখানে স্ট্রিং সংযুক্তকরণের জন্য ব্যবহৃত যেহেতু হয় 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যদি কোনও মিল খুঁজে পাওয়া যায় নি returns যেহেতু ifসমস্ত ননজারো সংখ্যাকে সত্য বলে মূল্যায়ন করে, আমাদের আউটপুটটি -1 এর চেয়ে বেশি কিনা তা দেখতে আমাদের তুলনা করতে হবে। vimরিটার্নের তুলনায় 0 টি মিথ্যা হলে এবং 1 টি যদি সত্য হয়, যা ifসঠিকভাবে মূল্যায়ন করতে দেখতে চায়।

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>: এর vnoremapঅর্থ নীচের কমান্ডটি ভিজ্যুয়াল মোডে মানচিত্র করুন, তবে এটিকে পুনরাবৃত্তভাবে মানচিত্র করবেন না (অর্থাত্ কোনও উপায় যা অন্য উপায়ে ব্যবহার করতে পারে তা পরিবর্তন করবেন না)। মূলত, আপনি যদি কোনও ভিম ​​আভিজাত্য হন তবে সর্বদা noremapআপনার জিনিসগুলি ভঙ্গ করবেন না তা নিশ্চিত করার জন্য ব্যবহার করুন । <silent>এর অর্থ "আমি আপনার শব্দগুলি চাই না, কেবল আপনার ক্রিয়াকলাপ" এবং কমান্ড লাইনে কোনও কিছু না প্রিন্ট করতে বলে। <C-r>এই জিনিসটি আমরা ম্যাপ করছি, যা এই ক্ষেত্রে সিটিআরএল + আর (নোট করুন যে আপনি এখনও এই ম্যাপিংটি দিয়ে সাধারণ মোডে "redo" এর জন্য সিআর সাধারণভাবে ব্যবহার করতে পারেন)। C-uবিভ্রান্তিকর, তবে মূলত এটি নিশ্চিত করে যে আপনি আপনার ভিজ্যুয়াল হাইলাইটিংয়ের ট্র্যাকটি হারাবেন না ( এই উত্তর অনুসারে এটি আপনার আদেশটি শুরু করে '<,'>যা আমরা যা চাই তা দিয়ে শুরু করে )।callএখানে কেবল আমাদের নামকরণ করা ফাংশনটি কার্যকর করতে ভিমকে বলে এবং বাটনটি <cr>আঘাত করা বোঝায় enter। আমাদের ফাংশনটি কল করতে একবার এটি আঘাত করতে হবে (অন্যথায় আমরা call function()কমান্ড লাইনে সবেমাত্র টাইপ করেছি এবং আমাদের বিকল্পগুলি সমস্ত পথ দিয়ে যেতে পেতে এটি পুনরায় আঘাত করতে হবে (কেন তা নিশ্চিত নয় তবে কেন যাই হোক না কেন)।

যাইহোক, আশা করি এটি সাহায্য করবে। এই দিয়ে হাইলাইট কিছু লাগবে v, Vঅথবা C-v, চেক যদি প্রথম লাইন মন্তব্য করা হয়, হ্যাঁ হলে, সব হাইলাইট লাইন uncomment চেষ্টা করে, এবং যদি না, প্রতিটি লাইনে মন্তব্য অক্ষরের একটি অতিরিক্ত স্তর যোগ করুন। এটি আমার কাঙ্ক্ষিত আচরণ; আমি চাইনি যে এটি ব্লগের প্রতিটি লাইন মন্তব্য করা হয়েছে কিনা তা টগল করতে চাই না, তাই বিষয়টিতে একাধিক প্রশ্ন জিজ্ঞাসা করার পরে এটি আমার পক্ষে নিখুঁতভাবে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.