
Migrate Helm to Vertico Stack
世の流れ的には、HelmといえばKubernetes用のパッケージマネージャー を思い浮かべる人が多いと思いますが、私にとってはHelmといえばやはりemacsのパッケージ を思い浮かべます。emacs-helm(以下helm)は所謂fuzzy finder的なモノの一種で、emacsを使っていない人は雑にfzfとかpecoみたいな絞り込みをemacsでできるようにするやつ、と思えば想像しやすいと思います。 helmはなかなか歴史の長いパッケージで、2012年5月15日にanything.elからForkをしたというコミット が打たれています。私個人としては2015年7月にhelmを導入したっぽい記録(commit /tweet )が残っています。そこから数日前まで、かれこれ8年余りの期間にわたってhelmを使ってきました。使ってきた、とは言っても導入したときに多少使い勝手の調整をして以来、ほとんど設定は変えておらず、機能的にもhelm-M-x、helm-find-files、helm-show-kill-ring、helm-buffers-listくらいしか使っていませんでした。基本的にはMELPAからインストールされる最新版を使っていたのですが、8年使っていてもアップデートで壊れた記憶は多分1回くらいしかなくて、かなりの頻度でコミットが打たれているのに安定していた、という印象があります。 8年の間にも、Ivy/Counsel が話題になったり、icomplete-vertical-mode/fido-vertical-modeという補完UIが標準に追加されたりと、いろいろと流行が変わっていたのは認識はしていたのですが、まぁなんやかんやあり8年間helmを使い続けてきました。 そうこうしていたところ、最近emacs 29.1がリリースされ、同じく長らく使用してきたuse-package (どのタイミングで導入したのかは不明ですが、GitHub上でのfirst commit で既に導入済みだったっぽいのでhelmより長く使っていることになります)がemacs標準搭載となりました。use-package以外のパッケージに関する設定はuse-packageを使ってやっていて、他のパッケージがインストールされていないときにインストールするというのもuse-packageでやっていて、という感じなのですが、そうなるとuse-packageは誰が入れてくれるんだ、ということになり結局use-packageだけはpackage-installを直接呼び出すことでインストールしていた のですが、use-packageがbuilt-inとなったことで、晴れてpackage-installの直接呼び出しも不要となりました 。その変更ついでに、いろいろと設定を見直したりとか、ローカルでのみ設定されていた諸諸をGitHubにpushしたりとか、そんなことをやったのですが、その一環として(?)helmからvertico に乗り換えてみました。 helmからverticoに移行して一番の大きな違いは、helmはそれ自体が巨大パッケージで、いろいろなモノがhelmでまかなわれていましたが、verticoはそれ自体はかなり小さく保たれていて、いろいろなパッケージを組み合わせることで同じような機能を実現する、というところです。個人的にはでかいフレームワークより小さいライブラリ類を組み合わせてアプリを書く方が好きなので、そういった意味でもverticoは好きになることができそうです。 今のところ組み合わせているものはmarginalia とorderless の二つ。 marginaliaはminibuffer completionに何やら情報を足すやつでM-xでコマンドの簡単な説明が見られたり、find-fileでファイルのパーミッションやら最終更新時間やらが見られるようになります。インストールしただけでも情報が見れるようになって便利なのですが、そのままだとファイルの更新時間が2023 Sep 10みたいなかんじで月名を使った表示になっており、分からなくはないんですけど日本人としてはやはり2023-09-10と数字を使って表現してくれた方がぱっと見でわかりやすいので、次の様にadviceでmarginalia--time-absoluteを置き換えることで数字表記に修正しました。 1 2 3 4 5 6 7 8 9 10 (defun marginalia--time-absolute--month-number (time) "Format TIME as an absolute age but use month number instead of month name." (let ((system-time-locale "C")) (format-time-string (if (> (decoded-time-year (decode-time (current-time))) (decoded-time-year (decode-time time))) " %Y-%m-%d" "%m-%d %H:%M") time))) (advice-add 'marginalia--time-absolute :override #'marginalia--time-absolute--month-number) orderlessは候補の絞り込みをするときに、完全一致や前方一致だけでなく、fuzzy matchをしてくれるようになるやつで、たとえばabcと入力するとa.*b.*c.*にマッチする奴を返してくれるようになります(多分これは触らないと便利さはわかりにくい・・・)。 ...