গতি সহ ম্যাপিং


12

আমি কীভাবে ম্যাপিংয়ের মধ্যে পরবর্তী গতির সাথে অপারেটরটি ব্যবহার করতে পারি তা বোঝার চেষ্টা করছি। উদাহরণ স্বরূপ:

nmap /c c{here we pending for a motion}/<C-r>"<CR>

মানচিত্রে নিম্নলিখিতটি করা উচিত:

  1. cঅপারেটরকে সক্রিয় করুন এবং পরবর্তী গতির জন্য শুনুন;
  2. উদাহরণস্বরূপ, t,পরবর্তী কমা করার আগে আমি এখানে সবকিছু টাইপ করতে পারি ;
  3. কার্সার এবং কমাগুলির মধ্যে সমস্ত কিছু মুছে ফেলার সন্নিবেশ মোডে যান;
  4. মোছা পাঠ্যটি স্বয়ংক্রিয়ভাবে একটি নিদর্শন হিসাবে অনুসন্ধান করা হবে

সুতরাং এটি সহজ কথায়, মোশন পাঠ্য অপসারণের পরে, আমি মোছা পাঠ্যের হাইলাইট হওয়া ইভেন্টগুলি সহ সন্নিবেশ মোডে রেখেছি। কেউ যদি আমাকে এই মামলার ধাঁধা দিতে সহায়তা করে তবে আমি অত্যন্ত কৃতজ্ঞ হব।

হালনাগাদ

উত্তরগুলি আমি যা চাই প্রায় তা হয়। কিন্ত! আমি টিপলে /cwশব্দের পরিবর্তে কিছু টাইপ করুন, তারপরে টিপুন <Esc>। আমি পরের ঘটনাগুলির সাথে একই কাজ করার আশা করি After তবে প্রেস করার পরে n(পরবর্তী ঘটনাতে যান) এবং .(শেষ আদেশটি পুনরাবৃত্তি করুন) এটি কেবল সর্বশেষ টাইপ করা পাঠ্যটি প্রতিস্থাপনের পরিবর্তে প্রিন্ড করে। ম্যাপিংয়ের মূল লক্ষ্যটি এটি ব্যবহার করে n/Nএবং .পুনরাবৃত্তি করা। আমি কিছু মিস করেছি?

উত্তর:


9

vim অপারেটর-ম্যাপিং সমর্থন করে :h map-operator

আপনার যা প্রয়োজন তা হ'ল একটি operatorfuncএবং ম্যাপিং। আপনার প্রয়োজনের জন্য, নিম্নলিখিত কোডগুলি কাজ করে। ঠিক আছে এটি একটি উদাহরণ, আপনি আরও পরিমার্জন।

nmap  <silent> /c :set opfunc=SpecialChange<CR>g@
function! SpecialChange(type)
    silent exec 'normal! `[v`]d'    
    silent exec 'let @/=@"' 
    startinsert
endfunction

নোট করুন যে exec 'let @/=@"'কেবল বাফারে কোড হাইলাইট করার জন্য। আপনি যদি হাইলাইটটি অবিলম্বে দেখতে না চান তবে আপনি ঠিক করতে পারেনlet @/=@"


আমি আমার প্রশ্ন আপডেট করেছি। মনে হচ্ছে আপনার উত্তরটি আমার প্রয়োজনের সবচেয়ে নিকটতম, তবে পরবর্তী ঘটনাটি এটি একই রকম করে না, তাই আমি সেই মুহুর্তটি প্রশ্নের মধ্যে ব্যাখ্যা করেছি।
তৈমুর ফাযরখমানভ

আপনার কাছে দুটি অপারেটর রয়েছে ( /cএবং i) ভিমের .সবেমাত্র সর্বশেষটি পুনরাবৃত্তি করে। আপনি যদি এটি প্রসারিত করতে চান তবে repeatপ্লাগইন চেক করুন । @ টিমুরফায়জরাখমানভ এছাড়াও রয়েছে :gএবং :sআদেশও রয়েছে, আপনাকেও সহায়তা করতে পারে।
কেন্ট

"আপনার কোডে কি কোনও অদ্ভুততা আছে 'let @/=@""'? আমি ভেবেছিলাম এটি সম্ভব, উদাহরণস্বরূপ silent exec 'normal! [v ]c', কারণ cঅপারেটরটি আমার প্রত্যাশা অনুযায়ী যা করে তা বাদ দিয়ে পরিবর্তিত পাঠ্যটিকে অনুসন্ধানের ধরণে যুক্ত না করে।
তৈমুর ফাযরখমানভ

1
@ টিমুরফায়জরাখমানভ দ্য "" টাইপো .. ফিক্স .. আমিও সাথে এসেছি c, তবে এটি একটি স্থান যুক্ত করেছে, কারণ n-i-n-iআমার ধারণা মোড পরিবর্তন রয়েছে ... আপনি কিছু পরীক্ষা করবেন দেখুন।
ক্যান্ট

@TimurFayzrakhmanov আপনি এটা পরিবর্তন করে কোন প্লাগইন ছাড়া repeatable করতে পারেন dকরতে yএবং startinsertকরতে call feedkeys("cgn", 'n')(নীচের আমার উত্তর দেখুন)
জেরোম Dalbert

4

জটিল ম্যাপিংগুলি ফাংশন ব্যবহার করে কার্যকর করা (এবং ডকুমেন্ট করা) সহজ:

function! DoMagic()
   execute "normal! d".input("enter motion: ")
   let @/=@"
   startinsert
endfunction

তারপরে আপনার ম্যাপিং কলটিকে সেই ফাংশন করুন:

nmap /c :call DoMagic()<CR>

সম্পাদনা:

আপনার উদ্দেশ্য অনুসন্ধান সঞ্চালন ও স্থানগুলি বৃহৎ সংখ্যায় প্রতিস্থাপন করতে হয়, তাহলে আপনি বিকল্প কমান্ড চেষ্টা করা উচিত: :s। আপনি ভিজ্যুয়াল নির্বাচনটি অনুসন্ধানের প্যাটার্নে অনুলিপি করতে নিজের ম্যাপিং পরিবর্তন করতে পারেন:

function! DoMagic2()
   normal! gv"ay
   return @a
endfunction

vmap /c :<c-w>%s/<C-r>=DoMagic2()<CR>//gc<left><left><left>

1
এটি এমনকি একটি "দুর্দান্ত" ইউআই সহ, ওপি'র প্রয়োজনের জন্য কাজ করে এবং প্রত্যাশার চেয়ে "বেশি" হতে পারে, আপনি কী ইনপুট দেন তার উপর নির্ভর করে। উদাহরণস্বরূপ, যখন কেউ দেখেন enter motion:, তিনি দিয়েছেন: t,ggVGJZZ ^ _ command কমান্ড কনটেনটেশনের জন্য এটি একটি সাধারণ সমস্যা
ক্যান্ট

আমি প্রায় এটিই চাই। উদাহরণস্বরূপ: আমি টিপুন এবং /cwতারপরে শব্দের পরিবর্তে কিছু টাইপ করুন, তারপরে টিপুন <Esc>। পরবর্তী ঘটনাগুলির সাথে আমি একই কাজটি করতে চাই। তবে প্রেস করার পরে n(পরবর্তী ঘটনাতে যান) এবং .(শেষ আদেশটি পুনরাবৃত্তি করুন) এটি কেবল সর্বশেষ টাইপ করা পাঠ্যটি প্রতিস্থাপনের পরিবর্তে প্রিন্ড করে। ম্যাপিংয়ের মূল লক্ষ্যটি এটি ব্যবহার করে n/Nএবং .পুনরাবৃত্তি করা। আমি কিছু মিস করেছি?
তৈমুর ফাযরখমানভ

1
এই জটিলতাটি যখন আপনাকে জটিল ম্যাপিংয়ে সমস্যা হয় তখন ফাংশনগুলি ব্যবহার করার ধারণাটি স্পষ্ট করা। আপনার প্রয়োজন মেটাতে আপনার এটি পরিবর্তন করা উচিত; .পুনরায় আপনার আদেশটি পুনরায় তৈরি করতে কেন্টের পরামর্শ অনুসরণ করার চেষ্টা করুন ।
এম মন্টু

উত্তরের জন্য ধন্যবাদ. এটা খুবই দরকারী, কিন্তু আমি @Kent এর এক গ্রহণ, কারণ এটি গতি অবিলম্বে পরে আমি তাদের টাইপ (মুলতুবি ছাড়া কি <CR>থেকে input())।
তৈমুর ফয়েজরখমানভ

1
@ টিমুরফায়জরাখমানভ আপনি বিকল্পটিও দেখতে পারেন, আপডেটে বর্ণিত হয়েছে।
এম মন্টু

1

এই সমাধানটি "পুনরাবৃত্তি শেষ আদেশ" (ওরফে .) দিয়ে কাজ করে:

nmap <silent> /c :set opfunc=ChangeOccurence<CR>g@

function! ChangeOccurence(type)
  exec 'normal! `[v`]y'
  let @/ = @"
  call feedkeys('cgn', 'n')
endfunction

পুনরাবৃত্তি করার সময়, আপনাকে এমনকি ব্যবহারের প্রয়োজনও নেই n, আপনি .দ্রুত যেতে চাইলে সরাসরি সরাসরি আনতে এবং প্রতিস্থাপন করতে ব্যবহার করতে পারেন।

Allyচ্ছিকভাবে, আপনি যদি মিলে যাওয়া শব্দের হাইলাইটগুলি পছন্দ করতে চান তবে আপনি এটি 'cgn'দ্বারা প্রতিস্থাপন করতে পারেন 'n``cgn'

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