Emacs 26.2 build on Cygwin
1 この文書は
2019年9月時点でCygwinパッケージでは Emacs 26.3が配布されています。 Emacs 26.2のビルドを新たに行う事は無いかも知れませんが、26.3で致命的な不具合があった時 の一時しのぎで古いバージョンが欲しい場合などに向けて、「Emacsの雑記」の26.2のビルド方法 の文書を切り出しました。個人的には本文書が「役に立つ事が無い」のを願います。
2 Emacs-W32 on Cygwinについて(26.2)
TANEが2013年頃からメインに使用しているのはCygwinのEmacs-W32です。 Cygwin上で動作しながらもウインドウ描画などはWindowsネイティブ で動作するという組み合わせです。因みに、2013年より前はX-windowを使う(2013年以降で言うemacs-X11)か、 ターミナルで使う(いわゆる emacs -nw)しかありませんでした。
Cygwin上で動作するのでDLL依存がありますが、外部プロセス実行で発生するもろもろの問題が 解決される(解決が容易になる)利点があります。 ただ、CygwinでパッケージインストールしたEmacs-W32では、MeadowやNTEmacsのようにMS-IMEを使用する ことはできません。そこで、NTEmacsからIME制御部分(いわゆるIMEパッチ)をEmacs-W32とマージして 使用しています。
rzl24ozi氏の作成されたパッチ が IMEパッチのデファクトスタンダードとなっています。 ところが、24.4の時にTANEの環境下でCygwinで野良ビルドして使用していると、IME入力中に 何故かSegmentFaultで落ちる場合があった為、以降自前パッチを使用しています。 もしセカンドソースとしてお役に立つ事があれば幸いです。
Emacs-26.2をベースにしています。過去バージョン向けには Emacs-24.5はこちらを、 Emacs-25.xはこちらを、 Emacs-26.1はこちらを参照してみてください。
- 予めCygwinパッケージのemacs-w32(26.2)をインストールしておきます。
- Cygwinでビルドします。ビルドに必要なツールやライブラリが揃ってなければ揃えてください。 emacs-26.2のtar-ballは適当な所から拾ってください。 パッチは emacs-w32_26.2_20190420.patch.xzをダウンロード してください。
適当なディレクトリで 以下の手順でビルドします。2.でダウンロードしたファイルは ~/Downloads ディレクトリ下に置いてあるものとしています。
xz -dc ~/Downloads/emacs-26.2.tar.xz | tar xf - cd emacs-26.2 xz -dc ~/Downloads/emacs-w32_26.2_20190420.patch.xz | patch -p1 ./configure --prefix=/usr --with-w32 --without-imagemagick make
- /usr/bin/emacs-w32.exe をビルドしたsrc/emacs.exe で置き換える。 元の実行ファイルは別名で退避しておくのが良いでしょう。
- lisp/international/w32-ime.el と lisp/international/w32-ime.elc を/usr/share/emacs/26.2/lisp/international/. にコピーする。
以下の設定を.emacs(オールドスタイルですみません)に追加する。
;; ;; IME setup ;; (set-language-environment "Japanese") (if (eq 'w32 (window-system)) (progn (load "international/w32-ime") (setq w32-ime-buffer-switch-p nil) ; 全バッファでIME状態同期 (kill-local-variable 'w32-ime-mode-line-state-indicator) (setq default-input-method "W32-IME") (setq-default w32-ime-mode-line-state-indicator "[-]") (setq w32-ime-mode-line-state-indicator-list '("[-]" "[あ]" "[-]")) (w32-ime-initialize)))
以上で使えるんじゃないかと思いますが、エラーとか出た時はうまく対応してください(^^;
パッチのざっくりした内容や注意事項は以下です。
- IMEパッチ自体は24.4,24.5向けに emacs-24.2-ime-2012-09-02.patch.tar.gz(リンク切れ)と emacs-24.3-ime-2013-05-03.patch.tar.gz(リンク切れ)を 元にしていました。2013-05-03ではMinGW特化されてしまってそのままではCygwinビルドできなかった為、 ダメだった所は2012-09-02を使用した感じになってます。25.1向けには24.5向けのパッチを元にしています。 また、rzl24ozi氏作成のパッチも一部参考にさせていただいてます。
- IMEは全バッファで状態同期するモードで使用しています。termモード でバッファ再描画を非同期に行った際、IME制御の構造上の問題で勝手に入力確定される場合が あった為です(参考)。ただ、単純に w32-ime-buffer-switch-pをnilにしただけではインジケータの再描画がうまく対応できていなかった為、 lisp/international/w32-ime.elに少し手を入れています。
- オリジナルではJPEG画像表示の時に減色されてしまうのですがフルカラー表示に強制しています (参考)。
- imagemagickパッケージはconfigure実行時に意図的に外しています。 含めてもビルドは完了すると思いますが24.3の時には動作不安定な実行ファイルが できあがりました(参考)。 24.4,24.5,25.x,26.1,26.2 ではpdf-tools との相性が悪かった為 (参考)、 引き続き意図的に外してビルドしています。
- Cygwinでのビルドしか考えてませんのでconfigure.batはメンテしていません。
- termモードのターミナルエミュレーション表示が遅い点を改造しています (参考)。
- 25.1でnyan-modeのような run-with-timer関数を使用したアプリで、time-add関数が 「Specified time is not representable」のメッセージでエラーする場合に対して ワークアラウンドを入れました (参考)。副作用としてtime-add関数の引数に非数(NaN)を 与えた場合(例えば (time-add (/ 0.0 0.0) 1.0) とか)でもエラーにならずに非数を0に変換して 値を返します。
- C-x C-f のファイル読み込みなどで「*.c」のような正規表現で複数のファイルを読み込もうとしたとき 64個以上のファイルを開こうとするとSegfaultになるのをワークアラウンドしています (参考)。ただし、1024個を超えるとダメかも知れません。 FD_SETSIZEに依存しないような根本的な直し方が必要と思われます。
既知のバグ
- emacs-w32で起動後、ウインドウをマウスで操作する事無くIMEの切り換えを行ってもIME入力が有効にならない。 マウスでウインドウを移動もしくはリサイズする事でIME切り換え可能になります。 他のアプリにウインドウフォーカスを移した後、再びemacs-w32にウインドウフォーカスを移すだけでは IME入力が有効にはならないようです。