つうさにメモブログ

つうさにがメモをブログとして書いていくところ

Emacsのall-the-icons.elがアレ

EmacsをモダンなGUIのエディタ(例: VS Code)に追いつけるよう改造したい!という欲望はよく湧くものです。

しかし、自作なんてできずパッケージをインストールするだけで、しかも英語できない弱者の私は災難に遭ってしまいました。とほほ

環境 : Emacs 25.3.1

Dired Sidebar利用における不具合

dired-sidebarはファイルツリーを横に表示するサイドバー機能を提供するパッケージです。neotreeと似たものですが、こっちのほうが速いらしいです(README曰く)。

dired-sidebar-themeを指定することで、いつくかの表示スタイルが選べます。 (setq dired-sidebar-theme 'icons)とすることでall-the-icons-dired-modeを用いてiconを表示してくれます。

しかし、使ってみるとなんかおかしい。色がついてないし、フォルダのアイコンが変。

f:id:tsuu_mmj:20180701004335p:plain
GitHubで見たやつと違う...

原因を調査しました。

all-the-icons-dired

all-the-icons-diredall-the-iconsを用いてDiredでiconを表示してくれるようにするパッケージです。

これ自体に問題はなさそうでした。

all-the-icons

all-the-iconsに問題がありました。

最近のコミット(2018年8月現在)で、Package-Requires(依存パッケージ)からfont-lock+.elを消しています。しかし、中のコードではfont-lock-ignoreをバリバリ使っています。

Emacsではfont-lock-modeが有効だと、テキストプロパティのfaceより、font-lockで設定されているfaceが優先されます。font-lock+は、プロパティにfont-lock-ignoretと設定するとその名の通りfont-lockでのfaceを無視するという機能を提供しています。つまりall-the-iconsでのiconを正常に表示するにはfont-lock+が不可欠です。

しかし、Package-Requiresにないfont-lock+.elは自動でインストールされず、font-lock-ignoreは使えず、表示が意図されていないものになっていたということでした。 これはIssuesにも書かれています。

これのfixとして、font-lock+.elがなくても動作するようにするPull Requestが出されています。

まとめ

結局私はfont-lock+.elをemacswikiから自分でダウンロードしました。

そしたら、いい感じのアイコンになりました。

f:id:tsuu_mmj:20180701004740p:plain
嬉しい

よく確認せずmergeしちゃったの!?って気持ちになりました。さらに、IssueやPRがあるのに作者(メンテナ?)から一切反応がないのも悲しいですね(2018-08-29現在)。でもOSSでこういうことってよくあることだと思います。ソースコードが公開されているおかげで、作者が消えても、「どこがバグの原因で」、「どうすれば直るか確認できる」のがOSSのいいところです(そして、それをIssueやPRとして共有できるのがGitHubのいいところですね)。

私自身、問題が何なのか見つけるのにすごい手間取りましたが、Issueを読んでればもっと早く解決できたという教訓を得ました...

[特別公開] 秘伝のタレ

;;; all-the-icons-dired
(use-package all-the-icons-dired :quelpa t
  :defer t ; M-x all-the-icons-install-fonts
  :config
  ;;; font-lock+
  (use-package font-lock+ :quelpa (font-lock+ :fetcher wiki))
  ;; :hook (dired-mode . all-the-icons-dired-mode)
  )


;;;dired-sidebar
(use-package dired-sidebar :quelpa t
  :bind ("<f8>" . dired-sidebar-toggle-sidebar)
  :config
  (setq dired-sidebar-subtree-line-prefix " .")
  (cond
   ((eq system-type 'darwin)
    ;; (setq dired-sidebar-theme 'icons)
    (setq dired-sidebar-theme 'nerd)
    (setq dired-sidebar-face '(:family "Helvetica" :height 140)))
   (:default
    (setq dired-sidebar-theme 'nerd)
    (setq dired-sidebar-face '(:family "Arial" :height 120))))
  (setq dired-sidebar-use-term-integration t)
  (setq dired-sidebar-use-custom-font t))

これ、all-the-icons使ってなくね...?

追記

all-the-icons.elがアレなのは直ったみたいです。 tsuu32.hatenablog.com