ヤンクしたテキストを Vim のコマンド ラインに貼り付けたいのですが、可能ですか?
ベストアンサー1
はい。- を押してから を押しますCtrl。Rヤンク"した内容にリテラル制御文字が含まれている場合は、Ctrl- R、Ctrl- O、を使用します"。
ここでは、レジスタを使用して何ができるかについて説明します。レジスタを使用してできることは驚くほど多く、使い方を知ってしまうと、レジスタなしでは生きていけなくなります。
レジスタは基本的に文字列の保存場所です。Vim にはさまざまな方法で動作するレジスタが多数あります。
0
y
(ヤンクレジスタ:レジスタを指定せずに通常モードで使用すると、ヤンクされたテキストはそこに保存され、デフォルトのレジスタにも保存されます)。1
(9
シフト削除レジスタ、またはなどのコマンドを使用すると、c
削除d
されたものはレジスタ 1 に移動し、レジスタ 1 にあったものはレジスタ 2 に移動します)、"
(デフォルト レジスタ、名前なしレジスタとも呼ばれます。ここで が"登場しますCtrl- R、")、a
z
自分用に使用するために、大文字の to を使用します (大文字A
の to はZ
対応するレジスタに追加されます)。_
/dev/null
( (Unix) や(Windows)のように動作しNUL
、書き込むことはできますが破棄され、読み取るときは常に空になります)。-
(小さな削除レジスタ)、/
/
(検索パターン レジスタ。たとえば、、?
またはを含むテキストを検索すると更新されます。*
また#
、これに書き込んで検索パターンを動的に変更することもできます)。:
(Q
または経由で最後に入力した VimL コマンドを:
読み取り専用で保存します)、+
(*
システム クリップボード レジスタ。これに書き込むことでクリップボードを設定し、クリップボードの内容を読み取ることができます)
:help registers
完全な参考資料については、を参照してください。
いつでも を使用して、:registers
すべてのレジスタの内容を表示できます。このコマンドの同義語と省略形は:display
、、:reg
およびです:di
。
挿入モードまたはコマンドラインモードでは、Ctrl-Rとレジスタ名を組み合わせると、このレジスタの内容が挿入されます。文字どおりに挿入する場合 (自動インデントなし、バックスペースなどの制御文字の変換なしなど) は、 - 、- 、レジスタ名を0x08
使用できます。詳細については、および次の段落を参照してください。CtrlRCtrlO:help i_CTRL-R
ただし、次の操作を行うこともできます (レジスタの多くの用途を忘れている可能性があります)。
通常モードでは、 を押します":p。vim で最後に使用したコマンドがバッファに貼り付けられます。
分解してみましょう:"
は通常モードのコマンドで、次のヤンク、削除、または貼り付け操作中に使用するレジスタを選択できます。したがって、":コロン レジスタ (最後のコマンドを保存) を選択します。 はp既にご存知のコマンドで、レジスタの内容を貼り付けます。参照
:help "
、:help quote_:
VimL ファイル (たとえば
.vimrc
) を編集していて、今すぐに連続した行をいくつか実行したいとします。yj:@"Enterここ
で、yjは現在の行と次の行 (これは j が行単位の移動であるためですが、これはこの回答の範囲外です) をデフォルトのレジスタ (名前のないレジスタとも呼ばれます) にヤンクします。次に、:@
Ex コマンドは引数として指定されたレジスタに格納されている Ex コマンドを再生します。 は、"
名前のないレジスタを参照する方法です。関連するこの回答の先頭も参照してください。"
ここで使用されている (レジスタ名)を、"
前の例の通常モード コマンドのと混同しないでください。cf.
:help :@
および:help quote_quote
最後の検索パターンを、挿入モードでファイルに挿入するか、Ctrl- R、を使用してコマンド ラインに挿入します/。
参照
:help quote_/
、help i_CTRL-R
結果: 検索パターンはそのままにして、代替案を追加します:
/
Ctrl- R、/\|alternative
。ビジュアル モードで行の途中にある 2 つの単語を選択し、 でヤンクしました。
y
これらの単語は名前のないレジスタにあります。次に、現在いる場所のすぐ下に、これらの 2 つの単語を含む新しい行を開きます。:pu
これは の省略形です:put "
。:put
多くの Ex コマンドと同様に、このコマンドは行単位でのみ機能します。参照。
:help :put
:call setreg('"', @", 'V')
thenと実行することもできますp
。このsetreg
関数は、最初の引数として名前が指定されたレジスタ (文字列) を設定し、2 番目の引数の内容で初期化し (レジスタを、VimL のレジスタ名である名前を持つ変数として使用できます@x
) 、3 番目の引数で指定されたモード (行単位の場合は何も指定せず、ブロック単位の場合はリテラル)x
に変換します。V
^V
cf.
:help setreg()
。逆関数はgetreg()
とですgetregtype()
。qa
...でマクロを記録した場合はq
、:echo @a
入力した内容が表示され、@a
マクロが再生されます (おそらくご存知だと思いますが、繰り返しの作業を避けるために非常に便利です)参照
:help q
、help @
前の例からの帰結:
8go
クリップボードに がある場合、 は@+
クリップボードの内容をマクロとして再生し、ファイルの 8 番目のバイトに移動します。実際、これはほぼすべてのレジスタで機能します。最後に挿入した文字列がdd
挿入モードであった場合、 は@.
(.
レジスタに最後に挿入した文字列が含まれているため) 行を削除します。(この点に関して、Vim のドキュメントは間違っています。レジスタ#
、%
、:
は、、および-.
でのみ機能すると記載されているからです)。p
P
:put
CtrlR参照。
:help @
:@
(レジスタから Vim コマンドを実行するコマンド) と@
(レジスタから通常モードのコマンドを実行する通常モードのコマンド)を混同しないでください。注目すべき例外は です
@:
。コマンド レジスタには最初のコロンも最後のキャリッジ リターンも含まれていません。ただし、通常モードでは、@:
は期待どおりに動作し、レジスタを Ex コマンドとして解釈し、通常モードで再生しようとはしません。したがって、最後のコマンドが だった場合:e
、レジスタには が含まれますe
が、@:
単語の末尾に移動するのではなく、ファイルが再ロードされます。参照。
:help @:
実行する前に、通常モードで何を行うかを示します:
@='dd'
Enter。 キーを押すとすぐに=
、Vim は式の評価に切り替わります。式を入力して を押すとEnter、Vim はそれを計算し、その結果がレジスタの内容として機能します。もちろん、レジスタは=
読み取り専用で、1 回限りです。使用を開始するたびに、新しい式を入力する必要があります。参照。
:help quote_=
結果: コマンドを編集しているときに、現在のバッファからコマンド ラインに何らかの行を挿入する必要があることに気付いた場合は、Esc!を押さずにCtrl- を使用しますR
=getline(58)
Enter。その後、コマンド ラインの編集に戻りますが、58 行目の内容が挿入されています。検索パターンを手動で定義します。
:let @/ = 'foo'
参照。
:help :let
これを実行する場合、パターン内でエスケープする必要がないことに注意してください
/
。ただし、もちろんすべての一重引用符を二重にする必要があります。で始まるすべての行と、その後に を含むすべての行をクリップボードにコピーし、
foo
次bar
のコマンドを連結します:qaq
(内部に空のマクロを格納するa:g/^foo/y A
レジスタをリセットします) 、、、:g/bar/y A
。:let @+ = @a
大文字のレジスタ名を使用すると、レジスタは追加モードで動作します。
より良い方法として、
Q
が によって再マップされていない場合はmswin.vim
、 で Ex モードを開始しQ
、実際には「Ex コマンド」と呼ぶ方が適切な「コロン コマンド」を連結し、 と入力して通常モードに戻りますvisual
。参照
:help :g
、、:help :y
:help Q
ファイルをダブルスペースにします:
:g/^/put _
。これにより、ブラックホール レジスタの内容 (読み取り時は空ですが、書き込み可能で、 のように動作します/dev/null
) が各行の後に行単位で配置されます (すべての行には始まりがあるため)。foo
各行の前に を含む行を追加します:g/^/-put ='foo'
。これは式レジスタの巧みな使用法です。ここで、 は(cf. )-
の同義語です。はテキストを行の後に置くので、前の行に対して動作するように明示的に指示する必要があります。.-1
:help :range
:put
バッファ全体をシステム クリップボードにコピーします:
:%y+
。cf.
:help :range
(その%
部分については) および:help :y
。マクロを誤って記録した場合は、
:let @a='
Ctrl-R=replace(@a,"'","''",'g')
Enter'
と入力して編集できます。これにより、レジスタ に格納されているマクロの内容が変更されますa
。ここでは、式 register を使用してこれを行う方法を示します。マクロを変更するもう 1 つの簡単な方法は、マクロをバッファ ("ap
) に貼り付けて編集し、マクロを選択して で再度レジスタに格納することです"ay
。を実行した場合、元に戻すには を
dddd
実行します。 を使用すると、最後に削除した行を取得できます。 ただし、実際には から までのレジスタを使用して、最大 9 個の削除を回復することもできます。uu
p
@1
@9
さらに良いことに、 を実行すると
"1P
、.
通常モードで が再生される"2P
などします。cf.
:help .
および:help quote_number
挿入モードで現在の日付を挿入する場合: Ctrl- R
=strftime('%y%m%d')
Enter。参照。
:help strftime()
もう一度、混乱を招く可能性があるのは次の点です。
:@
レジスタの内容をvimscriptとして解釈し、それをソースするコマンドラインコマンドです。@
通常モードのコマンドでは、レジスタの内容を通常モードのキーストロークとして解釈します (ただし:
、先頭のコロンを除いた最後に実行されたコマンドを含むレジスタを使用する場合は除きます。この場合、コロンと最後のリターン キーも再入力したかのようにコマンドが再実行されます)。"
通常モードでは、ヤンク、貼り付け、削除、修正などのレジスタを選択するのに役立つコマンドです。"
有効なレジスタ名(デフォルト、または名前のないレジスタ)でもあるため、レジスタ名を期待するコマンドの引数として渡すことができます。