つーさにブログ

つうさにのメモ用ブログ

macOS上のEmacsで日本語入力時にカーソルがちらつく話の続き

送ったパッチがバグってた。

カーソルちらつき問題で送ったパッチがバグってた

以前記事にした「macOS上のEmacsで日本語入力時にカーソルがちらつく問題解決まで(Emacsに初めて貢献した話) - つうさにメモブログ」ですが、実は送ったパッチにバグがありました。

f:id:tsuu_mmj:20200225131747g:plain
インプットメソッド有効のときIsearchでバグるの図

上の図のようにインプットメソッドを有効にした状態でIsearchをすると、特定の条件でエラーが発生してしまいます。原因はというと、私がパッチを作るときにIsearchでの挙動をよく確認していなかったからです。

ただ、このバグは「インプットメソッドを有効にした状態でIsearchをするといつでも上のようにエラーが出る」というバグではなかったため、発見が遅れてしまいました。

今回はこのバグを直すためのパッチを送った話です 1

bug-gnu-emacsでやりとり

debbugs.gnu.org

上はbug-gnu-emacsメーリングリストでのやり取り。

結局作ったパッチは、前の記事でアレなパッチとしたNS-specificでないパッチです。Isearchで壊れず、ちらつき問題を解決するパッチはこれしかないと思いました。

Emacs 27(emacs-27ブランチ)はすでにリリース直前ということで、私のパッチはEmacs 28(masterブランチ)に入ることになりました(emacs-27ブランチでは昔私が送ったパッチはrevertされました)2

前回はコミットメッセージが適当な(CONTRIBUTEに書かれている内容に即していない)パッチを送って、push時にAlan Thirdさんにちゃんとしたコミットメッセージを書いていただきましたが、今回はCONTRIBUTEに書かれた内容に即したコミットメッセージを含んだパッチを求められました。ということでCONTRIBUTEとにらめっこしながらコミットメッセージを書いて、パッチを作りました。

作ったパッチをメールで送ったところ、masterブランチにpushされました。 github.com

今回はコミットメッセージも自分で書いたものなので、pushされたコミットを見ると前回よりもっと嬉しいですね。そしてやはり統一されたコミットメッセージはかっこいいです(そして後から見てもわかりやすい)。

パッチに含まれる修正の紹介

今回のパッチは私の前回のパッチのバグ修正だけでなく、macOSのインプットメソッド利用時に関連したちょっとした修正も取り込んでもらいました。これらはmasterブランチのEmacs NS portで利用可能です。

Emacsをクリックしたり、focus outしたりすると未確定文字列が消える問題を修正

パッチ前のEmacsでは、macOSのインプットメソッド利用時において、文字列が未確定状態のときEmacsをクリックしたり、focus out(別のアプリケーションに移るときなど)したりすると未確定の文字列が消えます。これが厄介なのは、未確定の文字列の「表示」が消えるだけで、変換中というコンテキストは維持されたままであることです。よって、見かけ上は変換中ではないけど実は変換中で、次入力を始めたときに消えていた未確定文字列が表れるなどといった非常に奇妙な動作になっていました。

ということでEmacsをクリックしたり、focus outしたりしても未確定文字列が消えないようにしました。

Isearch時の候補ウィンドウの位置を修正

f:id:tsuu_mmj:20200225143841g:plain
Isearchでも候補ウィンドウを適切な位置に置く

今までのEmacsでは、macOSのインプットメソッドを有効にした状態でIsearchしたとき、候補ウィンドウがバッファ上のカーソルの下に出てきてしまっていました。これを、Isearch中はエコーエリアにあるカーソルの下に候補ウィンドウが出現するよう修正しました。

おしまい

これでmacOS上のEmacsで日本語入力時にカーソルがちらつく話はおしまいです。

何回もメールのやり取りをして思いましたが、Emacsにバグ報告をしたりパッチを投げたりするのは案外簡単です。ということで、もしEmacsでバグを見つけたら、Bug Trackerから似たバグを探したり、メールを送ってバグ報告をしたりしてみましょう。

Emacs NS port日本語インライン入力改善パッチの紹介3

最後に宣伝ですが、Emacs本家に取り込まれることは目指してないけど、日本語インライン入力において嬉しい機能を含んだパッチを作ってみました。興味のある方はこのパッチを当ててビルドしてみてください。


  1. もちろんこの話はmacOS上のEmacs限定の話です。

  2. これはEmacs 27ではちらつきが発生してしまうことを意味しますが、私は明らかなバグがある状態をEmacs 27とするよりもちらつきはあるがエラーが出ない状態をEmacs 27としたほうがいいと考えています。

  3. このパッチを「日本語インライン入力改善パッチ」としているのは、「未確定文字列からさらに一部分だけ選択して変換する」という機能が必要なインプットメソッドを私が他に知らないからです。少し気になるので、KotoeriやAqua SKK以外でこのような機能を使うインプットメソッドを知っていたら教えてください。