ভিম - আমি কোনও ফাংশন না লিখে একাধিক আরগ কাস্টম কমান্ডে পাস করতে পারি?


1

আমি আমার .vimrc ফাইলে নিম্নলিখিত কাস্টম কমান্ডটি লিখেছি:

command! -nargs=+ Sub :%s/<args>/g

এটি আমাকে একটি শব্দের পরিবর্তে অন্য শব্দের পরিবর্তনের অনুমতি দেয় এবং এভাবেই মৃত্যুদন্ড কার্যকর করা হয়:

:Sub <word>/<new word>

আমি একাধিক আরগ দিয়ে কমান্ড লিখতে পছন্দ করব:

:Sub <word> <new word>

আমি একাধিক যুক্তি গ্রহণ করতে আদেশটি পুনরায় লিখতে সক্ষম?

আদর্শভাবে আমি এই জাতীয় কিছু চাই:

command! -nargs=+ Sub :%s/<arg1>/<arg2>/g

তুমাকে অগ্রিম ধন্যবাদ.

উত্তর:


1

পার্সিংটি নিজেই করুন

আপনি যদি ব্যবহার করেন তবে আপনি :help <q-args>একটি উদ্ধৃত স্ট্রিং পাবেন যা আপনি split()দুটি স্থান-বিভাজিত অংশগুলিতে করতে পারেন :

command! -nargs=+ Sub execute '%substitute/' . split(<q-args>, ' ')[0] . '/' . split(<q-args>, ' ')[1] . '/g'

আমরা কিছুটা বিপাক ( call()) এবং এর মাধ্যমে দুবার পার্সিং এড়াতে পারি printf():

command! -nargs=+ Sub execute call('printf', ['%%substitute/%s/%s/g'] + split(<q-args>, ' '))

এটি কাজ করে, তবে ত্রুটি সামলানো এখনও ভাল নয় (যদি আপনি কেবল একটি আর্গ পাস করেন তবে এটি অভিযোগ করবে E766: Insufficient arguments for printf())। আপনি একটিতে কোডটি বের করে আরও নিয়ন্ত্রণ পাবেন :function

ভিম যুক্তি পার্স করতে পারে

একটি পৃথক :functionবিম আপনার মাধ্যমে যুক্তির পক্ষে যুক্তি পার্সিংও করতে দেয় :help <f-args>

command! -nargs=+ Sub call Sub(<f-args>)
function! Sub( ... )
    execute printf('%%substitute/%s/%s/g', a:1, a:2)
endfunction

একটি ফাংশন সহ, আপনি সহজেই আর্গুমেন্টের সঠিক সংখ্যাটি পরীক্ষা করতে পারেন:

function! Sub( ... )
    if a:0 != 2
        echo "Need two arguments"
        return
    endif
    ...

একটি ফাংশনের খারাপ দিকটি হ'ল ত্রুটিগুলি (যেমন প্যাটার্নটি মেলে না, বাফার পরিবর্তনযোগ্য নয়) বহু-লাইন, বন্ধুত্বপূর্ণ ত্রুটি বার্তা তৈরি করে। try...catchএকটি দুর্দান্ত, একক-লাইন ত্রুটি বার্তা প্রাপ্ত করতে ব্যবহার করতে হবে।

বোনাস: সেখান থেকে কোথায় নিয়ে যেতে হবে

  • আপনি যেমন :sব্যবহারকারীর কাছ থেকে কমান্ডটি (এবং ব্যবহৃত ডিলিমিটারগুলি) গোপন করছেন , তখন আমি মনে করি এটির ডিলিমিটরদের পালানোর প্রয়োজন হবে না। / এর escape(a:1, '/')পরিবর্তে ব্যবহার করুন ।a:1a:2
  • এর সাহায্যে :help :command-rangeআপনি এখনও পুরো বাফারে কাজ করতে কমান্ডটি ডিফল্ট করতে পারেন, তবে অন্যান্য রেঞ্জগুলিও অতিক্রম করতে পারবেন।

কমান্ডটি সত্যই তার ওজন টানছে কিনা তাও বিবেচনা করুন। ব্যবহৃত পার্সিং নির্বিশেষে, আর্গুমেন্টগুলিতে সাদা স্থান সমস্যাযুক্ত, মূলটি এমনটি :sনয় down কেবলমাত্র আমি দেখতে পাচ্ছি যে এটি টাইপ করা কিছুটা সহজ তবে ম্যাপিং (গুলি) এর মাধ্যমে এটিও অর্জন করা যেতে পারে যা কমান্ড-লাইনের একটি অসম্পূর্ণ :sকমান্ডটি পূর্বে পূরণ করে এবং কার্সারটিকে ঠিক মাঝখানে অবস্থান করে।

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