Vimのコマンドラインにヤンキーのテキストを貼り付けたいのですが。それは可能でしょうか?
はい、Ctrl-Rの後に、"を押します。ヤンクしたものにリテラルの制御文字がある場合は、Ctrl-Rlt;/kbd>、Ctrl-O、"となります。 ここでは、レジスターでできることについて説明します。レジスターでできることは非常に多く、一度使いこなすと手放せなくなります。 レジスタは基本的に文字列の保存場所です。Vim には様々な方法で動作する多くのレジスターがあります。
0
(ヤンクレジスタ: 通常のモードでレジスタを指定せずに y
を使用すると、ヤンクされたテキストはそこに移動し、デフォルトのレジスタにも移動します)。1
から 9
(レジスタをシフトして削除する。c
や d
などのコマンドを使用すると、削除されたものはレジスタ 1 に、レジスタ 1 にあったものはレジスタ 2 に、*など)。"
(デフォルトのレジスタ、無名のレジスタとも呼ばれる。ここでは、"が登場します Ctrl-R、")。)a
から z
は自分で使用するためのものです (大文字の A
から Z
は対応するレジスタに追加するためのものです)。_
(/dev/null
(Unix) や NUL
(Windows) のように動作し、書き込むことはできますが、破棄され、読み出すと常に空になります)。-
(小さな削除レジスタ)。/
(検索パターンレジスタ、例えば /
, ?
, *
, #
でテキストを探したときに更新されます; 動的に検索パターンを変更するために書き込むこともできます),:
(VimL が Q
や :
を使って最後に入力したコマンドを保存します。読み取り専用です)。+
と *
(システムのクリップボードレジスタ。書き込んでクリップボードを設定したり、クリップボードの内容を読み込んだりすることができます。)
完全なリファレンスは :help registers
を参照してください。
いつでも :registers
を使って、すべてのレジスタの内容を表示することができます。このコマンドの同義語や略語には、:display
、:reg
、:di
があります。
挿入モードやコマンドラインモードでは、Ctrl-Rにレジスタ名を加えると、そのレジスタの内容を挿入します。もし、文字通りに挿入したい(自動インデントを行わない、0x08
などの制御文字をバックスペースに変換しない、など)場合は、Ctrl-R、Ctrl-O、レジスタ名を使用します。
詳しくは:help i_CTRL-R
と次の段落を参照してください。
しかし、次のようにすることもできます(たぶん、レジスターの多くの使い方を忘れていると思います)。"
はノーマルモードのコマンドで、次のヤンク、デリート、ペーストの操作時に使用するレジスタを選択することができます。つまり、":は、コロンのレジスタを選択します(前回のコマンドを保存します)。そして、pは、既に知っているコマンドであれば、レジスタの内容を貼り付けます。
cf. :help "
, :help quote_:
.vimrc
)を編集していて、今すぐ連続した2行を実行したいと思っています。@"Enterです。:@
Exコマンドは、引数として与えられたレジスタに格納されたExコマンドを再生します。"
は、無名のレジスタを参照する方法です。関連して、この回答のトップもご覧ください。
ここで使われている"
(レジスタ名)と、先ほどの例の"
(ノーマルモードのコマンド)を混同しないようにしてください。
cf. :help :@
および :help quote_quote
を参照してください。:help quote_/
, help i_CTRL-R
.
裏付け。検索パターンはそのままに、別の検索パターンを追加することができます。y
でヤンクしたところ、それらは無名のレジスタに入っています。ここで、今いる場所のすぐ下に、この2つの単語を使って新しい行を開きたいとします。pu」です。これは :put "
の略語です。 :put
コマンドは、多くの Ex コマンドと同様に、行方向にしか動作しません。
cf. :help :put
とすることもできました。:call setreg('"', @", 'V')
then p
.setreg関数は、第1引数に名前が与えられたレジスタを(文字列で)設定し、第2引数の内容で初期化し(VimLでは
@xという名前でレジスタを変数として使うことができます。
xはレジスタ名です)、第3引数で指定されたモードにします。ラインワイズは
V、キャラクタワイズはnothing、ブロックワイズはリテラルの
^Vです。 cf.
:help setreg().逆の関数は
getreg()と
getregtype()` です。qa
...q
でマクロを記録した場合、:echo @a
で入力した内容が表示され、@a
でマクロが再生されます (たぶん知っていると思いますが、繰り返しの作業を避けるために非常に便利です)。
cf. :help q
, help @
.
先ほどの例からの補足です。もしクリップボードに 8go
があれば、@+
はクリップボードの内容をマクロとして再生し、ファイルの 8 バイト目に移動します。実際、これはほとんどすべてのレジスタで動作します。Insert モードで最後に挿入した文字列が dd
だった場合、@.
は (.
レジスタには最後に挿入した文字列が含まれているので) 1 行を削除します。(Vim のドキュメントはこの点で間違っています。#
, %
, :
, .
のレジスタは p
, P
, :put
と Ctrl-R でのみ動作すると記載されています)。
cf. :help @
Vim のコマンドをレジスタから再生するコマンドである :@
と、ノーマルモードのコマンドをレジスタから再生するコマンドである @
を混同してはいけません。
注目すべき例外は @:
です。コマンドレジスタには、最初のコロンも最後のキャリッジリターンも含まれていません。しかし、ノーマルモードでは、@:
は期待通りの動作をし、レジスタをExコマンドとして解釈し、ノーマルモードで再生しようとはしません。つまり、最後のコマンドが :e
であった場合、レジスタには e
が含まれていますが、 @:
はファイルを再読み込みするだけで、単語の最後まで再生しようとはしません。
cf. :help @:
@='dd'
Enter。式を入力して、Enterを押すと、Vimはその式を計算し、その結果がレジスタの内容として働きます。もちろん、レジスタ =
は読み取り専用で、一回限りです。これを使い始めるたびに、新しい式を入力しなければなりません。
cf. :help quote_=
補足です。コマンドを編集しているときに、現在のバッファから何行かをコマンドラインに挿入する必要があることに気づいた場合、Esc を押してはいけません!くれぐれもCtrl-R=getline(58)
Enterを使うようにしてください。この後、コマンドライン編集に戻りますが、58行目の内容が挿入されています。:let @/ = 'foo'
cf. :help :let
この場合、パターンの中で /
をエスケープする必要はありません。ただし、シングルクォートをすべてダブルクォートにする必要があるのは当然です。(空のマクロを格納した *a* レジスタをリセットします)、
:g/^foo/y A、
:g/bar/y A、
:let @+ = @aです。 大文字のレジスタ名を使用すると、レジスタが追加モードで動作します。 より良い方法は、
Qが
mswin.vimによってリマップされていない場合、
Qで Ex モードを開始し、実際には "Ex コマンド" と呼んだ方が良い "コロンコマンド" を連鎖させ、
visualを入力してノーマルモードに戻ることです。 cf.
:help :g,
:help :y,
:help Q`.:g/^/put _
. これは、ブラックホールレジスタ(読み込み時には空ですが、書き込み可能で、/dev/null
のように動作します)の内容を、各行の後に並べて置きます(すべての行には始まりがあるからです!)。foo
を含む行を追加します: :g/^/-put ='foo'
.これは式レジスタの巧妙な使い方です。ここで、-
は .-1
の同義語です (cf. :help :range
)。:put
は行の後にテキストを置くので、前の行に作用するように明示的に指示する必要があります。:%y+
.
cf. :help :range
(%
の部分)と :help :y
を参照してください。:let @a='
Ctrl-R =replace(@a,"'","'",'g')
Enter '
と入力して編集することができます。これにより、レジスタa
に格納されているマクロの内容が変更されますが、そのために式レジスタをどのように使用するかがここで示されています。dddd
を実行した場合、元に戻すために uu
を実行するかもしれません。pで、削除された最後の行を得ることができます。しかし、実際には、
@1から
@9までのレジスタを使って、9個までの削除を回復することもできます。 さらに良いことに、
"1Pとすると、ノーマルモードの
.では
"2Pというように再生されます。 cf.
:help .および
:help quote_number` を参照してください。=strftime('%y%m%d')
Enter。
cf. :help strftime()
もう一度言いますが、混乱することがあります。:@
は、レジスタの内容を vimscript として解釈し、ソースとするラインコマンドです。@
は通常モードのコマンドで、レジスタの内容を通常モードのキーストロークとして解釈します (ただし、:
レジスタを使用すると、最初のコロンなしで最後に再生されたコマンドが含まれます。この場合、コロンと最後のリターンキーも再入力したかのように、コマンドが再生されます)。"
は、通常モードでは、ヤンク、ペースト、デリート、コレクトなどのレジスタを選択するのに役立つコマンドです。"
は有効なレジスタ名(デフォルト、または無名のレジスタ)でもあるので、レジスタ名を要求するコマンドの引数として渡すことができます。システムのクリップボードからvimのコマンドライン("コマンドモード")に何かを貼り付けるには、Ctrl+Rの後に、+を使います。私の場合、少なくともUbuntuでは、Shift+Insが効きません。
PS:なぜ、Ctrl+Rの後に*が続くのかよくわかりませんが、これは理論的には<.kbd>Ctrlと同じです。kbd>Ctrl+Rに続けて+を入力しても、いつもうまくいかないようです。検索してみたところ、+バージョンを発見し、少なくとも私のボックスでは、常に動作するようです。