Bir makroyu "nokta işleci" ile tekrarlayabilir miyim?


15

Makroyu .komutla tekrarlayabilir miyim ? Örneğin, aşağıdakileri yazabilmek istiyorum:

@q...

ve etkin bir şekilde @q4 kez arayın . Varsayılan davranışı ile bu 'q', örneğin tek bir komut tutan durumunda çalışır dw, xya da iHello<esc>. (Bu, mantıklıdır, çünkü '.' Son tuş vuruşlarını / komutu değil son değişikliği tekrarlar )

Ben de bu işi saymak isterim. Örneğin, şunu yazın:

3@q.

etkin bir şekilde @q6 kez koşmakla aynı olurdu . Bu davranışı nasıl yapılandırabilirim?


1
Tam olarak ne istediğini değil, ama belki de yardımcı olacaktır github.com/wincent/replay . Bu kayıtlar son olarak makro kaydetti ve basarken tekrar Enter
oynattı

FYI, @@son makroyu tekrarlar, bu yüzden bunu eşlemeler ve benzeri şeyler için soruyorsanız, sizin için çalışmalıdır.
Shahbaz

Yanıtlar:


7

Bunu bir deneyin. Daha @sonra g@(artı bir sahte hareket l) kullanılması, böylece son operatör haline gelmesi ve tekrarlamaya tabi tutulması hatırlar ..

" 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()

Düşündüğüm kadar çok köşe davasını ele almaya çalıştım. Sen tekrarlayabilirsiniz @:ile .. İçin sonraki baskılar için sayılır @veya .tutulur ..

Bu zor ve yol boyunca bir yerde bir şeyin kırılmayacağına ikna olmadım. Yani bununla ilgili hiçbir garanti, garanti veya vaat yok.

Şahsen, .son değişiklik için ince taneli tekrarlar ve makro tekrarlar arasında bir fark var @@.

DÜZENLE

Ben bu kadar ileri gitti, ben de .oynamak için bir makro kaydettikten hemen sonra basarak izin verecek bazı ek kod ekleyebilir düşündüm .

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()

Bu harika çalışıyor! Bu soruyu paylaştığımdan beri iş akışım değişti, bu yüzden makroları artık nokta ile tekrarlamak istemiyorum. Ancak, bu gerçekten iyi çalışıyor, bu yüzden yine de kabul edeceğim (muhtemelen benim eklemeyeceğim .vimrc)
James

Endişeye gerek yok, ne olursa olsun ilginç bir sorun!
Antony

1
Düzenle: bir makroyu .kayıttan hemen sonra oynatmaya izin verir .
Antony

Bence \<plug>qstopdaha önce qQStart fonksiyonunda olmalı
Steve Vermeulen

6

Son makro kullanabilirsiniz tekrarlamak için @@bu kadar 3@@esasen 3 kez @q aday olacağını. Ancak @ tuş vuruşları hantal olabilir, bu yüzden benim .vimrc satırları var:

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

Bu, son makroyu çalıştırmak için lider anahtarımı (,) artı m kullanmamı sağlar. Sonra makroyu tekrarlamak için bir sayı ile başlayabilirsiniz.

Şimdi buna 3,meşdeğerdir 3@@. Aynı toplam anahtar ve vardiya tutmaya gerek yok.

EDIT : Bunu yeniden düşününce yeni bir makro buldum. nmap <leader>. @@ Bu, bir sayıdan önce geldiğinde de çalışır, bu yüzden 3,.şimdi 3@@bir makro mektubu geçip son makro yerine bu makroyu tekrarlayabilmem için bu işi görmek isterim.


OP 6 kez 3@q.koşmak istiyor @q. Bunu yapmaz.
user41805

Sorunuzu yeniden okurken bunun cevap verdiğinden emin değilim. Ne zaman kullanacağınıza bir örnek verebilir misiniz 3@q.? Sadece bir sayı ile başa çıkabileceğiniz anlaşılıyor. Bir makroyu nbaşlatmadan önce bir arama ayarlama eğilimindeyim ve makroda yeniden oynatılabileceği yerin başına atlamak için kullanıyorum.
Shadoath

5

Bir makronun kullanımını başka bir makroya kaydedebilir ve tekrarlayabilirsiniz.

qqdwq
qr2@qq

Şimdi altı kez 3@rkoşmak gibi @q.


1

Varsayılan spaceolarak vim "zaten sağ 1 karakter taşıyın" l, bu yüzden q arabellek bir makro yeniden çalıştırmak için boşluk remapped:

noremap <Space> @q

Kullanmak için, önce bir makro kaydedin qq, kayıt işlemini durdurun qve spacetekrar oynatmak için düğmesine basın.


FYI, belirttiğiniz nedenden ötürü (zorunlu bir anahtar değildir) birçok insan alanı lider anahtarı olarak kullanır, bu nedenle düşündüğünüz kadar ücretsiz insan olmayabilir. :)
B Katmanı

0

Kullanmadığım ,ve yazması kolay bir çözüm gibi, bu benim için çalışıyor:

:map , @@
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.