Vimのexpressionレジスタ「=」で計算結果を挿入する
コード中の数値をちょっと計算したいだけなのに、電卓アプリを開いて結果をコピペしていました。Vimには式を評価してその場に挿入できる特殊なレジスタがあり、これを使えばウィンドウを切り替える必要がなくなります。
目次(10項目)
| キー | これだけ覚える |
|---|---|
| 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('.')を組み合わせる応用も覚えてからは、単純な四則演算以上の場面でも頼るようになっています。
選択した数値を計算して置き換える
式レジスタが実用になるのは、いまバッファにある数値を使って計算するときです。ビジュアルモードで数値を選び、c で消してから Ctrl-r = を押し、レジスタ経由でその値を式に持ち込めます。
v で数値を選ぶ
c " 消して挿入モードへ(消した値は " に入る)
Ctrl-r = @" * 2<Enter> " 消した値を2倍して挿入
単純な増減なら Ctrl-a のほうが速いので、この形が効くのは掛け算や割り算、単位の変換のように Ctrl-a では届かない計算です。
行番号や日付を組み合わせる
式の中ではVimscriptの関数が使えるので、いまの状態を材料にできます。よく使うのは行番号とファイル名です。
Ctrl-r =line('.')<Enter> " 現在の行番号
Ctrl-r =expand('%:t')<Enter> " ファイル名
Ctrl-r =repeat('-', 40)<Enter> " 区切り線を40文字
Ctrl-r =strftime('%Y-%m-%d')<Enter> " 今日の日付
repeat() は覚えておくと便利で、区切り線や桁合わせの空白を数えずに作れます。日付の挿入はstrftimeの記事で詳しく扱っています。
入力履歴から呼び戻す
式の入力欄はコマンドラインの一種なので、履歴が残ります。Ctrl-r = を押したあと ↑ を押せば、前に打った式を呼び戻せます。
同じ計算を少しだけ変えて何度も使うときは、打ち直すより履歴から呼んで直すほうが速く済みます。q= と打てば式の履歴が並んだウィンドウが開き、通常の編集操作で書き換えてから Enter で実行できます。長い式を組み立てるときはこちらのほうが確実です。
まとめ
expressionレジスタはVimを軽い電卓として使える便利な仕組みです。他のレジスタや関数と組み合わせれば、単純な計算以上の応用もできます。レジスタ全般の一覧を参照してください。