আপনি নিম্নলিখিত কোড চেষ্টা করতে পারেন:
let s:option_values = {'foldmethod' : ['manual', 'indent', 'expr', 'marker', 'syntax'],
\ 'bufhidden' : ['hide', 'unload', 'delete', 'wipe'],
\ 'virtualedit' : ['block', 'insert', 'all', 'onemore'] ,}
set wildcharm=<c-z>
cnoremap <expr> <tab>
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
\ '<c-z>' :
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
function! s:SetComplete(A, L, P) abort
let option = matchstr(a:A, '^.*\ze=')
if !has_key(s:option_values, option)
return
endif
let candidates = copy(s:option_values[option])
call map(candidates, 'option . "=" . v:val')
return filter(candidates, 'v:val =~ "^" . a:A')
endfunction
এটি প্রথমে একটি অভিধান সংজ্ঞায়িত করে s:option_values
যার উদ্দেশ্য আপনার বিকল্পগুলি (এর কী হিসাবে) এবং তাদের মানগুলি (যার মান হিসাবে এটি তালিকাভুক্ত রয়েছে) ধারণ করে। এখানে, একটি উদাহরণ হিসাবে, মান +3 অপশন সঞ্চিত আছে:
'foldmethod'
, 'bufhidden'
, 'virtualedit'
।
set wildcharm=<c-z>
এই লাইনটি 'wildcharm'
বিকল্পটি নির্ধারণ করে এবং <c-z>
ভিমকে বলে যে এটি যদি ম্যাপিংয়ে দেখেন তবে অবশ্যই এটি বন্যমানু সক্রিয় করতে হবে। এই বিকল্পটি সেট না করে আপনি <tab>
যদি কোনও ম্যাপিংয়ে লিখেন তবে এটি কেবল একটি আক্ষরিক ট্যাব অক্ষর সন্নিবেশ করবে।
cnoremap <expr> <tab>
আপনি যখনই <tab>
কমান্ড-লাইনে আঘাত করবেন তখন কোনও ম্যাপিংয়ের সংজ্ঞাটি শুরু করুন যা কোনও অভিব্যক্তির মূল্যায়ন টাইপ করবে ।
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
কমান্ড-লাইনটি প্যাটার্নের সাথে মেলে তবে ম্যাপিং পরীক্ষা করে ^\s*set\s\+\w\+=
, যা ফর্ম অনুসরণ করে একটি লাইন set option=
, বা ওয়াইল্ডম্যানু সক্রিয় রয়েছে।
\ '<c-z>' :
পূর্ববর্তী পরীক্ষাটি যদি সফল হয় তবে ম্যাপিংটি ওয়াইল্ডম্যানুকে সক্রিয় করে।
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
অন্যথায়, এটি :set
কাস্টম কমান্ডের সাহায্যে সিস্টেম কমান্ডকে প্রতিস্থাপন করে :Set
এবং ওয়াইল্ডম্যানুকে সক্রিয় করে।
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
কাস্টম কমান্ডটি সংজ্ঞায়িত করুন :Set
যা একই কাজটি করে :set
, যা এখানে কাস্টম সমাপ্তির ফাংশন ব্যবহার করতে পারে তা বাদ দিয়ে s:SetComplete()
।
function! s:SetComplete(A, L, P) abort
কাস্টম সমাপ্তির ফাংশনটির সংজ্ঞা শুরু করুন।
এটি অবশ্যই একটি তালিকার মাধ্যমে পরামর্শ / প্রার্থীদের ফেরত দিতে হবে। কমান্ড স্বয়ংক্রিয়ভাবে 3 আর্গুমেন্ট পাঠাতে হবে:
:Set
- আর্গুমেন্টের শীর্ষস্থানীয় অংশটি বর্তমানে (যেমন
option=...
) শেষ হচ্ছে
- পুরো কমান্ড লাইন
- এটিতে কার্সার অবস্থান
দেখুন :h :command-completion-customlist
আরও তথ্যের জন্য।
let option = matchstr(a:A, '^.*\ze=')
আর্গুমেন্টটি সম্পন্ন হওয়ার পরে বিকল্পটির নামটি বের করুন।
if !has_key(s:option_values, option)
return
endif
option
আপনার অভিধানে আছে কিনা তা পরীক্ষা করুন । যদি এটি না হয় তবে ফাংশনটি কোনও কিছুই ফেরায় না।
let candidates = copy(s:option_values[option])
বিকল্পটি আপনার অভিধান থেকে বিকল্পগুলি নিতে পারে এমন তালিকার একটি অনুলিপি পান।
call map(candidates, 'option . "=" . v:val')
তালিকার প্রতিটি মানের জন্য candidates
, স্ট্রিংটি পূর্ববর্তী করুন option=
(যেখানে option
মূল্যায়ন করা হবে)।
return filter(candidates, 'v:val =~ "^" . a:A')
candidates
যার শুরু থেকে আইটেমগুলি সরান তর্কটি সম্পূর্ণ হওয়ার সাথে মেলে না এবং ফলাফলটি ফেরত দিন।