vim tips

今回はレジスタ
ということでヤンク/プット(世に言うコピー&ペースト)、マクロなどについても。

vimクリップボードの連携がすばらしく便利。
Linuxクリップボード周りがややこしくてしょうがない。

ということでレジスタ
いまどんなレジスタがあるかは":registers"で見られる

ヤンク/プット

で、こいつの使い方ですが、一番一般的な用法はヤンクとプットかな。
基本的にはヤンクしたりしたのは'0'というレジスタにぶちこまれるわけだが、名前を指定してヤンクすることができる

"<使いたいレジスタ名>y

で好きなレジスタにヤンクできる。
プットするときは

"<使いたいレジスタ名>p

まぁ、要は'"'を前につければおっけ。


で、レジスタはまぁ適当にaとかbとか使えばいいのだけど、いくつかは特殊な意味を持ってる
すでに上で触れたがレジスタ'0'は名前をつけずにヤンクしたものがいれられる。
レジスタ'1'はカット(削除)したもの、以下2,3...は一個ずつシフトして保存される。


ということで例えばヤンクしたんだけど、プットする前に間違えて別なもの削除しちゃったよ
って時は慌てず騒がず

"0p

レジスタ0をプットしてやればヤンクしたのが使えると。
便利。

クリップボードとの連携

あと一番vim使い初心者で欲しいなと思うのは...というか初心者じゃなくてもか...クリップボードへのヤンク。
つまり、XだのQtだのGTKだのと独自に用意されてるクリップボードvimから叩き込みたい。
という要望。
じつはレジスタ*とレジスタ+がクリップボードになってたりする。
どう違うかって?
えっと、選択領域とかその辺の関係なんだけど、まぁ、へぇ、で済ませればいいと思います。はい。


で、じつはこいつが有効でなかったりする場合がある。

vim --version

で、"+xterm_clipboard"になってないと使えないので注意。
どうもLinuxクリップボード周りは複雑らしいのか、バイナリパッケージ(rpmとか)だと無効になってることが多いのかも。
"--enable-xterm_clipboard"をconfigureオプションに加えよう!!
あ、vimのmakeについても書いた方がいいのか?まぁ、いいや。


まぁ、ともかく。

"+y	クリップボードへコピー
"+p	クリップボードからの貼り付け

あたりを使えばおっけー
mapに入れておくと便利
うちの場合

nmap \y "+y
nmap \Y "+Y
nmap \p "+p
nmap \P "+P

あたりを入れてる。

マクロ

あー長くなってきたけどまだ続きます。
マクロ。
こいつもレジスタを使うもので、同じ動作を繰り替えしたい時に便利。


マクロを登録するときは

q<使いたいレジスタ><コマンド>q


マクロを実行する時は

@<使いたいレジスタ>


例えば前にやって例題(http://d.hatena.ne.jp/goth_wrist_cut/20071128/1196226458
文章の先頭に"> "を追加していくやつ。
マクロを使う方法もちょろっと書いておいたけど解説も加えつつ説明。

qa --レジスタaにマクロ登録を開始
I> [Esc] --先頭に"> "を挿入
j --下にカーソルを移動させる
q --マクロ登録を終了
3@a --マクロを3回実行

と言う感じ。
ポイントは下に一回移動をいれておくこと。
下に移動をいれることでマクロを繰り返すだけで次の行、次の行、と処理を進められる。


マクロはレジスタに入れられるので"q"で保存したマクロを"p"で張り付けてみたり、"d"で消した文字列を"@"で実行したりとかできたりする。
まぁ、適当に触ってるとなれてくると思います。

インクリメント/デクリメント

マクロと組み合わせて強いのがインクリメントとデクリメント
連番生成などお手の物。

Ctrl-aとCtrl-x
カーソル下の数字を1増やしたり減らしたり...。
単体ではあんまり意味のあるものでないが...。


例:連番の数字を作る方法

i1 --"1"を挿入する
qa --レジスタaにマクロ登録開始
yyp --一行ヤンクして次の行へ貼り付け
 --インクリメント
q --マクロ登録終了

あとは"@a"を連打、ないし"<繰り返し回数>@a"で連番が生成できちゃいます。


え?なに?16進数で欲しい?
それも一発

i0x1 --"0x1"を挿入する
qa --レジスタaにマクロ登録開始
yyp --一行ヤンクして次の行へ貼り付け
 --インクリメント
q --マクロ登録終了

えっと、一行目以外全部同じです。,は何気に16進数にも対応。
"01"(0始まり)にすれば8進数にも!!
"0x"が不要!って時には適当に""の矩形選択で消してしまえばおっけ。


...0はじまりだけど10進数でインクリメントしたい、って時ありますよね。というか普通はそうだよね。
ということで"set nrformats-=octal"しておくことをおすすめします。


まぁ、連番だったら":!seq 100"とかした方が楽かもね。


まぁ、マクロはあくまでextraな機能だから覚えなくてもいいけど、使えるに越したことないので余裕があれば覚えましょう!!


ということでここまでノシ