今回は超小ネタです。

最近はEmacs上でのcompletionとして、orderlessなどの標準のcompletion-readなどに則ったものを利用してます。Emacsの標準補完は、実はかなり柔軟性に富んでいて、様々なカスタマイズが可能になっています。

completion-readのカスタマイズでは、 completion-category-overrides という変数で、completion-readによるマッチング方法を categoryごとに 変更することができます。

このcategory、 completion-metadata という関数で取得できるmetadataから取得することができます。

(completion-metadata-get
 (completion-metadata "" table nil)
 'category)

このtableとは、(私の理解だと)completion-readの第二引数として渡す関数です。この関数は、第3引数としてactionを取り、このactionに 'metadata というシンボルが渡された場合は、metadataを返す必要があります。

completion-metadata-getはこれらのmetadataから、特定の情報を取得するものです。なので、あるパッケージの補完をカスタマイズしたいときは、これを調べればカスタマイズできます。

・・・が、場合によってはcompletion-readの呼び出しでlambdaを利用していて、 completion-metadata が使えないケースがあります。

実際、org-roam-node-findではlambdaで渡されており、categoryを知るためには結局その中身まで見る必要がありました

そういう場合は、しかたがないのでパッケージの中を completion-read で検索してみると大体見付かります。

そんな場合もあるんだよ、というメモでした。