Metin bir kayıttan rasgele sayıdaki kayıtlara nasıl taşınır?


10

Bir kayıttan başka bir kayıt defterine veya kayıt kümesine metin 'bağlamanın' bir yolu var mı? Örneğin, üzerinden "qkayıtlara gidin ."1"5

Sıklıkla aynı makronun biraz farklı sürümlerini oluşturmak isterim, bu nedenle bir 'şablon' makrosu birkaç kayıt defterine kopyalamak ve her birini yerinde değiştirmek yararlıdır.

Pratik bir örnek vermek gerekirse, bu soruyu bana yönelten sorun.

Bir donanım açıklama dilinden aşağıdaki satırı birçok tekrarlanan bloğa çevirmem gerekiyor,

RAM64(in=in, load=load0, address=address[0..5], out=out1);

için

RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);

Ben yypW^At)^Akayıt defterinde saklanan artış işlevini kullanarak, bunu gerçekleştiren bir makro var "a.

Bazen, biraz farklı olması için artım modeline ihtiyacım var, örneğin

RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);

kayıttaki makronun nerede "bolacağı yypW^At)^A^A.

Bunu yapmak için bir kayıt istiyorum, ancak 1-5 her artış için. Kayıt "a(bir şekilde) b'den e'ye kadar olan kayıtlara kopyalanabilir. Sonra her bir kayıt arabelleğe yapıştırın, gerekli değişikliği yapın (daha fazla terim ekleyin, thareketi izleyen karakteri değiştirin vb.) Ve değiştirilen ifadeyi tekrar kayıt defterine çekeceğim. İdeal olarak, bu son adım, kayıtların kopyalanması için komutlara dahil edilebilir

Bu beni makroda değişiklik gerektirmeyen tüm karakterleri tekrarlamaktan kurtarır. Örneğim için bu önemsiz olabilir, ancak sorduğum şeyi yapmanın çok yararlı olabileceği zamanları tahmin edebilirim.


5
Bir kenara, numaralandırılmış kayıtları kullanmanızı tavsiye etmem. Tek "güvenli" kayıtlar alfabetik kayıtlardır. Diğer tüm kayıtlar Vim tarafından otomatik olarak ayarlanır.
jamessan

Yanıtlar:


7

Makrolar sadece metindir.

Yeni bir boş arabellek açın ve makronuzu oraya koyun. Çizgileri çoğaltabilir, burada bir şeyi ve başka bir yerde başka bir şeyi değiştirebilir, ardından bir satırı çekebilir ve hemen kullanabilirsiniz @".

Kayıtlarınızı, özellikle de tamamen farklı bir amaca hizmet eden sayı kayıtlarını kirletmenize gerek yoktur.

-- Düzenle --

Bazı açıklamalar eklediğinize göre sorunuzun anlaşılması daha kolay.

Görünen o ki, ilk kayıtlarınızı hedefinize ulaşmak için, değişkenler gibi kayıtlarla oynatmadan değiştirmeniz yeterlidir:

:let i = 1                     " define variable i
qa                             " start recording in register a
yy                             " yank the line
p                              " paste it
W                              " move to next WORD
<C-v><C-a>                     " increment number
t)                             " jump to the other number to increment
:norm <C-r>=i<CR><C-v><C-a>    " increment the number by i
q                              " stop recording

Geçerli satırın son kopyasını 2 artarak 5 kopya oluşturmak için:

:let i = 2|norm 5@a

veya 12 kopya, son sayı 23 arttırılır:

:let i = 23|norm 12@a

Sayısal kayıtlar konusunda anlaştılar - ama bunu bir komutta kullanmak istiyorsanız ve aynı başlayan ancak farklı hale gelen kayıtlara ihtiyacınız varsa ne olacak?
wchargin

@WChargin, lütfen açıklayın.
romainl

Olduğu gibi, belki de eğer öyleyse, bir dizenin döndürülmüş kopyaları ile bir şeyler yapmak istiyorum abcdeiçindedir @qsonra istediğim, @x="bcdea", @y="abcde", ve @z="eabcd". Ben sağlayarak başlayabilir @x, @yve @ztüm eşit @qgerektiğinde onları değiştirerek sonra ve. Açıkçası, ben bunu uydurdum, ama benzer bir şeyin yararlı olabileceği bazı durumlar olabilir gibi görünüyor .
wchargin

2
@Kit, sorunuzun hemen XY gibi kokmasına neden olan pratik örneğin eksikliğinden biraz endişeliyim. Kayıtları kötüye kullandığınızdan neredeyse eminim, bu yüzden yapmaya çalıştığınız şeyin açıklamasını okumak isterim.
romainl

1
@Kit, bu XY problem qustions ile ilgili birçok sorundan biri. En çok oylanan cevap, sorunuza yüksek kaliteli doğrudan bir cevaptır, ancak gerçek probleminiz bağlamında sonuç olarak işe yaramazken, daha az oylanan cevabım altta yatan probleminize gerçek bir çözümdür. Her iki cevap da doğrudur, ancak farklı soruları yanıtlarlar, bu da karar vermenizi zorlaştırır. Eğer ben olsaydım, temel sorunumla ilgili yanıtı kabul ederdim… ama bu sadece benim.
romainl

6

kullanılması getregvesetreg

'Den qkayıtlara kopyalamak için 1- 5:

let src=getreg('q', 1)
for i in range(1, 5)
    call setreg(i, src)
endfor

Daha genel bir listeye kopyalamak için:

let src=getreg('q', 1)
for i in ['a', 'c', 'e']
    call setreg(i, src)
endfor

kullanma execute

'Den qkayıtlara kopyalamak için 1- 5:

for i in range(1, 5)
   execute 'let @' . i . '=@a'
endfor

Daha genel bir listeye kopyalamak için:

for i in ['a', 'c', 'e']
    execute 'let @' . i . '=@a'
endfor

Açıklama. Bu komut let, let @x=@ykayıt ydefterini kaydedilecek kopyalar olarak kullanılabilir x. Esasen, bu komutları sadece bir döngüde oluşturuyoruz ( xyukarıdaki formdaki değerini değiştiriyoruz ) ve executeonları kullanıyoruz.


1
Burada kullanmaya gerek :exeyok. getreg()Ve setreg()işlevleri temizleyici olurdu.
jamessan

@jamessan Güzel bir öneri, teşekkürler — bunları doğru kullanıyor muyum?
wchargin

Ben bunu olası bir değerlendirme yerine kayıt içeriğini döndürür çünkü getreg () isteğe bağlı ikinci argüman eklemek için düzenledim.
jamessan

1

Soruyu doğrudan yanıtlamak için, bir kaydın içeriğini diğerine hızlı ve kolay bir şekilde kopyalamak istiyorsanız, .vimrc'nize aşağıdakileri koyabilirsiniz. Daha sonra yürütebileceği <leader>rcabkayıt içeriğini kopyalamak için akayıt b. Örnek <leader>rcolarak 'kayıt kopyası' anlamına gelmeyi seçtim

function! s:CopyRegister()
    let sourceReg = nr2char(getchar())

    if sourceReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . sourceReg
        return
    endif

    let destinationReg = nr2char(getchar())

    if destinationReg !~# '\v^[a-z0-9]'
        echo "Invalid register given: " . destinationReg
        return
    endif

    call setreg(destinationReg, getreg(sourceReg, 1))
    echo "Replaced register '". destinationReg ."' with contents of register '". sourceReg ."'"
endfunction

" rc = register copy
nnoremap <leader>rc :call <sid>CopyRegister()<cr>

1
Ben tavsiye ederim getreg(sourceReg, 1).
jamessan

Ah evet, doğru. Sabit.
Steve Vermeulen
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.