Vimのexpressionレジスタ「=」で計算結果を挿入する
コード中の数値をちょっと計算したいだけなのに、電卓アプリを開いて結果をコピペしていました。Vimには式を評価してその場に挿入できる特殊なレジスタがあり、これを使えばウィンドウを切り替える必要がなくなります。
| キー | これだけ覚える |
|---|---|
| Ctrl-r = | インサートモードで式を評価して挿入 |
| "= + p | ノーマルモードで式を評価して挿入 |
| @{レジスタ} | 式の中で他のレジスタの値を使う |
基本の使い方
インサートモードでCtrl-r =を押すと、画面下に式を入力できる状態になります。式を入力してEnterを押すと、その計算結果がカーソル位置に挿入されます。
Total: │ ← インサートモード
12*8<Enter>
Total: 96
Escで抜けると式は破棄され、何も挿入されません。ノーマルモードでは"=のあとにpで貼り付ける形になります。Ctrl-r系の記法全体はこちらにまとめています。
"=12*8<Enter>p
他のレジスタの内容も式の中で使える
Ctrl-r =
@a * 2<Enter>
@{レジスタ名}という記法で、他のレジスタの中身を式の中に埋め込めます。レジスタaにヤンクしておいた数値を2倍にして挿入する、といった使い方ができます。数値だけでなく文字列操作の関数もそのまま使えるので、単純な四則演算にとどまらない柔軟さがあります。
Vim scriptの関数も呼び出せる
Ctrl-r =
strftime('%Y-%m-%d')<Enter>
式の中身はVim script として評価されるため、日付を挿入したり、文字列操作関数を組み合わせたりすることもできます。ちょっとしたテンプレート文字列をその場で生成したいときに応用が利きます。
コマンドラインモードでも使える
expressionレジスタはコマンドラインモードでも同じ要領で使えます。たとえば:s/foo/まで打った状態からCtrl-r =で計算結果を差し込む、といった応用もできます。置換後の文字列を動的に組み立てたいときに地味に役立つ機能です。
評価結果の型に注意
| 評価結果の型 | 挿入される内容 |
|---|---|
| 数値・浮動小数点数 | 自動的に文字列へ変換されて挿入 |
| リスト | 各要素が改行区切りで挿入 |
| 辞書 | string()相当の文字列表現がそのまま挿入される({'a': 1}のような見た目になる) |
| 関数参照(Funcref) | エラー(E729)になる |
辞書はエラーにならず一見動いてしまうぶん、意図しない挿入結果に気づきにくくなります。複雑な式を書くときは、あらかじめ:echoで評価結果を確認してから使うと安全です。詳細な仕様は公式ヘルプ(:h registers)で確認できます。
CSSのpx値をremに変換する計算を毎回電卓アプリでやっていましたが、expressionレジスタでCtrl-r =16/16<Enter>のように打てばその場で結果が挿入されると知ってから、ウィンドウを切り替える手間がまるごと消えました。地味だが積み重なると馬鹿にならない時短効果がありました。連番を振りたいときにline('.')を組み合わせる応用も覚えてからは、単純な四則演算以上の場面でも頼るようになっています。
まとめ
expressionレジスタはVimを軽い電卓として使える便利な仕組みです。他のレジスタや関数と組み合わせれば、単純な計算以上の応用もできます。レジスタ全般の一覧はこちらを参照してください。