📝

忘れっぽいNeovim使いに贈るtoggle-cheatsheet.nvimの紹介

に公開

概要

Neovimの右下にチートシートポップアップを表示できるプラグイン、toggle-cheatsheet.nvimを作成しました。

https://github.com/sirasagi62/toggle-cheatsheet.nvim

モチベーション

プラグインの導入直後や設定をいじった直後にどのキーマップがどれだか分からなくなってしまうことがしばしばあります。毎回init.luaを見に行くのは面倒なので、覚えたい操作をどこかにメモして手軽に表示できるような仕組みが欲しくなりました。これを実現するためにtoggle-cheatsheet.nvimを開発しました。

設定

チートシートをテーブルあるいはプレーンテキストで作成するだけです。

-- プラグインのロード
local tcs = require('toggle-cheatsheet').setup(true)

-- チートシートを定義する
local cs1 = tcs.createCheatSheetFromSubmodeKeymap(
  tcs.conf{
    {"h","←"},
    {"j","↓"},
    {"k","↑"},
    {"l","→"},
    {"gg","Go to the top"},
    {"G","Go to the bottom"},
    {"%","Go to matching bracket"}
  }
)

-- 別のチートシートを定義する。ただのテキストでも問題ない。
-- 日本語が含まれていても問題ない
local cs2 = [[
Ctrl+{f|b}:1スクリーン上/下
Ctrl+{d|u}:半スクリーン上/下
Ctrl+g    :現在のファイル名と
           行数を表示
]]

-- 適当なキーにマッピング
-- 例ではkeymapを使っていますがコマンドでも問題なく動作するはずです

vim.keymap.set("n","<Leader>q",function()
    tcs.toggle(cs1)
end)
vim.keymap.set("n","<Leader>Q",function()
    tcs.toggle(cs2)
end)

フローティングウィンドウのポジションや高さや幅については一切考える必要ありません。プラグインが内部で計算して、いい感じに処理してくれます。また、普通のフローティングウィンドウだとタブを切り替えると追従してくれないのですが、それもsetup関数にtrueを渡すことで、追従するようにしてくれます。
 
 プラグインは内部的にどのチートシートを表示しているかを記録しているため、toggle関数で、あるチートシートから別のチートシートに切り替えることができます。これによって、状況に応じて様々なチートシートを切り替えられるようになっています。
 
 また、例にもあるようにキーマップを記録したテーブルからチートシートを作ることもできます。そのため、次のようにvim.keymap.setのラッパー関数を適当に定義して、テーブルを自動生成させるようにすれば、キーマップを書くだけでチートシートを作成できます。

normal_keymap={}
-- normal mode keymap
function set_nk(keymap,action,desc)
    vim.keymap.set("n",keymap,action,{desc=desc})
    normal_keymap[#normal_keymap+1]={keymap,desc}
end
-- setnk関数でキーマップを追加
set_nk('p',  'p`]','Paste and move to the end')

-- set_nk関数で作成したキーマップからチートシートを生成
local cs1 = tcs.createCheatSheetFromSubmodeKeymap(
  tcs.conf(normal_keymap)
)

まとめ

toggle-cheatsheet.nvimを紹介しました。キーマップを覚えるのが苦手な方はぜひ試してみてください!

Discussion