নির্বাচন বা ম্যাচ হয় প্রতিটি লাইনে একটি বাড়ানো নম্বর .োকান


10

আমার একটি সমস্যা রয়েছে যে আমি সমাধানের জন্য দুটি সাধারণ পদ্ধতির কথা ভাবতে পারি, তবে উভয় পদ্ধতির জন্য আমি নির্দিষ্টকরণগুলি জানি না।

...
Level 1:    cũng    also
Level 1:    và      and
Level 1:    như     like; such as
Level 2:    các     plural marker
Level 2:    của     belonging to
...

"লেভেল এন" থেকে শুরু হওয়া প্রতিটি লাইনের জন্য আমি "01" দিয়ে শুরু করে একটি সংখ্যা সন্নিবেশ করতে চাই। সরলতার জন্য আসুন নম্বরটি সংশোধন করি।

পদ্ধতির 1: ম্যানুয়ালি একই স্তরের সমস্ত লাইন নির্বাচন করুন। আমি শিগগির শিগগিরই ম্যাজিক চালাও।

পদ্ধতির 2: একটি অনুসন্ধান লিখুন এবং প্রতিস্থাপন পাঠ্যের একটি প্রতিস্থাপন পাঠ্য যা প্রতিটি ম্যাচ সঙ্গে এক এক দ্বারা বৃদ্ধি যা প্রতিটি স্তরের সাথে সমস্ত লাইন মেলে প্রতিস্থাপন।

আমি স্ট্যাকওভারফ্লো বা অন্যান্য ভীম সাইটগুলিতে একই রকম প্রশ্ন পেয়েছি , তবে প্রত্যেকের কাছে নিম্নলিখিত সমস্যার একটি বা একাধিক সমস্যা রয়েছে বলে মনে হচ্ছে:

  1. একটি স্বেচ্ছাসেবক কিন্তু ইনক্রিমেন্টিং সংখ্যার চেয়ে বর্তমান লাইন নম্বরটি সন্নিবেশ করা সম্পর্কে।
  2. সংখ্যাটি শূন্যপ্যাড দেয় না।
  3. উইন্ডোজ on. এ চলমান আমার ভিম .4.৪ এর নির্বাচনের জন্য আসলে কাজ করে না (এগুলির ফলে ত্রুটির সৃষ্টি হয় E481: No range allowed))

আমি উইন্ডোজটিতে এমএসউইন.ভিম দিয়ে জিভিম চালাচ্ছি তবে সেটআপটি কাস্টমাইজ না করেই সমস্ত ভ্যানিলা ভিম ইনস্টলের উপর কাজ করে এমন একটি সমাধান সেরা হতে পারে।


প্রশ্নের জন্য আমি যে সেরা ট্যাগগুলি ভাবতে পারি তার উপস্থিতি নেই: নির্বাচন এবং ব্যাপ্তি তাই নির্দ্বিধায় পুনরায় ট্যাগ করতে বা এই ট্যাগগুলির মধ্যে একটি তৈরি করতে।
হিপ্পিট্রেইল

1
এই প্লাগইনটি আপনার সমস্যার জন্য একটি সম্পূর্ণ সমাধান নয়, তবে এটি সংখ্যার কলাম যুক্ত করার জন্য অত্যন্ত কার্যকর: ভিজিঙ্কর । ডক্স এখানে । FWIW।
lcd047

উত্তর:


17

Https://vi.stackexchange.com/a/818/227 এ থাকা উত্তরের মতো , আপনি গ্লোবাল কমান্ড ব্যবহার করতে পারেন।

এটির সাহায্যে আপনি ভিমকে কোনও প্যাটার্নের সাথে মিলিত লাইনগুলি অনুসন্ধান করতে নির্দেশ দিতে পারেন এবং তারপরে এটিতে আদেশগুলি সম্পাদন করতে পারেন।

আপনার ক্ষেত্রে, আপনি "লেভেল এন:" দিয়ে শুরু হওয়া লাইনে পাঠ্যটি প্রিপেন্ড করতে চান, যাতে আমাদের বিশ্বব্যাপী আদেশটি হতে পারে

:g/^Level \d:/{COMMANDS}

কমান্ডের জন্য বিকল্প কমান্ড (নিয়মিত অভিব্যক্তি প্রতিস্থাপন) ব্যবহার করে

আদেশগুলি আরও মজাদার। ভেরিয়েবলগুলি ব্যবহার করা সহজ বলে আমি সাধারণত এই জাতীয় সামগ্রীর জন্য নিয়মিত এক্সপ্রেশন প্রতিস্থাপন করতে চাই।

আপনার প্রশ্নের উদাহরণ

:let i = 1 | g/^Level \d:/s/^/\=printf("%02d ", i)/ | let i = i+1

কিভাবে এটা কাজ করে

প্রতিস্থাপন কমান্ডের প্রতিস্থাপন বিভাগে একটি অভিব্যক্তি হতে পারে।

প্রথমটি যা করব তা হ'ল iপ্রারম্ভিক সংখ্যা হিসাবে একটি ভেরিয়েবল সেট করা । আমি 1 বেছে নিয়েছি, তবে যে কোনও নম্বর করবে।let i = 1

তারপরে আমরা আমাদের বিশ্বব্যাপী কমান্ডটি চালাই, যা আমাদের সাথে মিলিত লাইনে একটি ক্রিয়া করতে প্রস্তুত করে। g/^Level \d:/

সাবস্টিটিউশন কমান্ড এবং লেট কমান্ড ব্যবহার করে আমাদের বৈশ্বিক কমান্ডটি আমাদের কাউন্টারটির মান এবং বর্ধন করবে।s/^/\=printf("%02d ", i)/ | let i = i+1

সাবস্টিটিউশন কমান্ডের নিয়মিত অভিব্যক্তি রেখার ^শুরুটি আবিষ্কার করে এবং এটিকে একটি এক্সপ্রেশন দিয়ে প্রতিস্থাপন করে এবং আমাদের এক্সপ্রেশনটি একটি ফর্ম্যাট মুদ্রণের ফলাফল হবে। সি ভাষার মতো, ভিমের প্রিন্টফ বিন্যাসের পরামিতিগুলি নেয়। %02dএর অর্থ একটি যুক্তি রূপান্তর করুন যেন এটি একটি দশমিক সংখ্যা d, কমপক্ষে 2 স্পেস 2এবং 0 সহ প্যাড দখল করে 0। বিশদ এবং অন্যান্য রূপান্তর বিকল্পের জন্য (ভাসমান পয়েন্ট বিন্যাস সহ) দেখুন :help printf। আমরা প্রিন্টফকে আমাদের কাউন্টিং ভেরিয়েবল দিই iএবং এটি আমাদের 01প্রথমবার, 02দ্বিতীয় বার ইত্যাদি দেয় This

নোট যে আমি ঘ পর কোন space করা: "%02d "। আপনি প্রশ্নটিতে এটি জিজ্ঞাসা করেননি (এবং আমি উদাহরণ আউটপুট দেখতে পাইনি) তবে আমি সন্দেহ করেছি যে আপনি "স্তর" শব্দটি থেকে সংখ্যাটি আলাদা করতে চেয়েছিলেন। লেভেলের এল এর ঠিক পাশেই numberোকানো নম্বর পেতে প্রিন্টফকে দেওয়া স্ট্রিং থেকে স্থানটি সরান।

অবশেষে, let i = i + 1প্রতিটি প্রতিস্থাপনের পরে এটি আমাদের কাউন্টারকে বাড়িয়ে তোলে।

এটি সাধারণভাবে কার্যকরী ডেটা সহ অন্যান্য মানদণ্ডের সাথে মিলে যাওয়া লাইনের অংশগুলি প্রতিস্থাপনের জন্য সাধারণত প্রয়োগ করা যেতে পারে।

সম্মিলিত সাধারণ কমান্ড ব্যবহার করে

সাধারণ সন্নিবেশ বা জটিল সম্পাদনার জন্য এটি ভাল। বিকল্পের মতো, আমরা গ্লোবালটি মিলাতে ব্যবহার করব, তবে নিয়মিত অভিব্যক্তি প্রতিস্থাপনের পরিবর্তে আমরা ধারাবাহিক ক্রিয়াকলাপ সম্পাদন করব যেমনটি ব্যবহারকারীর দ্বারা টাইপ করা হয়েছে।

আপনার প্রশ্নের উদাহরণ

:let i = 1 | g/^Level \d:/execute "normal! I" . printf("%02d ", i) | let i = i+1

কিভাবে এটা কাজ করে

ব্যবহৃত মানগুলি বিকল্পের সাথে খুব সমান (আমরা এখনও আমাদের সংখ্যাটি ২ টি সংখ্যার সাথে প্যাড করে 0 করার জন্য প্রিন্টফ ব্যবহার করছি) তবে অপারেশনটি ভিন্ন।

এখানে আমরা এক্সিকিউট কমান্ডটি ব্যবহার করি যা একটি স্ট্রিং নেয় এবং একটি প্রাক্তন কমান্ড ( :help :exe) হিসাবে স্ট্রিং চালায় । আমরা একটি স্ট্রিং তৈরি করি যা আমাদের তথ্যগুলির সাথে "স্বাভাবিক! আমি" একত্রিত করে যা প্রথমবার "স্বাভাবিক! I01" এবং দ্বিতীয়বার "স্বাভাবিক! I02" ইত্যাদি হবে etc.

normalকমান্ড সঞ্চালিত অপারেশন যেমন স্বাভাবিক মোডে পারেন। এই উদাহরণে, আমাদের সাধারণ কমান্ডটি I, যা লাইনের শুরুতে সন্নিবেশ করে। আমরা যদি ddএটি ব্যবহার করতাম তবে লাইনটি মুছে ফেলা oহত, মিলিত লাইনের পরে একটি নতুন লাইন খুলবে। দেখে মনে হচ্ছে আপনি Iনিজেকে স্বাভাবিক মোডে টাইপ করেছেন (বা অন্য কোনও ক্রিয়াকলাপ)। আমরা ব্যবহার !পর normalনিশ্চিত কোন ম্যাপিং আমাদের পথ পেতে হবে। দেখুন :help :normal

তারপরে যা প্রবেশ করা হয় তা হ'ল আমাদের প্রিন্টফের মান, বিকল্প ব্যবহারের প্রথম উদাহরণ হিসাবে।

এই পদ্ধতিটি রেজেক্সের চেয়ে কল্পিত হতে পারে, কারণ আপনি এমন কিছু করতে পারেন execute "normal! ^2wy" . i . "th$p"যা পাঠ্যের শুরুতে যাবে, ^2 টি শব্দ এগিয়ে যাবে 2w, ইঙ্ক 'এইচ' অক্ষর না হওয়া পর্যন্ত y" . i . "thলাইন শেষ করবে $এবং পেস্ট করবে p

এটি প্রায় কোনও ম্যাক্রো চালানোর মতো, তবে বাস্তবে কোনও রেজিস্টার ব্যবহার করে না এবং কোনও এক্সপ্রেশন থেকে স্ট্রিংগুলি একত্রিত করতে পারে। আমি এটি খুব শক্তিশালী বলে মনে করি।

প্রতিটি স্তরের নিজস্ব কাউন্টার রয়েছে এমন পদ্ধতির কাছে যান

আপনি প্রতিটি স্তরের নিজস্ব কাউন্টার পেতে চান। আপনি যদি সময়ের আগে সর্বাধিক সংখ্যা জানেন তবে আপনি নিম্নলিখিতটি করতে পারেন (সবচেয়ে বড় স্তর খুঁজে পেতে অতিরিক্ত কোড যুক্ত করা খুব কঠিন নাও হতে পারে তবে এই উত্তরটি খুব দীর্ঘ করে দেবে This এটি যত দীর্ঘ হয়)।

প্রথমে, আমি মুক্ত করতে দিই, যদি আমরা ইতিমধ্যে এটি পূর্ণসংখ্যা হিসাবে ব্যবহার করি। আমি আমি একটি তালিকায় রূপান্তর করতে পারি না, আমাদের সেভাবে তৈরি করতে হবে।

:unlet! i

এর পরে, আমি স্তরগুলির সংখ্যা সহ একটি তালিকা হতে সেট করতে দিন। আপনি আপনার প্রশ্নে 2 দেখিয়েছেন তবে এটি মজাদার জন্য 10 ধরে নিই। যেহেতু তালিকা সূচক 0 ভিত্তিক, এবং আমি আপনার তালিকার মতো 1 ভিত্তিক সংশোধন করতে বিরক্ত করতে চাই না, আমরা কেবলমাত্র পর্যাপ্ত উপাদান তৈরি করব (11) এবং কখনও 0 সূচক ব্যবহার করব না।

:let j = 0
:let i = []
:while j < 11 | let i += [1] | let j += 1 | endwhile

এর পরে, স্তর স্তরটি পেতে আমাদের একটি উপায় প্রয়োজন। ভাগ্যক্রমে, বিকল্পটিও একটি ফাংশন হিসাবে উপলব্ধ, তাই আমরা এটিকে আমাদের লাইন দেব এবং স্তর সংখ্যাটি বের করবsubstitute(getline("."), "^Level \\(\\d\\):.*", "\\=submatch(1)", "")

যেহেতু আমি এখন 11 1টির একটি তালিকা (প্রতিটি সূচক আমাদের স্তরের জন্য কাউন্টার), এখন আমরা এই প্রতিস্থাপনের ফলাফলটি ব্যবহার করতে উপরের উদাহরণগুলির মধ্যে দুটি সমন্বয় করতে পারি:

বিকল্প কমান্ডের মাধ্যমে:

:unlet! i | unlet! j | let j = 0 | let i = [] | while j < 11 | let i += [1] | let j += 1 | endwhile
:g/^Level \d:/let ind=str2nr(substitute(getline("."), "^Level \\(\\d\\):.*", "\\=submatch(1)", "")) | s/^/\=printf("%02d ", i[ind])/ | let i[ind] += 1

সাধারণ কমান্ডের মাধ্যমে:

:unlet! i | unlet! j | let j = 0 | let i = [] | while j < 11 | let i += [1] | let j += 1 | endwhile
:g/^Level \d:/let ind=str2nr(substitute(getline("."), "^Level \\(\\d\\):.*", "\\=submatch(1)", "")) | execute "normal! I" . printf("%02d ", i[ind]) | let i[ind] += 1

উদাহরণ ইনপুট:

Level 1: stuff

Level 1: Stuff

Some text
Level 3: Other

Level 1: Meh

Level 2: More

উদাহরণ আউটপুট:

01 Level 1: stuff

02 Level 1: Stuff

Some text
01 Level 3: Other

03 Level 1: Meh

01 Level 2: More

বাহ, খুব এনসাইক্লোপিডিক। আমি কেবল প্রথম অংশটি পড়েছি এবং মনে হয়েছে যে আমি গত কয়েক বছরের তুলনায় ভিম সম্পর্কে আরও কিছু শিখেছি learned এটি এই জাতীয় উত্তর যা স্ট্যাক এক্সচেঞ্জকে গড় প্রশ্নোত্তর সাইটের তুলনায় আরও ভাল করে তোলে এবং একটি ভিএম নির্দিষ্ট এসই থাকার সুবিধাও দেখায়।
হিপ্পিট্রেইল

3

আপনি https://stackoverflow.com/a/4224454/15934 থেকে আপনার সংখ্যা শূন্য প্যাডে তৈরি করতে পারেন ।

" A reminder: how to start numbers at the first line
:'<,'>s/^\s*\zs/\=(line('.') - line("'<")+1).'. '

প্যাডিং সংখ্যার ক্রিয়াটি সহজ করার জন্য, আমি একজোড়া ফাংশন এবং একটি কমান্ড চাই:

command!  -range=% -nargs=? PrependNumbers <line1>,<line2>call s:Prepend(<args>)

function! s:ReplExpr(nb_digits, number)
  return repeat('0', a:nb_digits - strlen(a:number)).a:number
endfunction

function! s:Prepend(...) range
  let pattern = a:0 > 0 ? '\ze'. a:1 : '^'
  let nb_values = (a:lastline - a:firstline) + 1
  let nb_digits = strlen(nb_values)
  exe ':'.a:firstline.','a:lastline.'s#'.pattern.'#\=s:ReplExpr(nb_digits, 1+ line(".")-'.a:firstline.')." "#'
endfunction

এর চেয়ে আপনার লাইনগুলি নির্বাচন করুন এবং টাইপ করুন :PrependNumber(আপনি দেখতে পাবেন :'<,'>PrependNumber[


তবে line(".")"বর্তমান লাইনের নম্বরটি ব্যবহার করবেন" এর অর্থ কি না ? এটা আমার সমস্যা হয়েছে 1. পূর্ববর্তী উত্তর আমি খুঁজে পাইনি সঙ্গে।
হিপ্পিট্রেইল

1
হ্যাঁ তাই হয়। এজন্য আমি পরিসরের প্রথম লাইনের লাইন নম্বরটি বিয়োগ করি।
লুক হার্মিটে

আহ ঠিক আছে আমি এখনও এটি পরীক্ষা করিনি কারণ আমি এমনকি
ভিমে

1
আপনি উইন্ডোসের নিচে থাকাকালীন কোডটি অনুলিপি করুন $HOME/vimfiles/plugin/whatevernameyouwish.vim। এমনকি আপনার $HOME/_vimrc(উইন্ডোজ ফাইলের নাম) যদি আপনার পছন্দ হয় (প্রথমবারের মতো)। যদি আপনি নিশ্চিত হন না যে $ :echo $HOME
হোমটি

1
এমনকি :sourceভিআইএম স্ক্রিপ্টটি সঠিক ডিরেক্টরিতে ({rtp} / প্লাগইন, অথবা ফাইল টাইপ নির্দিষ্ট প্লাগইনগুলির জন্য {rtp} / ftplugin / {filetype} / ftplugin) ইনস্টল করা থাকলেও আপনার প্রয়োজন নেই। :sourceদেড় দশকেরও বেশি আগে আমাদের কী খেলতে হয়েছিল।
লুক হার্মিটে

2

আপনি ম্যাক্রো রেকর্ড করে এটির কাছে যেতে পারেন। আপনার আসল ফাইলটি দিয়ে শুরু করে, প্রথম সংখ্যাটি সংখ্যার সাথে সংশোধন করুন।

01 Level 1:    cũng    also
Level 1:    và      and
Level 1:    như     like; such as
Level 2:    các     plural marker
Level 2:    của     belonging to

আপনার কার্সারটিতে সরান 01, এটি নির্বাচন করুন এবং এটি দিয়ে ইঙ্ক করে yiw। এখন আপনি এই বিন্দু থেকে আপনার ক্রিয়াকলাপ রেকর্ড করতে চান।

qq/^Level 1<CR>P<C-A>A<space><esc>0yiwq

  • qq কিউ রেজিস্ট্রারে ম্যাক্রো শুরু করুন
  • /^Level 1<CR> "স্তর 1" দিয়ে শুরু করে একটি লাইন অনুসন্ধান করুন
  • P কার্সারের আগে পেস্ট করুন (আপনার নম্বর রয়েছে)
  • <C-A> সংখ্যা বৃদ্ধি
  • A<space><esc> সংখ্যার পরে একটি স্থান োকান
  • 0 শুরুতে সরান
  • yiw বর্তমান সংখ্যাটি ইয়াঙ্ক করুন
  • q ম্যাক্রো শেষ করুন

তারপরে ব্যবহার করে এই ম্যাক্রোর পুনরাবৃত্তি করুন @q


1
কি <C-A>একটি + নিয়ন্ত্রণ করবে? এটি উইন্ডোজের ভিমে সমস্ত কিছু নির্বাচন করে।
হিপ্পিট্রেইল

এটি নিয়ন্ত্রণ + এ। ভিমে এটি একটি সংখ্যা বৃদ্ধি করা উচিত। আপনি যদি ভিএম অ্যাকশনগুলির পরিবর্তে উইন্ডোজ ক্রিয়া করতে আপনার কী-বাইন্ডিংগুলি পরিবর্তন করে থাকেন তবে আপনার এখানে লোকেরা পোস্ট করা বেশিরভাগ জিনিসই করতে সক্ষম হবেন না।
jecxjo

কারও অসীম জ্ঞানের কারণে উইন্ডোজের কোনও ভিম ​​সংস্করণ বিভিন্ন বাইন্ডিংয়ের সাথে আসে না। আমি কেবলমাত্র বাইরের বাইন্ডিংগুলি ভ্যানিলা ব্যবহার করছি। আমি কুড়ি বছরেরও বেশি সময় ধরে কোনও ভিম ​​কী বাঁধাই করেছিলাম না, যেটি আমি স্মরণ করতে পারি (-:
হিপ্পিট্রেইল

ঘটনাটি হওয়া উচিত নয়, আমার উইন্ডোজ ইনস্টলটিতে স্বাভাবিক ভিএম বাইন্ডিং রয়েছে। আপনি কি অন্য কারও ভিআইএম বিল্ড ইনস্টল করতে পারবেন? অথবা আপনি কি "ইজি" মোডে ভিএম চালাবেন? আমি বিশ্বাস করি উইন্ডোজগুলি সাধারণ এবং সহজ মোড বিকল্পগুলির সাথে ডেস্কটপ আইকনগুলি ইনস্টল করে।
jecxjo

3
না, কারণ উইন্ডোতে ডিফল্ট ইনস্টলটি এমএসউইন.ভিম লোড করে। আপনি যদি নিজের ভি্মিআরসি তৈরি করেন এবং এমএসউইন.ভিম লোড না করে থাকেন তবে সাধারণ ভিম বাইন্ডিংগুলি পাবেন। আমি আমার সমস্ত ইনস্টল (লিনাক্স, ম্যাক এবং উইন্ডোজ) এর জন্য একটি একক ভিআমআরসি রাখি এবং কখনই এমএসউইন.ভিমের সাথে চুক্তি করি না। এই সমস্যা দেখেছি আরো তথ্যের জন্য stackoverflow.com/questions/289681/...
jecxjo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.