Emacs 27.2 +パッチ20210328版 build on Cygwin
1 この文書は
2021年10月時点でCygwinパッケージでは Emacs 27.2が配布されています。 emacs-w32_27.2_20211003.patchxzを公開した為、本emacs-w32_27.2_20210328.patch.xzを使用した ビルドは古いものとなりましたが、致命的な不具合があった時の一時しのぎで古いバージョンが 欲しい場合などに向けて、「Emacsの雑記」の27.2+パッチ20210328版 のビルド方法の文書を切り出しました。 個人的には本文書が「役に立つ事が無い」のを願います。
2 Emacs-W32 on Cygwinについて(27.2 +パッチ20210328版)
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パッチのデファクトスタンダードでした。 時は流れて2020年末に 細田さんによるプロジェクト 「Emulator of GNU Emacs IME patch for Windows (tr-ime)」 で、ダイナミックモジュール機構を利用して IMEパッチの無いバイナリでもIMEパッチ相当の動作で MS-IMEによる日本語入力を行えるようになっています。 何よりもMELPAのパッケージに登録されているので、 IMEパッチよりもずっと手軽にIMEを利用できるようになっています。
という訳で2021年3月現在「IMEパッチって要るの?」って感じなのですが、 自分好みに大分自由にいじってしまってます😅 IME以外の部分についても具合の悪いと 思った点を実験的に弄っている部分がありますので、もしお役に立つような事がありましたら幸いです。
Emacs-27.2をベースにしています。過去バージョン向けには Emacs-24.5はこちらを、 Emacs-25.xはこちらを、 Emacs-26.1はこちらを、 Emacs-26.2はこちらを、 Emacs-26.3はこちらを、 Emacs-27.1(+パッチ20200815版)はこちらを Emacs-27.1(+パッチ20200901版)はこちらを 参照してみてください。
- 予めCygwinパッケージのemacs-w32(27.2)をインストールしておきます。
- Cygwinでビルドします。ビルドに必要なツールやライブラリが揃ってなければ揃えてください。 emacs-27.2のtar-ballは適当な所から拾ってください。 パッチは emacs-w32_27.2_20210328.patch.xzをダウンロード してください。
任意のディレクトリで 以下の手順でビルドします。2.でダウンロードしたファイルは ~/Downloads ディレクトリ下に置いてあるものとしています。
xz -dc ~/Downloads/emacs-27.2.tar.xz | tar xf - cd emacs-27.2 xz -dc ~/Downloads/emacs-w32_27.2_20210328.patch.xz | patch -p1 ./configure --prefix=/usr --with-w32 --with-imagemagick make
- /usr/bin/emacs-w32.exe と /usr/bin/emacs-w32.pdmp をそれぞれビルドした src/emacs.exe と src/emacs.pdmp で置き換える。 元の実行ファイルは別名で退避しておくのが良いでしょう。
- lisp/international/w32-ime.el と lisp/international/w32-ime.elc を/usr/share/emacs/27.2/lisp/international/. にコピーする。
以下の設定を.emacs(オールドスタイルですみません)に追加する。
;; ;; IME setup ;; (set-language-environment "Japanese") (load "international/w32-ime" t) ;international/w32-imeが無くてもエラーしないload設定 (when (eq 'w32 (window-system)) ;; tr-imeと同居する場合は以下の2行を有効にする ; (require 'tr-ime) ; (tr-ime-advanced-install) (when (featurep 'w32-ime) (setq w32-ime-buffer-switch-p nil) ; 全バッファでW32-IME状態同期 (setq default-input-method "W32-IME") ; (setq-default w32-ime-mode-line-state-indicator "[-]") ; (setq w32-ime-mode-line-state-indicator-list '("[-]" "[あ]" "[-]")) (setq w32-ime-mode-line-state-indicator-list '("[-]" (format "[%s]" current-input-method-title) "[-]")) (setq w32-ime-input-method-title "あ") (setq-default mode-line-mule-info `("" ,(propertize "%z" 'help-echo 'mode-line-mule-info-help-echo 'mouse-face 'mode-line-highlight 'local-map mode-line-coding-system-map) (:eval (mode-line-eol-desc))) ) (w32-ime-initialize) (defun w32-isearch-update () (interactive) (isearch-update)) (define-key isearch-mode-map [compend] 'w32-isearch-update) (define-key isearch-mode-map [kanji] 'isearch-toggle-input-method) (define-key isearch-mode-map "\C-o" 'isearch-toggle-input-method) (add-hook 'isearch-mode-hook (lambda () (setq w32-ime-composition-window (minibuffer-window)))) (add-hook 'isearch-mode-end-hook (lambda () (setq w32-ime-composition-window nil))) ) )
以上で使えるんじゃないかと思いますが、エラーとか出た時はうまく対応してください(^^;
パッチのざっくりした内容や注意事項は以下です。
- IMEに関係するパッチについて
- 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を使用した感じになってます。また、rzl24ozi氏作成のパッチも一部参考にさせていただいてます。
- 変数w32-ime-buffer-switch-pをnilに設定(全バッファでW32-IME状態同期)したとき 「M-x set-input-method」
でW32-IME以外のIMを選択してもアクティブにできないバグを 修正しました(参考)。
※補足: W32-IMEは他のIMと違ってEmacsの外部で制御されるイメージです。この為、W32-IMEのバッファと他IMのバッファとを other-window(C-x o)などで行き来する際、「W32-IMEとその他のIMが同時にONになりそうな場合は衝突回避の為に一旦両方OFFにする」 という動きになります。テスト版の時のメモも参照いただければと思います(参考)。 - インジケーター設定変数 w32-ime-mode-line-state-indicator-list に 指定するリストの要素にリストを指定出来るようにしました。 また、w32-ime-mode-line-state-indicator は不要になりました(あっても参照していません)。 リストを指定場合eval した結果文字列がインジケーターとして表示されます。 これによりW32-IME以外の IMの場合でも current-input-method-title の文字列を表示できるようになりました。
- mode-lineに表示されたインジケーターのマウスオーバーに対応しました。 マウスカーソルをかざすとToolTipが表示されます (参考)。
- isearch(C-s)の文字列入力時にinput-methodの表示に対応できるように lisp/international/w32-ime.elに手を加えました(参考)。 ただし、w32-imeで対応しているmode-lineに表示 されるインジケーターと二重表示になるので .emacsに対応した記述が必要となります。 設定例では、lisp/bindings.elで定義されている変数 mode-line-mule-info をカレントインプットメソッド 表示を行わないように再定義しています。
- IMEパッチの当たっていないCygwinパッケージインストールした emacs-w32 と.emacsを共通化できる ようにlisp/international/w32-ime.elに手を加えました。もしIMEパッチ無しの emacs-w32 で international/w32-ime をロードした場合、(featurep 'w32-ime)の結果がnilとなります。 また、international/w32-imeをロードする際の missing-ok フラグを t にする事で、 IMEパッチがそもそも無いEmacs(例えばLinuxのEmacsなど)とも.emacsを共通化できると思います。
- w32-ime.elを読み込んだ時、(window-system)の戻り値が'w32ではないとき W32-IMEをレジストしないようにしました。 例えば「emacs-w32 -nw」で起動した時は「M-x set-input-method」の選択候補にW32-IMEは含まれなくなります。
- IMEは全バッファで状態同期するモードで使用しています。 w32-ime-buffer-switch-pをnilにしただけではインジケータの再描画がうまく対応できていなかった為、 lisp/international/w32-ime.elに手を入れています。 また「w32-ime-buffer-switch-p を t にした場合(バッファ毎にIMEの状態を保持するモード)」 でのtermとIMEの相性問題を対応したつもりですが、 副作用があるかも知れません。
- W32-IMEの機能である単語登録関数 w32-ime-toroku-region が 機能していないようだったのを対応してみました。 しかし、Windows10の20H2では単語登録ダイアログが開けなくなってしまった為、結局機能しません😓 (参考: 単語登録を行うWin32APIである ImmConfigureIME の実験)
- 「C-x 5 2」(make-frame-command)で新規フレームを生成する際、IMEがONのままだと Segfaultするバグを修正しました(参考)。
- Windows10で emacs-w32で起動後、ウインドウをマウスで操作する事無くIMEの切り換えを行ってもIME入力が 有効にならないバグをワークアラウンドしてみました(参考)。 何故これで上手くいくのか謎な対応方法なのでやっぱりダメな場合はあるかも知れません。 もしやっぱりダメそうな場合は「ウインドウを一回動かす」か 「他のアプリにウインドウフォーカスを移した後、再びウインドウフォーカスを戻す」で対応してみてください。
- フォント設定を行っていない場合(例えば -Qオプションで起動した時など)、「MS Gothic-10」が最優先となるようにしました。 もし、他のフォントが良いとかサイズを変えたい場合などは各自でソースコードを弄っていただければと思います。
- USE_W32_IMEをdefineしない場合(即ちW32_IMEパッチを含まないビルドを行う場合)に コンパイルエラーするのを修正しました。 configure実行後、src/config.hの 「#define USE_W32_IME 1」となっている箇所を削除すれば IMEパッチに関係する機能を 含まないビルドが可能になっていると思います。 すみませんがconfigureオプションでは指定できるようになってません....
- IME以外のEmacs本体に関するパッチについて
- オリジナルではJPEG画像表示の時に減色されてしまうのですがフルカラー表示に強制しています (参考)。
- imagemagickパッケージについて 26.3までのビルド例では--without-imagemagickとしていましたが、27.1以降--with-imagemagickとしました。 もし動きが怪しいようならば--without-imagemagickで様子を見てみるという手はあるかも知れません。 因みに、--with-imagemagickでは24.3の時は不安定な実行ファイルができあがりました(参考)。 24.[45], 25.x, 26.[12]ではpdf-tools との相性が悪かった のですが(参考)、26.3では 2019年12月時点でのGitHubのpdf-toolsにパッチを当てる事で相性問題を解消できました (参考)。27.1以降でも相性問題の対応は必要です。
- termモードのターミナルエミュレーション表示が遅い点を改造しています (参考)。
- C-x C-f のファイル読み込みなどで「*.c」のような正規表現で複数のファイルを読み込もうとしたとき 64個以上のファイルを開こうとするとSegfaultになるのをワークアラウンドしています (参考)。ただし、1024個を超えるとダメかも知れません。 FD_SETSIZEに依存しないような根本的な直し方が必要と思われます。
- 27.1以降で画像を180°回転させたときに表示が化けるバグを修正しています(参考)。
- 27.1以降のewwではHTMLのbodyタグに指定したbgcolorでバックグラウンドが塗られないバグがあります (参考1,参考2)。 その後、Emacs gitリポジトリに登録されている lisp/net/shr.elで修正されています。修正されているshr.elをそのまま210328版パッチに同梱しました。
- 環境変数LANGがja_JP.UTF-8のようにシフトJIS系ではない設定の場合に、 日本語文字フォント名(フォントファミリ)の フォントを設定できなかったり、 describe-fontコマンドでフォント名が化ける場合があった(参考) のを対応してみました。内部的にUTF-16を扱うWin32APIを使用するようにしたので LANGの影響は受けないようになっています。
- フォント名にハイフン「-」が含まれていると「Invalid font name」のエラーメッセージが 出る場合があったのに対応してみました。 Emacs内部でフォントを扱う場合にXLFDという フォーマットで扱っているようなのですが、ハイフンをフィールドの区切り文字に使用している 構造欠陥が原因のようです(参考)。 ワークアラウンド的な対応の為、如何なる場面に対しても万事解決という訳ではないかも知れません。
- フォントによって幅や高さが異常に大きくなる場合があるのに対応してみました (参考)。 ポイント値からDPIとスケーリングが考慮されたピクセルサイズの高さが、 1.16倍を 超えるようなサイズになった場合は、ピクセルサイズを元にアセント値とディセント値を 再計算しています。 対処方法としては正しくないかも知れません。
- harfbuzzが有効な時、Cygwinでは cygharfbuzz-0.dll を読み込むようにしました (参考)。 ただ、対応してみたもののuniscribeとの違いがよく判ってません😓
その他
- --with-imagemagickでビルドした 27.1で JPEG2000画像フォーマットのファイルを表示させた際、 SegfaultでEmacsが落ちる事がありました(参考)。 因みに、ImageMagick自体もJPEG2000画像を表示できない状態でした。 ImageMagickを自前でビルドする際に--with-gslibというconfigureオプションを外してビルドし、 DLL(cygMagickCore-7.Q16HDRI-7.dllとcygMagickWand-7.Q16HDRI-7.dll)を Cygwinパッケージのものと入れ替える事で対応する必要がありました (参考)。