つうさにメモブログ

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

macOS Mojave(10.14)ではEmacsのレンダリングがおかしくなるらしい

注意 不正確な情報が含まれている可能性があります。

MojaveでのEmacs

macOS Mojaveにアップデートすると、GUIEmacsが使えないという情報を見ました。ということで自分は怖くてアプデしていないのですが、現状どうなっているか知るのは重要です。

Emacsアプリケーションを起動しても文字が一切表示されないという不具合は、Cocoaなアプリが使ってるAppkitのせいのようです。以下にMojaveのAppkitについて調べたことを書きます。

AppKit
  • Layer-Backed Views
  • Core Animation
  • NSView
  • drawRect:

以上が今回の件のキーワードみたいです。macOSネイティブアプリを開発してる人ならお馴染みなのでしょうか?

AppKit Release Notes for macOS 10.14Layer-Backed Views に、Mojaveでのアプリの描画について書いてあります。

Windows in apps linked against the macOS 10.14 SDK are displayed using Core Animation when the app is running in macOS 10.14. This doesn’t mean that all views are layer-backed; rather, it means that all views are either layer-backed or draw into a shared layer with other layers.

Mojaveで仕様が変わったようです。自分はCore AnimationとかLayer-Backedなんてさっぱりなのですが、多分これが原因だと思います。Appkitの問題なので、Emacsを端末エミュレータ上で使う場合(emacs -nw)は問題ないはずです。

CocoaGUIを使うための解決法

patchが作られているので、それを当てたEmacsをビルドします。brewemacs-plus Formulaを用いることでで簡単にpatchを当ててビルドできます。

  • $ brew install emacs-plus --HEAD --without-spacemacs-icon

emacs-plusは--HEADオプションをつけると、とある2つのpatchを当ててビルドするようです。一つはemacs公式レポジトリの"scratch/ns-drawing"ブランチとの差分で、もう一つはこのページの最後に置かれてるパッチです。レンダリングについては前者のパッチが効いているようです。

【追記】

コメントにもあるように、patchがEmacs本家リポジトリ(emacs-26ブランチ、後にmasterブランチ)に取り込まれたので、brewでビルドする場合、emacs-plus Formulaを使う必要はなく、emacsを以下のように--HEADをつけてインストールすればpatchが当たった状態でビルド、インストールできます。

  • $ brew install emacs --with-cocoa --HEAD

この方法だと、Emacs27がインストールされます。開発中であり不安定なHEADを使いたくない場合は、将来のEmacs26.2のリリースを待つか、リポジトリemacs-26ブランチからビルドする必要があります。

emacs-mac

また、emacs-macを使うという解決策もあります。

  • $ brew install emacs-mac

emacs-macではNEWS-macに書かれているように、emacs-26.1-mac-7.2 (2018-09-09)で対応済みのようです。上でAppkitのことについて書きましたが、このNEWS-macを見てMojaveでどういった仕様変更があったのかわかりました。普段emacs-macの方を使ってるなら、Mojaveにアプデしてもemacs-macの最新版にアプデすれば問題ないはずです。

補足

Mojaveにアプデしたら使えなくなるのか、Mojaveでビルドしたものだと使えないのかよくわかりません(アプデしても大丈夫という情報もあるため)。 それと、素のemacsemacs-macでは実装が異なるため、症状とその原因も異なる気がするのですけど、どうなのでしょうかね。

以上で簡単な調査結果とします。

Emacs lispではないEmacsのコア部分のソースを理解できてる人はすごいです。

【さらに追記】

Emacs26.2がリリースされました。このバージョンでは上のレンダリング問題が解決しています。

tsuu32.hatenablog.com