2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

emacs + pdf-tools + doom-themes 上で pdf をクリック&ドラッグ → segfault するのをどうにかする

Last updated at Posted at 2022-11-17

はじめに

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-colordoom-themes に含まれる関数であり、 (doom-color 'bg) によって現在 doom-themes で適用している theme の背景色を取得する。
theme-seems-dark-p で theme が light か dark か判定しており、非常に大雑把だが背景色の RGB 値がニュートラルグレーの RGB 値合計より小さければ dark theme だろう、としている。
after-load-theme-hookload-theme 実行後に発火する自作 hook。
theme の確認、 minor-mode 適用は pdf-view-modeload-theme 後に行なわれる。
load-theme 時に pdf-view-mode のバッファがあれば背景色を取得し、必要に応じ minor-mode を適用する。

おわりに

ひとまず動作に支障はなくなったものの、 pdf-tools のみをインストールした最小構成下において adwaita-darkload-theme しても問題は発生しなかった。
vanilla なテーマ管理下では dark theme を使用しても pdf-view-dark-minor-mode は不要なようだ。
doom-theme 側での face の扱いに何かあるのかもしれないが、とりあえず動くのでヨシ。

プライグイン絞り込みの際、有効、無効の切り替えを効率よくできたのは leaf.el のおかげで、とても有り難みを感じた。作者さんには足を向けて寝られない……

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?