NeovimでCSSを書くとき、line-heightの計算をRaycastに頼っていました。
28 / 16 を計算して貼り付けて、みたいなことを毎回やっていたんですが、昨日「クリップボードから計算結果を貼り付けると、blink.cmpの補完ウィンドウが表示されなくなる」問題が判明して、Neovim内で完結できないかをClaude CodeとCodexに相談することにしました。
最初に試みたのがエクスプレッションレジスタ(<C-r>=)です。Neovim上で計算式を評価して挿入できる仕組みなのですが、整数同士の割り算だと小数点以下が落ちてしまうので扱いにくくて。しかも計算結果のプレビューが表示されないから、挿入してみるまで結果がわからない。28/16 と入れるつもりが 16/28 の順番で入れてしまって 0 が返ってくる、みたいな失敗をよくやっていたので、結局Raycastに戻っていました。
今日はそこを解決しようと、カスタマイズしてもらうことにしました。opusplanでプランを作成、Codexのプランレビューで大幅に書き換えてもらって、Sonnetで実装してもらったあと、不具合があったのでCodexにもう一度修正してもらうという流れ。最終的に ~/.config/nvim/lua/utils/calc.lua の1ファイルだけで完成して、計算式を入力すると小さな入力欄の右側に結果がプレビューされる形になりました。
キーマップ選びに結構迷いました。Claude Codeの実装では <C-g>= で登録されていましたが、なんとも押しづらいし覚えにくい。Codexには <M-=> を勧められましたが、最近Optionキーを押すのが億劫になってきていて(Neovimのホームポジション信仰に毒されてきています)。
結局 <C-e> にしました。Codexからは「blink.cmpの補完UIと被りやすい」と止められていたんですが、気づくとなんとなくCtrl+Eを押しているクセがあるし、エクスプレッションの「e」として覚えやすそうだったので。
使ってみたら、blink補完のポップアップを閉じるのも <C-e> なので、補完が開いている状態で2回押すと補完をキャンセルしてから計算機が立ち上がるようになっていました。Codexに「被る」と言われていたキーが、結果的に2回押しで使い分けできるようになっていた感じです。
-- 計算プレビュー(インサートモードで式評価→結果を挿入)
map("i", "<C-e>", function() require("utils.calc").open() end, { desc = "計算プレビュー" })
実際の使い方としては、インサートモードで <C-ee>(eを2回) を押して 28/16 と入れると入力欄の右側に = 1.75 が出て、Enterでそのまま本文に挿入できます。
キーマップの=系は確かに直感的ではあるんですが、Neovimに慣れてくるとOptionキーや=キーみたいなホームポジションから離れるキーが目立って押しづらく感じてきます。
IDEの頃からRaycastでやっていたコーディング中のちょっとした計算がNeovim内で完結できるようになって、めっちゃ良い感じです。