আমি কি সর্বশেষ ইউআই কমান্ডটি পুনরাবৃত্তি করতে পারি?


17

আমি জানি যে আমি .শেষ সম্পাদনা কমান্ডটি পুনরাবৃত্তি করতে ব্যবহার করতে পারি ।

সর্বশেষ ইউআই ম্যানিপুলেশন কমান্ডটির পুনরাবৃত্তি করার কোনও উপায় আছে? উদাহরণস্বরূপ, আমি 10<C-W>-দশ সারি দ্বারা একটি উইন্ডো সঙ্কুচিত করতে লিখতে পারি । এই কমান্ডটি আরও সংকুচিত করতে চাইলে সহজেই এই আদেশটি পুনরাবৃত্তি করতে ⟨কিছু কী press টিপতে সক্ষম হতে পেরে ভাল লাগবে।


সম্পর্কিত: stackoverflow.com/q/6952636/2072269 (কোনও উত্তর দেওয়া হয়নি যা ইতিমধ্যে আপনি পুনরায় আকার দেওয়ার পরে ব্যবহার করতে পারবেন )।
muru

@ মুরু: দুর্দান্ত, তবে এটি এই নির্দিষ্ট ক্ষেত্রে। আমি যদি এরকম কিছু করে থাকি fzতবে 10;? কি হবে :tabm +1? এই সব কি বিশেষ ক্ষেত্রেযুক্ত হতে চলেছে?
wchargin

আমার মনে হয় আপনি আমাকে ভুল বুঝেছেন। আমি বলছি লিঙ্কযুক্ত পোস্টটির অকেজো উত্তর রয়েছে (অন্য কেউ এসে পরামর্শ দেওয়ার আগে)।
মুরু

উহু! ঠিক আছে, তারপরে আমরা একই পৃষ্ঠায় @ muru :)
wchargin

উত্তর:


12

ডট কমান্ডটি .কাজ করে কারণ ভিফ বাফার সামগ্রীগুলি পরিবর্তন করে এমন কমান্ডগুলির "ট্র্যাক রাখে"। আপনি যদি চালনা করেন তবে আপনি :echo b:changedtickএটি দেখতে পাবেন বর্তমান বাফারের প্রতিটি পরিবর্তনের সাথে বাড়ানো।

তবে ভিম সম্পাদনা-বিহীন কমান্ডগুলির "ট্র্যাক রাখুন"। সুতরাং, না, আপনি যা চাইছেন তা করা যাবে না।


8

ডিফল্টরূপে ভিএম-তে এটি করার কোনও উপায় নেই কারণ ভিআইএম পূর্ব নির্বাহিত উইনসিএমডি ট্র্যাক করে না। তবে কিছু চালাক ম্যাপিংয়ের মাধ্যমে এটি করা সম্ভব:

function! s:Wincmd(count, key)
    " If count is not zero, use the original count.  If otherwise, don't
    " include a count.
    let if_count = a:count ? a:count : ""
    " This builds a wincmd from the given key, and saves it so
    " it can be repeated.
    let g:last_wincmd = "wincmd " . nr2char(a:key)
    " Execute the built wincmd
    execute if_count . g:last_wincmd
endfunction

function! s:WincmdRepeat(count)
    " If no wincmd has been executed yet, don't do anything
    if !exists('g:last_wincmd') | return | endif
    " If a count is given, repeat the last wincmd that amount of times.
    " If otherwise, just repeat once.
    let if_count = a:count ? a:count : ""
    execute if_count . g:last_wincmd
endfunction

" Overwrite the default <C-w> mapping so that the last wincmd can be kept
" track of.  The getchar function is what captures the key pressed
" directly afterwards.  The <C-u> is to remove any cmdline range that vim
" automatically inserted.
nnoremap <silent> <C-w> :<C-u>call <SID>Wincmd(v:count, getchar())<CR>

" This just calls the function which repeats the previous wincmd.  It
" does accept a count, which is the number of times it should repeat the
" previous wincmd.  You can also replace Q with whatever key you want. 
nnoremap <silent> Q :<C-u> call <SID>WincmdRepeat(v:count)<CR>

মনে রাখবেন যে আপনার কাছে এমন কোনও ম্যাপিং রয়েছে যা ব্যবহার করে <C-w>সেগুলি কেবল তখনই পুনরাবৃত্তি করতে পারে যদি সেগুলি noreবিভিন্ন না হয়। ব্যবহার করে জারি করা কোনও উইনসিএমডি :wincmdপুনরাবৃত্তি হবে না। এছাড়াও, যে কোনও উইনসিএমডিতে একাধিক অক্ষর রয়েছে সেগুলি সম্পাদন করা যাবে না (যেমন <C-w>gf)

প্রাসঙ্গিক সহায়তা বিষয়

  • :help v:count
  • :help getchar()
  • :help nr2char()
  • :help expr1
  • :help :wincmd
  • :help :execute
  • :help :for
  • :help :map-<silent>
  • :help c_CTRL-U
  • :help <SID>

1
এটি দুর্দান্ত, এবং ভাল-লিখিত ভিমস্ক্রিপ্টের একটি দুর্দান্ত উদাহরণ! কিছু নাবালক (সম্ভবত পিক) প্রতিক্রিয়া: এই পুনরাবৃত্তি আদেশটি বিল্ট-ইন .একটি গণনাতে আচরণ করার পদ্ধতি থেকে আলাদা আচরণ করবে । যখন একটি গণনা সরবরাহ করা হয় ., পূর্ববর্তী গণনা উপেক্ষা করা হয়। সুতরাং 2ddদ্বারা অনুসরণ 3.2 লাইন এবং তারপর 3 লাইন মুছে ফেলতে করবে; বিপরীতে, আপনার ম্যাপিং সঙ্গে, 2<C-w>-দ্বারা অনুসরণ 3Q6 (= 2x3) লাইন দ্বারা 2 লাইন দ্বারা উইন্ডোর সঙ্কুচিত এবং তারপর হবে। এই আচরণটি ভাল, তবে একটি কাস্টম কমান্ড কীভাবে আচরণ করা উচিত তা চয়ন করার সময় এটি অন্তর্নির্মিত অন্তর্নির্মিত ভিম কমান্ডগুলি থেকে আঁকতে খুব ভাল।
tommcdo

ধন্যবাদ! এছাড়াও, আমি দেখছি আপনি কীভাবে গণনা কাজ করে তার অর্থ। আমি এটি পরিবর্তন করতে পারি তাই এটি সেভাবে কাজ করে।
চিরসবুজ

4

Submode প্লাগইন এই সঙ্গে সাহায্য করতে পারেন। আপনি টাইপ করে প্রবেশ করা একটি "সাবমোড" সংজ্ঞায়িত করতে পারেন <C-W>-, যেখানে আপনি উইন্ডোটির আকার পরিবর্তন করতে চালিয়ে যাওয়ার জন্য সংজ্ঞায়িত করেছেন -(এবং সম্ভবত +)।


2

রেপমো.ভিম ("পুনরাবৃত্ত গতি") নামে আর একটি প্লাগইন রয়েছে যা আপনি যা করতে পারেন তা করতে পারেন।

তবে আপনাকে কোন গতিগুলি (বা সাধারণ ক্রিয়াগুলি) আপনি পুনরাবৃত্তি করতে চান তা নির্দিষ্ট করতে হবে। খনি বর্তমানে এইভাবে কনফিগার করা হয়েছে:

let g:repmo_mapmotions = "j|k h|l zh|zl g;|g, <C-w>w|<C-w>W"
let g:repmo_mapmotions .= " <C-w>+|<C-w>- <C-w>>|<C-w><"
let g:repmo_key = ";" 
let g:repmo_revkey = "," 

তাই করার পরে 5 CTRL-W +আমি ;এটির মতো বহুবার পুনরাবৃত্তি করতে আঘাত করতে পারি ।

প্লাগইন নির্দিষ্ট প্রতিটি কি জন্য ম্যাপিং তৈরি করে কাজ করে।

কখন fবা tব্যবহৃত হয়, ;এবং ,ম্যাপিংগুলি তাদের ডিফল্ট আচরণে ফিরে যায়।

g;পূর্ববর্তী সম্পাদনা বিন্দুতে ফিরে আসার জন্য আমি ম্যাপিংটি বিশেষত দরকারী findg; ; ; ;


@ এলবফান আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি, তবে আমার পক্ষে ,অবিলম্বে 5,কাজগুলি করা এবং প্রত্যাশার মতো কাজ করে। আপনি আপনার সেট করেছেন এটা কি সম্ভব mapleaderকরতে ,?
জোয়েটউইডল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.