আমি কীভাবে ম্যাক্রোতে সন্নিবেশ মোডের সম্পূর্ণতা ব্যবহার করতে পারি?


11

আমি একটি ম্যাক্রো সংজ্ঞায়নের চেষ্টা করছি যা দ্রুত এলোমেলো-ইশ শব্দের একটি তালিকা তৈরি করে।
আমি চাই ম্যাক্রো এটির মতো তালিকায় রূপান্তরিত করে

a
b
c
d
e

এই মধ্যে

arezzo
bywords
czars
détente
eyrie

আমার এখন পর্যন্ত যা আছে:

  • চিঠিতে কার্সার লাগান a
  • ম্যাক্রো রেকর্ডিং শুরু করুন qq
  • a সন্নিবেশ মোড প্রবেশ করুন
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letterA`
  • <C-p>সম্পূর্ণ হওয়া তালিকার শেষ আইটেমটি নির্বাচন করুন যা আমার সিস্টেমে এটি শব্দটি arezzo। (এনবি আমি longestআমার 'completeopt'সেটিংটিতে অন্তর্ভুক্ত করেছি , যা <C-p>সমাপ্তির সময় এইভাবে কাজ করা প্রয়োজন 'set completeopt=longest,menuone,preview':)।
  • <C-y> সম্পূর্ণতা গ্রহণ করুন
  • ^[^[ সন্নিবেশ মোড থেকে প্রস্থান করুন
  • j পরবর্তী লাইনে নীচে সরান, পরের লাইনে একই ক্রিয়াটি করতে প্রস্তুত to
  • q রেকর্ডিং বন্ধ করুন

আমি যখন ম্যাক্রো তৈরি করি এবং ম্যানুয়ালি পদক্ষেপগুলি অতিক্রম করি তখন সবকিছু ঠিকঠাক হয়, তবে আমি যখন ম্যাক্রো সম্পাদন করি তখন আমি কমান্ড লাইনে একটি বার্তা ফ্ল্যাশ করে দেখি যেমন:

অভিধান ফাইল স্ক্যান

এবং কিছুই ঘটে না, কেবলমাত্র ম্যাক্রোর কমান্ডগুলিই jচালিত হয়, অর্থাৎ কার্সারটি রেখাটি সরিয়ে নিয়ে যায়, তবে কোনও কমপ্লিট কমান্ড চালায় না।
ম্যাক্রোতে সন্নিবেশ মোডের পরিপূর্ণতা ব্যবহার করা কি সম্ভব এবং যদি তাই হয় তবে আমি কীভাবে এটি করতে পারি?


আমি আপনার <C-p>পদক্ষেপটি বুঝতে পারি না ... যখন আমি আমার ভিমে এটি করি তখন এটি কেবল বার্তা দেয় back at original- শেষ আইটেমটি নির্বাচন করে না .. আমি শেষ শব্দটি (আমার ক্ষেত্রে azures) নির্বাচন করতে দুবার তীরচিহ্নটি ব্যবহার করেছি , এন্টার টিপুন এবং তারপরে Esc+j+q.. এটি ম্যাক্রো কার্যকর করার ক্ষেত্রে বেশ সূক্ষ্ম কাজ করে
সন্দীপ

1
@ স্প্যাসিক আহ ভাল পয়েন্ট, আমার উল্লেখ করা উচিত ছিল, তবে আমি set completeopt=longest,menuone,previewএটির longestবিকল্পটি <C-p>অবিলম্বে প্রবেশের কারণ হিসাবে ব্যবহার করছি । আমি যদি স্ট্রিং longestথেকে অপসারণ করি তবে আমি completeoptআপনার মতো আচরণ করব। এছাড়াও, হ্যাঁ তীর কীগুলি কাজ করেছিল! ধন্যবাদ (আমি ভুলে গেছি আপনি এগুলিকে সমাপ্তির তালিকায় নেভিগেট করতে ব্যবহার করতে পারেন)
the_velour_fog

হতে পারে পপআপ-মেনু হস্তক্ষেপ করছে। সম্ভবত চেষ্টা করুন :set completeopt=এবং a<c-x><c-k><esc>jআপনার ম্যাক্রো হিসাবে।
অ্যান্টনি

@ অ্যান্টনি আমি নিশ্চিত না কেন <সিপি> কাজ করছে না, তবে দিকনির্দেশক তীর কীগুলি কাজ করেছে।
the_velour_fog

উত্তর:


2

সম্পাদনা : সত্যই আপনি অভিধান সমাপ্তির পরে; এটি করার জন্য আপনার অগত্যা .োকানো মোডের (Ctrl + X মোড) প্রয়োজন হবে না। যেমন আপনি আবিষ্কার করেছেন, এটি ম্যাক্রোগুলির সাথে কাজ করা একটি বাস্তব ব্যথা করে। নীচের স্ক্রিপ্টটি সন্নিবেশ মোড ছাড়াই অভিধানের সমাপ্তি করতে ব্যবহার করা যেতে পারে, যাতে আপনি ম্যাক্রোর ভিতরে সহজেই এটি পুনরাবৃত্তি করতে পারেন।

আপনার .vimrcফাইলে নীচের কোডটি যুক্ত করুন, নতুন ফাংশনটি উত্স করতে কোনও ভিআইএম উইন্ডোটি বন্ধ করুন এবং পুনরায় খুলুন এবং তারপরে <C-k>সম্পূর্ণরূপে কাজ jকরতে এবং পরবর্তী লাইনে নীচে নামতে পর্যায়ক্রমে নিজেকে রেকর্ড করুন । আমি longestবিকল্পটির জন্য একটি চেক যোগ করেছি এবং যদি এটি অক্ষম থাকে তবে এটি সিস্টেমের এলোমেলো সময় ব্যবহার করে এলোমেলো এন্ট্রি গ্রহণ করে। যদি এটি longestবিকল্পটি সন্ধান করে , এটি ম্যানুয়ালি অভিধান থেকে দীর্ঘতম মিলের এন্ট্রি অনুসন্ধান করে এবং এটি সন্নিবেশ করে।

আপনি যদি <C-k>ম্যাপিং পছন্দ করেন না , আপনি উপযুক্ত হিসাবে দেখুন এটি নির্দ্বিধায়। এটি আপনার পছন্দ মতো কোনও ম্যাপিংয়ের সাথে কাজ করা উচিত।

এছাড়াও, ম্যাপিংয়ের মূল্যায়নের জন্য এক্সপ্রেশনটি ফেরত পাঠানোর কমান্ডটি \<esc>শেষে একটি অক্ষর যুক্ত করে যাতে প্রতিটি সন্নিবেশের পরে আমরা সন্নিবেশ মোডটি স্বয়ংক্রিয়ভাবে ছেড়ে যাই এবং 0cwশুরুতে সন্নিবেশ মোডে প্রবেশ করার জন্য একটি সামনের দিকে এবং নিশ্চিত করে আমরা পুরো শব্দটি ওভাররাইট করে ফেলেছি সঠিকভাবে। আপনি যে সঠিক আচরণটি চান তার উপর নির্ভর করে (যদি প্রতিটি শব্দগুলির প্রথম দিকে আপনার শব্দগুলি সুন্দরভাবে না হয়) আপনি bcwপ্রকৃত শব্দ শুরু করার পরিবর্তে ব্যবহার করতে পারেন । যাইহোক, তারপরে লাইনটি শুরু করার শব্দগুলিতে ফিরে যাওয়ার সময় আপনি কিছু অদ্ভুততা দেখতে পাবেন। শেষ হওয়ার লাইনটি উপেক্ষা করার এবং উভয় একযোগে করার জন্য সম্ভবত আরও উন্নত কমান্ড রয়েছে তবে আমি একটিটি খুঁজে পেলাম না।

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

তদতিরিক্ত, বিকল্প ম্যাপিংস (উদাহরণস্বরূপ, ফাংশন পরামিতি) তৈরি করতে যুক্তিটি প্রসারিত করা এখানে কঠিন হবে না যা সন্নিবেশ মোড সরবরাহ করে এমন কোনও ফাংশন সম্পাদন করে। আমি সময় মতো এই জাতীয় প্রয়োজনীয়তাগুলির সাথে সহায়তা করতে এবং এই স্ক্রিপ্টটি আপডেট করতে পেরে খুশি হব।


এটি সমস্যাটির প্রশংসনীয় ব্যাখ্যার মতো মনে হচ্ছে তবে আমি আপনার প্রস্তাবিত উভয় সমাধানই চেষ্টা করেছিলাম এবং উভয়ই তেমন সহায়তা করেছে বলে মনে হয়নি।
ধনী

আপনি কি sleepকমান্ডটিও চেষ্টা করেছিলেন ?
টিম

হ্যাঁ, যদিও শুধুমাত্র আপনার প্রস্তাবিত মানটি 5 সেকেন্ডের সাথে। আপনি কি কাজের সমাধান পেতে পরিচালিত? আপনি পদক্ষেপের একটি সম্পূর্ণ তালিকা পোস্ট করতে পারেন?
ধনী

আমি যে ব্যক্তি প্রশ্নটি লিখেছি তা নয়। যাইহোক, আমি সমস্যাটি পুনরায় উত্পাদন করতে পারি : মন্তব্যে বর্ণিত হিসাবে আপনাকে দীর্ঘতম যোগ করতে হবে completeopt(আবার আমার দ্বারা নয়)। সম্পাদনা : ওফস, পদক্ষেপের 'longest'জন্য প্রয়োজনীয় ctrl-p: নয় ctrl-y। এখনও পদক্ষেপে আমার জন্য প্রশ্নোত্তর প্রশ্নকর্তা কাজ দ্বারা বর্ণিত vim -Nu NONEসঙ্গে completeoptসম্পাদনা করেছেন।
ধনী

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