はじめに
pdf-tools
が便利そうだと導入してみたはいいものの、 segfault して困ったため備忘録として。
環境
- MacBook Air M1 2020
- macOS Ventura (13.0.1)
- Emacs Plus 28.2
- テーマの管理に
doom-themes
を使用
- テーマの管理に
原因
ネットで検索してもそれらしいものがない + まっさらな状態から pdf-tools
導入しても再現しなかったため、 emacsen ではなくプラグインを疑った。
怪しそうなプラグインを探すうち doom-themes
が原因っぽいと判断。
さらに dark theme では再現するが、light themeでは再現しないようだった。
そこで、 dark theme 使用時に pdf-view-dark-minor-mode
を有効化したところひとまず segfault はしなくなった。
しかしテーマの変更時にいちいち minor-mode を気にするのも煩わしいため、背景がニュートラルグレーより暗っぽければ dark theme と判断し minor-mode を有効化する方向で解決を試みた。
解決
コードは以下。
パッケージの管理には leaf.el
を使用している。
(leaf *switch-pdf-view-dark :after doom-themes
:doc "detect whether doom-theme bg color seems dark"
:preface
(defun theme-seems-dark-p ()
"Check `(doom-theme 'bg)'. If theme seems to be dark, returns t"
(< (apply '+ (color-name-to-rgb (doom-color 'bg))) 1.5))
:hook
(pdf-view-mode-hook . (lambda ()
(if (theme-seems-dark-p)
(pdf-view-dark-minor-mode +1)
(pdf-view-dark-minor-mode -1))))
(after-load-theme-hook . (lambda ()
(dolist (buff (buffer-list))
(with-current-buffer buff
(when (eq major-mode #'pdf-view-mode)
(if (theme-seems-dark-p)
(pdf-view-dark-minor-mode +1)
(pdf-view-dark-minor-mode -1)))))))
)
doom-color
は doom-themes
に含まれる関数であり、 (doom-color 'bg)
によって現在 doom-themes
で適用している theme の背景色を取得する。
theme-seems-dark-p
で theme が light か dark か判定しており、非常に大雑把だが背景色の RGB 値がニュートラルグレーの RGB 値合計より小さければ dark theme だろう、としている。
after-load-theme-hook
は load-theme
実行後に発火する自作 hook。
theme の確認、 minor-mode 適用は pdf-view-mode
と load-theme
後に行なわれる。
load-theme
時に pdf-view-mode
のバッファがあれば背景色を取得し、必要に応じ minor-mode を適用する。
おわりに
ひとまず動作に支障はなくなったものの、 pdf-tools
のみをインストールした最小構成下において adwaita-dark
を load-theme
しても問題は発生しなかった。
vanilla なテーマ管理下では dark theme を使用しても pdf-view-dark-minor-mode
は不要なようだ。
doom-theme
側での face の扱いに何かあるのかもしれないが、とりあえず動くのでヨシ。
プライグイン絞り込みの際、有効、無効の切り替えを効率よくできたのは leaf.el
のおかげで、とても有り難みを感じた。作者さんには足を向けて寝られない……
参考
- vedang/pdf-tools: Emacs support library for PDF files.
- doomemacs/themes: A megapack of themes for GNU Emacs.
- d12frosted/homebrew-emacs-plus: Emacs Plus formulae for the Homebrew package manager
- conao3/leaf.el: Flexible, declarative, and modern init.el package configuration