テキストを1つのレジスタから任意の数のレジスタに移動するにはどうすればよいですか?


10

レジスタから別のレジスタまたはレジスタセットにテキストを「パイプ」する方法はありますか?例えば、移動"qレジスタに"1スルー"5

同じマクロのわずかに異なるバージョンを作成したいことがよくあるので、「テンプレート」マクロを複数のレジスタにコピーして、それぞれを適切に変更できると便利です。

実用的な例を示すために、ここで私にこの質問を促した問題があります。

次の行をハードウェア記述言語から多くの繰り返しブロックに変換する必要があります。

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

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

yypW^At)^Aregisterに保存したインクリメント関数を使用して、これを実行するマクロがあります"a

時々、次のようにインクリメントのパターンが少し異なる必要があります

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

ここで、レジスター内のマクロはに"bなりますyypW^At)^A^A

レジスターでこれを行いたいのですが、1から5までの増分ごとに行います。レジスタ"aは(どういうわけか)レジスタbからeにコピーできます。次に、各レジスターをバッファーに貼り付け、必要な変更を加え(項を追加し、tモーションに従うキャラクターを変更し)、変更した式をヤンクしてレジスターに戻します。理想的には、この最後のステップをレジスタにコピーするコマンドに含めることもできます

これにより、変更する必要のないマクロ内のすべての文字を繰り返す必要がなくなります。私の例では、それは些細なことかもしれませんが、私が求めていることを実行することが非常に役立つかもしれないときを予測することができます。


5
余談ですが、番号付きレジスタの使用はお勧めしません。唯一の「安全な」レジスタは、アルファベット順のレジスタです。他のすべてのレジスタはVimによって自動的に設定されます。
jamessan 2015

回答:


7

マクロは単なるテキストです。

新しい空のバッファを開き、マクロをそこに配置します。行を複製し、ここで1つ他の場所を変更してから、行をヤンクして、ですぐに使用できます@"

レジスタ、特にまったく異なる目的に使用される数値レジスタを汚染する必要はありません。

-編集-

説明を追加したので、質問が理解しやすくなりました。

結局のところ、レジスターを変数であるかのように操作することなく、最初の記録を変更するだけで目標を達成できます。

: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

現在の行の5つのコピーを作成するには、最後の番号を2ずつ増やします。

:let i = 2|norm 5@a

または12部、最後の番号は23ずつ増加します。

:let i = 23|norm 12@a

数値レジスターについては同意しました。ただし、これをコマンドで使用する場合、同じで始まるが異なるレジスターが必要な場合はどうでしょうか。
wchargin 2015

@WChargin、説明してください。
romainl 2015

以下のように、おそらく私は、文字列の回転コピーで何かをしたい、その場合abcdeであり@q、そして私がしたい@x="bcdea"@y="abcde"@z="eabcd"。まず、、、およびすべてを等しくすること@xから始め、必要に応じてそれらを変更します。もちろん、私はこれを作ったが、あるかもしれないように思えるいくつかの類似した何かが役に立つかもしれません例。@y@z@q
wchargin 2015

2
@Kit、私はすぐにXYのようなにおいがするあなたの質問の実用的な例の欠如に少し心配しています。あなたがレジスターを誤用していることはほぼ間違いないので、私があなたがしようとしていることの説明を読みたいと思います。
romainl 2015

1
@Kit、それはXY問題の多くの問題の1つです。最も賛成の回答はあなたの質問に対する質の高い直接回答ですが、私の反対の回答はあなたの根本的な問題の実際の解決策ですが、最終的にはあなたの実際の問題のコンテキストでは役に立ちません。どちらも正解ですが、異なる質問に答えるため、判断が難しくなります。それが私だったら、私の中心的な問題に対処する答えを受け入れますが、それは私だけです。
romainl 2015

6

使用するgetregと、setreg

qからレジスターにコピーするには15

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

より一般的なリストにコピーするには:

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

使用する execute

qからレジスターにコピーするには15

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

より一般的なリストにコピーするには:

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

説明。 コマンドletはとして使用できます。let @x=@yこれは、レジスタyをレジスタにコピーしますx。基本的に、これらのコマンドをループで構築し(x上記の形式での値を変更)、executeそれらを実行します。


1
:exeここでは使用する必要はありません。機能はきれいになります。getreg()setreg()
jamessan 2015

@jamessanいい提案、ありがとう—私はこれらを正しく使用していますか?
wchargin 2015

これを編集して、オプションの2番目の引数をgetreg()に追加しました。これにより、レジスターの評価ではなく、レジスターの内容が返されます。
jamessan 2015

1

質問に直接答えるために、レジスタの内容を別のレジスタにすばやく簡単にコピーしたい場合は、.vimrcに次のように記述できます。その後、実行<leader>rcabaてregisterの内容をregister にコピーできますb。例として、<leader>rc「コピーの登録」を表すことを選択しました

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
お勧めしgetreg(sourceReg, 1)ます。
jamessan 2015

ああ、そうだね。修繕。
Steve Vermeulen、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.