vimレジスタを使用するにはどうすればよいですか?


926

レジスターを使用するインスタンスが1つだけであることを知っているのでCtrlR*、クリップボードからテキストを貼り付けることができます。

レジスタの他の用途は何ですか?それらを使用するには?

VIレジスターについて知っていることすべて(vi 7.2に焦点を当てましょう)-私たちと共有してください。


22
私はレジスターの使用に関してそこで長い回答をしました
Benoit

回答:


1185

Vimのレジスタを使用すると、その中に保存されているテキストに対してアクションやコマンドを実行できます。レジスターにアクセスする"aには、コマンドの前に入力aします。はレジスターの名前です。現在の行をregisterにコピーするk場合は、次のように入力できます。

"kyy

または、大文字を使用してレジスタに追加できます

"Kyy

次に、ドキュメントを移動し、次を使用して他の場所に貼り付けることができます

"kp

Linuxのシステムクリップボードから貼り付けるには

"+p

Windowsのシステムクリップボード(またはLinuxの「マウスハイライト」クリップボード)から貼り付けるには

"*p

現在定義されているすべてのレジスタタイプにアクセスするには

:reg

165
そして、"+システムのクリップボードを参照する特別なレジスタです。
アーロン・マクデイド2013

17
Windowsでは、クリップボードには"*; でアクセスできます。したがって、ファイルの終わりまでコピーするコマンドはになり"*yGます。
Aditya MP

44
X(Linux、場合によってはOS-X)では*、「マウスハイライト」クリップボードであり+、Ctrl-XCVクリップボードです。
dotancohen 2013年

20
クリップボードレジスタに追加する方法はあります+か(大文字がないため)?
naitsirhc 2013

8
@dotancohen技術的にはPRIMARY選択と呼ばれますが、「マウスハイライト」の方が簡単に入手できると思います:)
kyrias

783

0レジスターを見つけて嬉しかったです。特定のレジスターに割り当てずにテキストをヤンクすると、テキストは0レジスターに割り当てられ、デフォルトの"レジスターに保存されます。0"レジスタの違いは、0ヤンクしたテキストのみが入力されることですが、デフォルトのレジスタにもd/ D/ x/ X/ c/ C/ s/ Sコマンドを使用して削除されたテキストが入力されます。

これは、テキストをコピーし、何かを削除して、コピーしたテキストで置き換える場合に便利です。次の手順は、例を示しています。

  • コピーしたいテキストをヤンクy[motion]-このテキストは保存され"0登録されます
  • 置き換えるテキストを削除しますd[motion]-このテキストは"レジスタに保存されます
  • ヤンクしたテキストを貼り付けます "0p

ここ"で、次のコマンドのレジスタを使用するコマンドです。

最後のステップで、デフォルトのレジスタから(をp使用して)貼り付けると、削除したばかりのテキストが使用されます(おそらく意図したものではありません)。

に注意するpP、デフォルトのレジスタから貼り付けます。同等のロングハンドは""p(または""P)で"0、最後のヤンクを"1保持し、最後の削除または変更を保持します。

詳細については、を参照してください:help registers


17
pまたはPデフォルトのレジスタから貼り付けます。等価な表記は""p(または""P)になります。
nelstrom 2009年

186
ちなみに、「0は最後のヤンクを保持する」と同じ方法で、「1は最後の削除または変更を保持する。
FireAphis 2011年

6
"次のコマンドにレジスターを使用するコマンドです。したがって、貼り付けコマンドにレジスタを""p使用し、"レジスタを"0p使用し0ます。
Ramon Marco

5
0p現在の行の最初の文字に移動し、デフォルトのレジスタの内容から貼り付けることを意味します(")。"pレジスタを使用するコマンドを指定する必要があるため、不完全なコマンドになりますp
Ramon Marco

15
同じ方法で、「1は最後の削除を保持します」、「2は最後から2番目の削除を保持します」、「3は最後から3番目の削除を保持します。以下同様です。「9
James

330

レジスターについて私のお気に入りの部分の1つは、それらをマクロとして使用することです!

たとえば、タブ区切りの値ファイルを扱っているとします。

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

ここで、%Devフィールドの最後に(2行目から)パーセント記号を追加する必要があると判断しました。m次のように、(任意に選択した)レジスタに簡単なマクロを作成します。

  1. 押す::登録中のqmマクロの記録を開始しmます。

  2. EE:3番目の列の最後に移動します。

  3. a:この列の最後に追加する挿入モード。

  4. %:追加するパーセント記号を入力します。

  5. <ESC>:コマンドモードに戻ります。

  6. j0:次の行の先頭に移動します。

  7. q:マクロの記録を停止

@mこれで、このマクロを現在の行で実行するために入力することができます。さらに、これを100回@@繰り返したり、タイプしたりできる100@m!人生はかなりよさそうだ。

この時点で、「しかし、待って、これは登録者に何をすべきか?」

優れた点。とm入力して、レジスターの内容を調べてみましょう"mp。次に、以下を取得します。

EEa%<ESC>j0

最初は、誤ってバイナリファイルをメモ帳で開いたように見えますが、一見すると、マクロ内の文字の正確なシーケンスです。

あなたは好奇心旺盛な人なので、面白いことをして、このテキスト行を編集して!退屈な古いの代わりにを挿入しましょう%

EEa!<ESC>j0

次にn、と入力して、これをレジスターにヤンクしますB"nyE。次に、キックのためだけに、... nを使用してデータの行でマクロを実行し@nます。

OMG、ITが追加されました !

基本的に、マクロの実行は、そのマクロのレジスター内の正確なキーのシーケンスを押すようなものです。それがクールな見当のトリックではないなら、私は帽子を食べます。


65
これは完全に重要です。レジスタがマクロバッファと同じであることは、これまで気がつきませんでした。つまり、すべてのマクロをテキストに格納し、ヤンクして実行することができます。かなりクールで、少し変です。とてもVim。
naught101 2012

1
マイナーな編集上の注意ですが、太字のキャプスロック...修正されている可能性があります。現時点ではかなり厄介です。
アシュラムン

1
+代わりにj0を使用して、次の行の最初の空白以外の文字に移動できます。
Gokul

100

その他の便利なレジスタ:

"*または"+-システムクリップボードの内容

"/ -最後の検索コマンド

": -最後のコマンド。

vimマクロはマクロを記録するときに使用されるキーストロークのリストにすぎないため、編集できます。テキストファイルにマクロを書くことができるように(使用して"apマクロの書き込みにAをして編集して、としてレジスタにロード)"ay$。便利なマクロを保存するための素晴らしい方法。


6
デフォルトのvim OSX上で「*統合が含まれていないあなたがない自作-ALTからのバージョンをインストールすることができますに確認してください。。vim --version- -clipboardあなたはそれを持っていない手段、+clipboardあなたは手段を。
ザビエルシェイ

15
X11では、"*"+さえクーラーです:"+にコピーされた最後のテキスト貼り付けctrl+c(コピーバッファ)、または何これまで使用(またはショートカットright-click>copy)。"*マウス(選択バッファー)で強調表示された最後のテキストを貼り付けます。したがって、で何かをコピーctrl+cしてから、マウスで他の何かを強調表示した場合、貼り付けるものを選択できます。これは、これらの2つのレジスターが同義であるWindowsでは機能しません。
naught101 2012

1
私が探していた、あなたを祝福"*し、"+年間の!システムのクリップボードにアクセスできるのはgvimだけだと思っていましたが、どうやら通常のvimもそうです!
Tarrasch 2012

@Tarrasch gvimの代わりにコンソールvimを使用すると、さらに多くのことがわかります。おもう。freenodeの#vimにもアクセスしてください!
trusktr 2013年

1
1が持っている場合は有効にする方法-xterm_clipboardについてvim --version。インストールする簡単なパッケージはありますか?(debian / apt-get)。ありがとう。
Beco博士、2014

77

ブラックホールレジスタ _である/dev/nullレジスタ。

私はvimrcでこれを使用して、デフォルトのレジスターを更新せずに単一の文字を削除できるようにしています。

noremap x "_x

デフォルトのレジスタを更新せずにビジュアルモードで貼り付けるには:

vnoremap p "_dP

2番目のマッピングも非常に便利です。説明については、こちらをご覧ください:marcorucci.com/blog/#visualModePaste
mrucci

21
のマッピングは、x文字を転置するのに不便になります。
skeept '10

Xを押すと、あなたが見つけるあなたがヤンクきた最後のものは、プレスは、あなたがヤンクものを貼り付け、その後、」0Pを数回XAレジスタ0にある消去されません。
trusktr

2
上記のskeeptのコメントを拡張するには:このxマッピングではxp、現在のコマンドを次の文字に切り替える「コマンド」を実行できなくなります。入力ミスの修正に非常に役立ちます。またXp、前のキャラクターと電流を切り替える必要があります。
Daniel Andersson

56

レジスタの内容をex-modeコマンドに貼り付けたい場合は、を押します<C-r><registerletter>

なぜこれを使うのですか?長い文字列を検索して置換したかったので、ビジュアルモードで選択し、検索/置換式:%s/[PASTE YANKED PHRASE]//gを入力し始めて、一日を過ごしました。

exモードで1つの単語のみを貼り付けたい場合は、exモードに入る前にカーソルがその単語の上にあることを確認してから<C-r><C-w>、exモードでを押して単語を貼り付けます。


6
:コマンドラインにテキストを貼り付けることは、今日学んだ最高のことです
Shahbaz

1
挿入モードで<CR> <registerletter>を使用することもできます
Floegipoky

1
正規表現の検索/置換を最初にjustで記述し/[write out your regex]<cr>、次にjustで置き換えるのが好きs/<C-R>//replacement/です。このようにして、置換を実行する前に正規表現に関するライブフィードバックの利点を得ることができます。
GabeIsman 2017年

44

秘密の達人レジスターは、表現=レジスターだと思います。クリエイティブマッピングに使用できます。

:inoremap  \d The current date <c-r>=system("date")<cr>

上記のようにシステムと組み合わせて使用​​したり、カスタムVimL関数などから応答を取得したりできます。

または単に次のようなもの

<c-r>=35+7<cr>

3
デレクワイアットの[式レジスタの使用に関するビデオ](derekwyatt.org/vim/vim-tutorial-videos/…)を確認してください
Jeromy Anglim

1
@JeromyAnglimからのリンクがここにあります:derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus

39

クールなトリックは、を使用"1pして最後の削除/変更を貼り付け(次に、.を繰り返し使用して後続の削除を貼り付けます。つまり、"1p...は基本的にと同等"1p"2p"3p"4pです。

これを使用して、少数の行を逆順で並べることができます。 dddddddddd"1p....


あ、これは素晴らしいです。私が本当に望んでいるのは、
ヤンクの

18

vimのヘルプページから:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>

17
  • q5は編集内容をレジスター5に記録します(次のqは記録を停止します)
  • :regは、すべてのレジスタとそれらの内容を表示します
  • @ 5レジスター5マクロを実行(記録された編集)

15
マクロ(3つのキーストローク)を起動する@キーが好きではありません。レジスタqに格納されたマクロを起動するようにF2をマッピングしました。レジスタq nmap <F2> @q を使用します。これは、F2のマクロを保存して再生するために、を押すだけqqです。迅速なマクロの保存と再生。
Andrej Panjkov 2011

16

私はデフォルトのレジスタを使用して、マウスに手を伸ばすことなく、vimウィンドウのテキストをgrepします。

  1. ヤンクテキスト
  2. :!grep "<CTRL-R>0"<CR>

12

コマンドレジスタを使用します@。例えば:

echo @a
echo @0
echo @+

コマンドでそれらを設定します。

let @a = 'abc'

"ap貼り付けabcます。


8

混乱の大きな原因はデフォルトのレジスタ"です。それが機能する方法を知ることは重要です。ほとんどの場合、デフォルトのレジスタを回避するほうがはるかに優れています。Vimドキュメントからの説明:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

したがって、デフォルトのレジスタは実際には最後に使用されたレジスタへのポインタです。何かを削除またはヤンクすると、このレジスタは他のレジスタをポイントします。レジスタを確認することでテストできます。デフォルトのレジスターとまったく同じ別のレジスターが常に存在します。ヤンクレジスター("0)、最初の削除レジスター("1)、小さな削除レジスター("-)、または削除またはヤンクするために使用されたその他のレジスターです。

唯一の例外は、ブラックホールレジスタです。Vim docさんのコメント:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

通常"0、直接使用する"-と、はるかに優れています:、および"1-"9デフォルトのレジスターまたは名前付きレジスター。


8

見落とされているレジスタの1つは「。」です。最後に挿入されたテキストがどのように挿入されたかに関係なく含まれるドットレジスタ(例:ct](]まで変更)。次に、別の場所に挿入する必要があるが、ドットリピート方式を使用できないことに気付きました。

 :reg .
 :%s/fred/<C-R>./

7

私のお気に入りのレジスターは':'レジスターです。@:通常モードで実行すると、以前に実行したexコマンドを繰り返すことができます。


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