2014/02/28

君の知らないVimレジスター

この記事は Vim Advent Calendar 2013 90日目の記事になります。

どうも、一足早い春休みに突入したもぷりです。
しかし春と言っても、まだまだ、寒いですねー。
先日からneovimの話題でもちきりですが、Vim本体についての紹介です。


今回はレジスタの話です。
まずは、ヘルプを見てみましょう。
:help registers
レジスタには 9 種類ある: *registers* *E354*
1. 無名レジスタ ""
2. 10個の番号付きレジスタ "0 から "9
3. 小削除用レジスタ "-
4. 26個の名前付きレジスタ "a から "z または "A から "Z
5. 4個の読み取り専用レジスタ ": と ". と "% と "#
6. expression 用レジスタ "=
7. 選択領域用レジスタ "* と "+ と "~
8. 消去専用レジスタ "_
9. 最終検索パターン用レジスタ "/

意外と種類がありますね。
詳しくはそのままヘルプを読めばわかると思います。

そして、このレジスタはなんとインサートモードから呼び出すことが可能です。
やり方はインサートモードで
<C-R> レジスタ
です。


これを使ったテクニックを紹介します。
まずは、実践Vimにも記述されているものです。
<C-R>={何か式}
インサートモードにて入力すると、コマンドモードに=が現れて続けて入力ができます。
例えば、四則演算などの簡単な式を埋め込みたいときなどに有用です。
メモリアドレスの計算なんかしたいときなど
「<C-R>=0xA000 - 0x0909」と打てば「38647」と表示されます。
おっと、これは10進数です。メモリアドレスなんだから当然16進数がいいですね。

ここで、入力できるのは計算式ではなくVimにとっての式であるというのが便利ポイントです。
「<C-R>=printf('0x%x', 0xA000 - 0x0909)」とすると「0x96f7」で入力されます。


次によく使うのは「*」と「+」レジスタの2つです。
このレジスタはシステムのクリップボードの内容を表します。
<C-R>+
これでブラウザなどからコピペできますね。
ターミナルなどを使っていて、普通にインサートモードでコピペを使用とすると、
インデントやPluginなどが動作して崩れる場合があります。
MacとWindowsでは2つは同値らしいですが、Unixでは「+」を使ってください。

これはかなり便利なのでマップしておいたりすると便利です。
逆にシステムクリップボードにヤンクするにはノーマルモードで
「"+yy」でできます。これもマップしておくとよいですね


次には、何かした時に「あー、今のやつをテキストとして入力したい」ということがあると思います。
そういう時に使うのが以下です。
編集中のファイル名 <C-R>%
直前のテキスト     <C-R>.
直前のコマンド     <C-R>:
直前の検索         <C-R>/
このあたりを使いこなすととても便利力があがりますねー


と、今日はここまでにしておきます。

0 件のコメント:

コメントを投稿