かすれた*Pluser*の巻物


Emacs Double Buffering 対応がカーソルの異常点滅を引き起こす

Emacs26.1が5月28日にリリースされました。 いくつか大きな新機能・変更点を挙げておくと、

  • 限定的なLispスレッドの導入(協調的にマルチタスクができる)
  • X上でのちらつき防止のためのダブルバッファ対応
  • 行番号表示をネイティブサポート(プラグインでのサポートに比べてパフォーマンスが向上)
  • 行単位での水平スクロール(今まではスクロールすると画面全体がスクロールした)

となっています。

この中で、今回の話はダブルバッファ対応に関係しています。

非端末上のEmacsのカーソルは、設定次第で点滅させることができます。 私のEmacsも点滅する設定になっているのですが、Emacs26.1へのアップデート直後から、カーソルの点滅が異常でした。 通常は点灯したり消灯したりを一定の比率で繰り返すのですが、不規則な点滅とでも表現すれば良いのでしょうか、点灯が長く続いたり、一瞬だけカーソルが点灯して後は全く見えなくなってしまったりと、挙動が変です。 確認のためにEmacs25.4に戻すと、カーソルは正常に動作します。

しばらく原因を探った結果、Emacsのダブルバッファリング対応が悪さをしていると分かりました。 手元の環境では、今までにEmacsでちらつきを経験したこともなく、またそもそもXにdbe(Double Buffering Extension)もロードしていませんでした。 そのため、今回から導入されたダブルバッファリングを禁止することで、問題を解決できました。

ダブルバッファリングを禁止するには、起動時に読まれるinit.elファイルなどに以下のように記載するだけです。

(set-frame-parameter nil 'inhibit-double-buffering t)

これでうまく動作するようになりました。