আমি কি "ডট অপারেটর" দিয়ে কোনও ম্যাক্রো পুনরাবৃত্তি করতে পারি?


15

আমি .কমান্ড দিয়ে একটি ম্যাক্রো পুনরাবৃত্তি করতে পারি ? উদাহরণস্বরূপ, আমি টাইপ করতে সক্ষম হতে চাই:

@q...

এবং কার্যকরভাবে @q4 বার কল করুন । ডিফল্ট আচরণ সঙ্গে, এই শুধুমাত্র যদি 'ফ' উদাহরণস্বরূপ একটি কমান্ডের ঝুলিতে, কাজ করে dw, xঅথবা iHello<esc>। (এটি যদিও বোঝায় যেহেতু '।' সর্বশেষ পরিবর্তন পুনরাবৃত্তি করেছে , শেষ কীস্ট্রোক / কমান্ড নয়)

আমি এই কাজ গণনা সহ করতে চাই। উদাহরণস্বরূপ, টাইপিং:

3@q.

কার্যকরভাবে @q6 বার চলমান হিসাবে একই হবে । আমি কীভাবে এই আচরণটি কনফিগার করতে পারি?


1
আপনি যা চাইছেন ঠিক তা নয়, তবে এটি github.com/wincent/replay সহায়ক হবে । এই রেকর্ডটি সর্বশেষে ম্যাক্রোটি রেকর্ড করেছে এবং Enter
টিপতে

এফওয়াইআই, @@সর্বশেষ ম্যাক্রোর পুনরাবৃত্তি করে, তাই আপনি যদি ম্যাপিংস এবং এই জাতীয় জন্য জিজ্ঞাসা করেন তবে এটি আপনার পক্ষে কাজ করা উচিত।
শাহবাজ

উত্তর:


7

একবার চেষ্টা করে দেখুন এটি পুনরুদ্ধার করে @যাতে g@(প্লাস একটি ডামি গতি l) পরে ব্যবহৃত হয়, এটি শেষ অপারেটর হয়ে ওঠার সাথে পুনরাবৃত্তি করতে পারে .

" When . repeats g@, repeat the last macro.
fun! AtRepeat(_)
    " If no count is supplied use the one saved in s:atcount.
    " Otherwise save the new count in s:atcount, so it will be
    " applied to repeats.
    let s:atcount = v:count ? v:count : s:atcount
    " feedkeys() rather than :normal allows finishing in Insert
    " mode, should the macro do that. @@ is remapped, so 'opfunc'
    " will be correct, even if the macro changes it.
    call feedkeys(s:atcount.'@@')
endfun

fun! AtSetRepeat(_)
    set opfunc=AtRepeat
endfun

" Called by g@ being invoked directly for the first time. Sets
" 'opfunc' ready for repeats with . by calling AtSetRepeat().
fun! AtInit()
    " Make sure setting 'opfunc' happens here, after initial playback
    " of the macro recording, in case 'opfunc' is set there.
    set opfunc=AtSetRepeat
    return 'g@l'
endfun

" Enable calling a function within the mapping for @
nno <expr> <plug>@init AtInit()
" A macro could, albeit unusually, end in Insert mode.
ino <expr> <plug>@init "\<c-o>".AtInit()

fun! AtReg()
    let s:atcount = v:count1
    let c = nr2char(getchar())
    return '@'.c."\<plug>@init"
endfun

nmap <expr> @ AtReg()

আমি যতগুলি কর্নার কেসগুলি ভাবতে পারি পরিচালনা করার চেষ্টা করেছি। আপনি @:সাথে পুনরাবৃত্তি করতে পারেন .। এর পরবর্তী প্রেসগুলির জন্য গণনা করা হয় @বা .ধরে রাখা হয় .

এটি কৌতূহলোদ্দীপক এবং আমি নিশ্চিত নই যে পথে কিছুটা ভেঙে যাবে না। সুতরাং এর কোনও গ্যারান্টি, ওয়্যারেন্টি বা প্রতিশ্রুতি নেই

ব্যক্তিগতভাবে, আমি .শেষ পরিবর্তনের জন্য সূক্ষ্ম দানযুক্ত পুনরাবৃত্তিগুলির এবং ম্যাক্রো পুনরাবৃত্তির মধ্যে পার্থক্য রাখছি @@

সম্পাদনা

আমি বুঝতে পেরেছি, এ পর্যন্ত চলে গিয়েছি, আমি পাশাপাশি আরও কিছু অতিরিক্ত কোড যুক্ত করতে পারি যা .ম্যাক্রোটি রেকর্ড করার পরে অবিলম্বে চাপতে দেওয়া হবে যাতে এটি আবার খেলতে পারে।

fun! QRepeat(_)
    call feedkeys('@'.s:qreg)
endfun

fun! QSetRepeat(_)
    set opfunc=QRepeat
endfun

fun! QStop()
    set opfunc=QSetRepeat
    return 'g@l'
endfun

nno <expr> <plug>qstop QStop()
ino <expr> <plug>qstop "\<c-o>".QStop()

let s:qrec = 0
fun! QStart()
    if s:qrec == 1
        let s:qrec = 0
        return "q\<plug>qstop"
    endif
    let s:qreg = nr2char(getchar())
    if s:qreg =~# '[0-9a-zA-Z"]'
        let s:qrec = 1
    endif
    return 'q'.s:qreg
endfun

nmap <expr> q QStart()

এটি দুর্দান্ত কাজ করে! এই প্রশ্নটি পোস্ট করার পরে, আমার কর্মপ্রবাহ বদলেছে, তাই আমি আর ডট দিয়ে ম্যাক্রোগুলি পুনরাবৃত্তি করতে সক্ষম হতে চাই না। যাইহোক, এটি সত্যিই ভাল কাজ করে, তাই আমি এটি যাইহোক গ্রহণ করব (যদিও আমি সম্ভবত এটি আমার সাথে যুক্ত করব না .vimrc)
জেমস

কোনও উদ্বেগ নেই, আকর্ষণীয় সমস্যা নির্বিশেষে!
অ্যান্টনি

1
সম্পাদনা করুন: .রেকর্ডিংয়ের সাথে সাথে ম্যাক্রোকে আবার খেলতে দিন ।
অ্যান্টনি

আমার মনে হয় কিউস্টার্ট ফাংশনটির \<plug>qstopআগে হওয়া উচিতq
স্টিভ ভার্মিউলেন

6

আপনার শেষ ম্যাক্রোর পুনরাবৃত্তি করতে আপনি ব্যবহার করতে পারেন @@তাই 3@@মূলত @ কিউ 3 বার চালানো হবে। তবে @ কীস্ট্রোকগুলি অযৌক্তিক হতে পারে, সুতরাং আমার .vimrc এ আমার কাছে লাইন রয়েছে:

  "- Lazy macro repeat
  nmap <leader>m @@

এটি আমাকে শেষ ম্যাক্রো চালানোর জন্য আমার লিডার কী (,) প্লাস এম ব্যবহার করতে দেয়। তারপরে আপনি ম্যাক্রোর পুনরাবৃত্তি করতে একটি সংখ্যার সাথে এর আগে চলে যেতে পারেন।

এখন 3,mএর সমতুল্য 3@@। একই মোট কী এবং শিফট ধরে রাখার দরকার নেই।

সম্পাদনা : এটি পুনর্বিবেচনা করার পরে আমি একটি নতুন ম্যাক্রো নিয়ে এসেছি। nmap <leader>. @@ এটি তখনও কাজ করে যখন কোনও সংখ্যার আগে তার কাজটি 3,.এখন 3@@এই কাজটি দেখতে পছন্দ করবে যাতে আমি একটি ম্যাক্রো চিঠিতে পাস করতে পারি এবং শেষ ম্যাক্রোর পরিবর্তে সেই ম্যাক্রো পুনরাবৃত্তি করতে পারি।


ওপি 6 বার 3@q.চালাতে চায় @q। এটি এটি করে না।
ব্যবহারকারী 41805

আপনার প্রশ্নটি পুনরায় পড়া আমি নিশ্চিত নই যে এটির উত্তর দিয়েছে। আপনি কখন ব্যবহার করবেন তার একটি উদাহরণ দিতে পারেন 3@q.? দেখে মনে হচ্ছে আপনি সম্ভবত এটি একটি গণনা দিয়ে প্রেন্ডিং করতে পারেন। আমি একটি ম্যাক্রো শুরু করার আগে একটি অনুসন্ধান সেট করার ঝোঁক পরে ম্যাক্রোটি ব্যবহার nকরে যেখানে এটি পুনরায় খেলতে পারা যায় তার শুরুতে ঝাঁপিয়ে পড়ুন।
শাদোয়াথ

5

আপনি অন্য ম্যাক্রোতে ম্যাক্রোর ব্যবহার রেকর্ড করতে পারেন এবং এটি পুনরাবৃত্তি করতে পারেন।

qqdwq
qr2@qq

এখন ছয়বার 3@rদৌড়ানোর মতো @q


1

spaceভিমে ডিফল্টরূপে "সরান ডান 1 অক্ষর" যা ইতিমধ্যে আচ্ছাদিত রয়েছে lতাই আমি কিউ বাফার থেকে ম্যাক্রোটি পুনরায় চালানোর জন্য স্থানটি পুনরায় তৈরি করেছি:

noremap <Space> @q

ব্যবহার করতে, qqপ্রথমে একটি ম্যাক্রো রেকর্ড করুন , এর সাথে রেকর্ডিং বন্ধ করুন qএবং তারপরে spaceপুনরায় খেলতে হিট করুন।


এফওয়াইআই, যে কারণে আপনি উল্লেখ করেছেন (এটি প্রয়োজনীয় কী নয়) প্রচুর লোকেরা তাদের নেতৃস্থানীয় কী হিসাবে স্থান ব্যবহার করে যাতে আপনার মনে হয় এত বেশি লোক নিখরচায় নাও থাকতে পারে। :)
বি লেয়ার

0

যেহেতু আমি ব্যবহার করি না ,এবং সমাধান সহজেই টাইপ করতে সহজ, এটি আমার পক্ষে কাজ করে:

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