নম্বরযুক্ত তালিকার সাথে ধারাবাহিকের বুলেট পয়েন্টগুলির একটি সিরিজ প্রতিস্থাপন করুন


16

আমার নীচের পাঠ্যটি কল্পনা করুন:

some random stuff
* asdf
* foo
* bar
some other random stuff

আমি সংখ্যার সাথে তারকাচিহ্ন বুলেটগুলি প্রতিস্থাপন করতে চাই:

some random stuff
1. asdf
2. foo
3. bar
some other random stuff

কীভাবে এটি ভিমে করা যায়?


আপনি প্লাগইন কেন যান না? অনুরূপ একটি
গিথুব-

এটি এত আশ্চর্যজনক এবং দুর্দান্ত যে প্রত্যেকে তাদের উত্তরগুলি সংখ্যা বাড়িয়ে দিয়েছে কিন্তু যেহেতু মার্কডাউন আপনার জন্য তাদের নম্বর দেবে কেন কেবল সেগুলিই তৈরি করে না 1.? সুতরাং :%s/^* /1. /এটি করতে হবে। এটি অনেক কম কাজের মতো মনে হচ্ছে।
ছানা

উত্তর:


14

আপনি নিম্নলিখিত আদেশটি চেষ্টা করতে পারেন:

:let c=0 | g/^* /let c+=1 | s//\=c.'. '

প্রথমে এটি পরিবর্তনশীল c( let c=0) আরম্ভ করে , তারপরে এটি বৈশ্বিক কমান্ড কার্যকর করে gযা প্যাটার্নটি দেখায় ^*(রেখার সূচনা, তারপরে একটি তারকাচিহ্ন এবং একটি স্থান)।

যখনই এই প্যাটার্ন সম্বলিত একটি লাইন পাওয়া যায়, বিশ্বব্যাপী কমান্ড কমান্ড executes:
let c+=1 | s//\=c.'. '
এটা পরিবর্তনশীল বৃদ্ধি c( let c+=1), তারপর ( |) এটিকে পরিপূরক ( s) পূর্ববর্তী ধরণ (অনুসন্ধান //একটি অভিব্যক্তি (মূল্যায়ন সহ) \=):
পরিবর্তনশীল বিষয়বস্তু cঘনিভূত ( .) স্ট্রিং সহ'. '


আপনি যদি নিজের বাফার থেকে সমস্ত লাইন পরিবর্তন করতে না চান তবে কেবল একটি নির্দিষ্ট অনুচ্ছেদে, আপনি বিশ্বব্যাপী কমান্ডের মধ্যে একটি পরিসীমা দিতে পারেন। উদাহরণস্বরূপ, কেবলমাত্র লাইনগুলি সংশোধন করতে যাদের সংখ্যা 5 এবং 10 এর মধ্যে রয়েছে:

:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '

আপনার যদি রূপান্তর করতে চান এমন বেশ কয়েকটি অনুরূপ তালিকাগুলি সমন্বিত একটি ফাইল থাকে তবে উদাহরণস্বরূপ এই জাতীয় কিছু:

some random stuff                 some random stuff                      
* foo                             1. foo                                 
* bar                             2. bar                                 
* baz                             3. baz                                 
some other random stuff           some other random stuff                
                           ==>                                                
some random stuff                 some random stuff                      
* foo                             1. foo                                 
* bar                             2. bar                                 
* baz                             3. baz                                 
* qux                             4. qux                                 
some other random stuff           some other random stuff                

আপনি নিম্নলিখিত কমান্ড দিয়ে এটি করতে পারেন:

:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '

এটি পূর্ববর্তী কমান্ডের কেবল একটি বৈকল্পিক, যা cআপনি যখন অন্য তালিকায় স্যুইচ করেন তখন চলকটি পুনরায় সেট করে । আপনি অন্য তালিকায় আছেন কিনা তা সনাক্ত করতে, চলকটি dসর্বশেষ লাইনের নম্বর সংরক্ষণ করতে ব্যবহৃত হয় যেখানে প্রতিস্থাপন করা হয়েছিল।
গ্লোবাল কমান্ড বর্তমান লাইন নম্বর ( line('.')) এর সাথে তুলনা করে d+1। যদি সেগুলি একই হয় তবে এর অর্থ আমরা আগের cতুলনায় একই তালিকাতে রয়েছি যেমন বাড়ানো ( c+1), অন্যথায় এর অর্থ আমরা পৃথক তালিকায় আছি, তাই cপুনরায় সেট করা ( 1)।

কোনও ফাংশনের অভ্যন্তরে, কমান্ডটি let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]এভাবে পুনরায় লেখা যেতে পারে:

let c = line('.') == d+1 ? c+1 : 1
let d = line('.')

বা এই মত:

if line('.') == d+1
    let c = c+1
else
    let c = 1
endif
let d = line('.')

কিছু কীস্ট্রোক সংরক্ষণ করতে, আপনি কাস্টম কমান্ডটিও সংজ্ঞায়িত করতে পারেন :NumberedLists, এটি এমন একটি পরিসীমা গ্রহণ করে যার ডিফল্ট মান 1,$( -range=%):

command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '

কখন :NumberedListsকার্যকর করা হবে <line1>এবং <line2>আপনি ব্যবহৃত ব্যাপ্তির সাথে স্বয়ংক্রিয়ভাবে প্রতিস্থাপন করা হবে।

সুতরাং, বাফারে সমস্ত তালিকা রূপান্তর করতে, আপনি টাইপ করতে পারেন: :NumberedLists

10 এবং 20 লাইনের মধ্যে কেবল তালিকা: :10,20NumberedLists

শুধুমাত্র চাক্ষুষ নির্বাচন: :'<,'>NumberedLists


আরও তথ্যের জন্য, দেখুন:

:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity    (section list unpack)
:help expr1
:help :command

9

এটি কেবলমাত্র একটি সাম্প্রতিক ভিম সংস্করণ (যা রয়েছে :h v_g_CTRL-A) নিয়ে কাজ করে:

  1. তালিকা বুলেট (অবরোধ নির্বাচন *) এবং তাদের সঙ্গে প্রতিস্থাপন 0(কার্সার প্রথম চালু থাকে *): Ctrl-v j j r 0
  2. কাউন্টার সহ পূর্ববর্তী ব্লক এবং ইনক্রিমেন্ট পুনরায় নির্ধারণ করুন :gv g Ctrl-a

... এবং এটাই :)


(আপনি যদি প্রতিটি সংখ্যার পরে বিন্দু পেতে চান তবে প্রথম পদক্ষেপটি এতে পরিবর্তন করুন Ctrl-v j j s 0 . Esc:)


9

দৃষ্টিভঙ্গিটি লাইনগুলি নির্বাচন করুন এবং এই প্রতিস্থাপন আদেশটি কার্যকর করুন:

:'<,'>s/*/\=line('.') - line("'<") + 1 . '.'

দেখুন :help sub-replace-expression, :help line()এবং :help '<

লাইনগুলি নির্বাচন না করা, অফসেটের সাহায্যে পশ্চাদপদ এবং অগ্রবর্তী অনুসন্ধানগুলি এর পরিবর্তে বিকল্প সীমাটি নির্দিষ্ট করতে ব্যবহার করা যেতে পারে:

:?^[^*]?+1,/^[^*]/-1s/*/\=line('.') - search('^[^[:digit:]]', 'bn') . '.'

দেখা :help cmdline-ranges


2

অন্য উপায়:

:let n = 1 | g/^* /s//\=printf('%d. ', n)/g | let n = n + 1

0

আপনি কাস্টম অপারেটর সংজ্ঞায়িত করতে পারে

আপনি এগুলি মূল সিকোয়েন্সগুলিতে '*এবং ম্যাপ করতে পারেন '#। চিহ্নগুলি *এবং #অস্তিত্ব নেই, সুতরাং আপনি কোনও ডিফল্ট কার্যকারিতা ওভাররাইড করবেন না। 'উপসর্গ হিসাবে বেছে নেওয়ার কারণটি হ'ল এক ধরণের স্মৃতিবিজ্ঞান পাওয়া। আপনি কয়েকটি লাইনের সামনে একটি চিহ্ন / চিহ্ন যুক্ত করছেন। এবং সাধারণত কোনও চিহ্নে যেতে আপনি উপসর্গটি ব্যবহার করেন '

fu! s:op_list_bullet(...) abort range

    if a:0
        let [lnum1, lnum2] = [line("'["), line("']")]
    else
        let [lnum1, lnum2] = [line("'<"), line("'>")]
    endif

    if !empty(matchstr(getline(lnum1), '^\s*\d\s*\.'))
        let pattern     = '\d\s*\.\s\?'
        let replacement = '* '

    elseif count(['-', '*'], matchstr(getline(lnum1), '\S'))
        let pattern     = '\v\S\s*'
        let replacement = ''

    else
        let pattern     = '\v\ze\S'
        let replacement = '* '
    endif

    let cmd = 'keepj keepp %s,%s s/%s/%s'

    sil exe printf(cmd, lnum1, lnum2, pattern, replacement)
endfu

fu! s:op_list_digit(...) abort range
    let l:c = 0

    if a:0
        let [lnum1, lnum2] = [line("'["), line("']")]
    else
        let [lnum1, lnum2] = [a:firstline, a:lastline]
    endif

    if count(['-', '*'], matchstr(getline(lnum1), '\S'))
        let pattern     = '\S\s*'
        let replacement = '\=l:c.". "'

    elseif !empty(matchstr(getline(lnum1), '^\s*\d\s*\.'))
        let pattern     = '\d\s*\.\s\?'
        let replacement = ''

    else
        let pattern     = '\v^\s*\zs\ze\S'
        let replacement = '\=l:c.". "'
    endif

    let cmd = 'keepj keepp %s,%s g/%s/let l:c = line(".") == line("'']")+1 ?
                                                \ l:c+1 : 1 |
                                                \ keepj keepp s/%s/%s'

    sil exe printf(cmd, lnum1, lnum2, pattern, pattern, replacement)
endfu

nno <silent> '*     :<C-U>set opfunc=<SID>op_list_bullet<CR>g@
nno <silent> '**    :<C-U>set opfunc=<SID>op_list_bullet
                    \<Bar>exe 'norm! ' . v:count1 . 'g@_'<CR>
xno <silent> '*     :call <SID>op_list_bullet()<CR>

nno <silent> '#     :<C-U>set opfunc=<SID>op_list_digit<CR>g@
nno <silent> '##    :<C-U>set opfunc=<SID>op_list_digit
                    \<Bar>exe 'norm! ' . v:count1 . 'g@_'<CR>
xno <silent> '#     :call <SID>op_list_digit()<CR>

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

উদাহরণস্বরূপ, আপনি আঘাতের দ্বারা বর্তমান অনুচ্ছেদের অভ্যন্তরে তারকাচিহ্ন বা বিয়োগ চিহ্ন সহ উপস্থাপিত একটি তালিকা টগল করতে পারেন '*ip। এখানে, '*একটি অপারেটর এবং ipএটি পাঠ্য-অবজেক্ট যা এটি কাজ করে।

এবং হিট করে পরবর্তী 10 টি লাইন জুড়ে সংখ্যার সাথে উপরিযুক্ত একটি তালিকার জন্য একই কাজ করুন '#10j। এখানে, '#অন্য অপারেটর এবং 10jঅপারেটর কাজ করে এমন রেখাগুলি coveringেকে রাখার একটি গতি।

কাস্টম অপারেটর ব্যবহারের অন্য সুবিধাটি হ'ল আপনি ডট কমান্ড দিয়ে আপনার শেষ সংস্করণটি পুনরাবৃত্তি করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন

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