M-x list-packages 直後のローディング中に雑に spinner を回す
M-x list-packages
名前の通りパッケージのリストを表示する
コマンド呼び出し直後は archive-contents からパッケージの情報を非同期で読み出す
このロード中はモードライン上に :Loadingと表示される
spinner
ロード中にぐるぐる回すやつのEmacs lisp実装
ぐるぐるさせたい人みんな使ってると思われるくらいデファクトスタンダード
M-x list-packages で :Loading だけじゃそっけないから spinner を回したい
M-x list-packages は :Loading の表示にmode-line-processを利用している
package-menu-mode起動時に以下をしている
code:lisp
(setq mode-line-process '((package--downloads-in-progress ":Loading")
(package-menu--transaction-status
package-menu--transaction-status)))
ぱっと見わかりにくいが、mode-line-formatの記法
つまりpackage--downloads-in-progressが non-nil だと :Loading が表示されるようになっている
spinner-startやspinner-stopを適切挟むには、hook だけでなく関数に advice-add しなくちゃいけなそうでめんどそう
ので雑にadd-variable-wathcerを使う
シンボルの値の変更をwatchできるやつ
code:lisp
(add-variable-watcher 'package--downloads-in-progress
(lambda (symbol newval operation where)
(let ((buf (get-buffer "*Packages*")))
(when (buffer-live-p buf)
(with-current-buffer buf
(if newval
(spinner-start 'triangle)
(spinner-stop)))))))
package--downloads-in-progressがnon-nilなら*Packages*バッファでspinner-startするし、nilならspinner-stopする
:Loading の後ろでスピナーが回るようになった。嬉しい。
add-variable-watcher について
デバッグ目的に使うのが主だと思ってたら、マニュアルに
Some possible uses for this feature include keeping display in sync with variable settings, ...
と書かれていたので今回のは間違った使い方ではなさそう
変数デバッグするならM-x debug-watchの方がお手軽
paradox パッケージ
list-package をリッチにしたもので spinner を使っている
spinnerの作者と同じ作者
add-variable-watcherを使わずmode-line-processを適切に設定しているため、 :Loading<spinner> みたいなことになってない
終わり
add-variable-watcher の利用シーンを思いついた稀有な例でした