সেমিডলাইনে বিকল্প মানগুলির জন্য স্বয়ংক্রিয় সমাপ্তি


10

আমি এটি করার জন্য যতবার চেষ্টা করেছি তা গণনা করতে পারি না:

:set foldmethod=syn^I

দেখে মনে হচ্ছে সমাপ্তি বিকল্পের মানগুলিতে কাজ করে না!

কিছু ক্ষেত্রে বিকল্পগুলি জটিল স্ট্রিং যেখানে সমাপ্তিটি বুদ্ধিমান হতে পারে। (উদা 'comments'।)

তবে সাধারণ ব্যবহারের ক্ষেত্রে ওয়াইল্ডচার-সম্পূর্ণকরণের জন্য কি কোনও প্রচেষ্টা হয়েছে?

যদি তা না হয় তবে আমি কীভাবে উপরের উদাহরণটি তৈরি করতে পারি? (ধরে নিলাম আমি একটি স্ট্রিংয়ের মধ্যে সম্পূর্ণ করতে চেয়েছি ['manual', 'indent', 'expr', 'marker', 'syntax']))

উত্তর:


3

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

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যার শুরু থেকে আইটেমগুলি সরান তর্কটি সম্পূর্ণ হওয়ার সাথে মেলে না এবং ফলাফলটি ফেরত দিন।


2

আফাইক, আমরা বিল্টিন কমান্ডগুলি সরবরাহ করে না সেগুলিতে সেমিডলাইন-সমাপ্তি যুক্ত করতে পারি না। হয় আমরা কমান্ডটিকে অন্য একটির সাথে "ওভাররাইড" করব যা সম্পূর্ণরূপে সমর্থন করবে (এখানে, আপনি :Setএকটি মূলধন দিয়ে সংজ্ঞা দিতে পারেন S), অথবা আমরা কী অনুপস্থিত তা যুক্ত করতে ভিএম উত্স কোডটিতে হ্যাক করব।

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