Emacs 26.3 build on Cygwin

目次

1 この文書は

2020年8月時点でCygwinパッケージでは Emacs 27.1が配布されています。 Emacs 26.3のビルドを新たに行う事は無いかも知れませんが、27.1で致命的な不具合があった時 の一時しのぎで古いバージョンが欲しい場合などに向けて、「Emacsの雑記」の26.3のビルド方法 の文書を切り出しました。個人的には本文書が「役に立つ事が無い」のを願います。

2 Emacs-W32 on Cygwinについて(26.3)

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.3をベースにしています。過去バージョン向けには Emacs-24.5はこちらを、 Emacs-25.xはこちらを、 Emacs-26.1はこちらを、 Emacs-26.2はこちらを参照してみてください。

  1. 予めCygwinパッケージのemacs-w32(26.3)をインストールしておきます。
  2. Cygwinでビルドします。ビルドに必要なツールやライブラリが揃ってなければ揃えてください。 emacs-26.3のtar-ballは適当な所から拾ってください。 パッチは emacs-w32_26.3_20200429.patch.xzをダウンロード してください。
  3. 適当なディレクトリで 以下の手順でビルドします。2.でダウンロードしたファイルは ~/Downloads ディレクトリ下に置いてあるものとしています。

    xz -dc ~/Downloads/emacs-26.3.tar.xz | tar xf -
    cd emacs-26.3
    xz -dc ~/Downloads/emacs-w32_26.3_20200429.patch.xz | patch -p1
    ./configure --prefix=/usr --with-w32 --without-imagemagick
    make
    
  4. /usr/bin/emacs-w32.exe をビルドしたsrc/emacs.exe で置き換える。 元の実行ファイルは別名で退避しておくのが良いでしょう。
  5. lisp/international/w32-ime.el と lisp/international/w32-ime.elc を/usr/share/emacs/26.3/lisp/international/. にコピーする。
  6. 以下の設定を.emacs(オールドスタイルですみません)に追加する。

    ;;
    ;; IME setup
    ;;
    (set-language-environment "Japanese")
    (load "international/w32-ime" t) ;international/w32-imeが無くてもエラーしないload設定
    (if (and (eq 'w32 (window-system))
             (featurep 'w32-ime))
        (progn
          (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 '("[-]" "[あ]" "[-]"))
          (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パッチ自体は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パッケージについて(2020/4/25更新)。 ビルド例では--without-imagemagick としていますが、26.3では --with-imagemagick でもビルド可能です。 --with-imagemagickでは24.3の時は不安定な実行ファイルができあがりました(参考)。 24.[45], 25.x, 26.[12]ではpdf-tools との相性が悪かった のですが(参考)、26.3では 2019年12月時点でのGitHubのpdf-toolsにパッチを当てる事で相性問題を解消できました (参考)。ただ、微妙に表示が怪しい場合がありましたので、 ここでは --with-imagemagick は任意指定としています。
  • Cygwinでのビルドしか考えてませんのでconfigure.batはメンテしていません。 configure.bat自体が25.x以降サポートされなくなってます。
  • 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に依存しないような根本的な直し方が必要と思われます。
  • image-mode.elの imagemagick-types-inhibit が効いていないバグを修正しています (参考)。もし適用したい場合は手動で /usr/share/emacs/26.3/lisp/image-mode.el.gz および /usr/share/emacs/26.3/lisp/image-mode.elc をどこかに退避するかリネームした上で、ビルドした lisp/image-mode.el および lisp/image-mode.elc を /usr/share/emacs/26.3/lisp にコピーしてください。
  • 「C-x 5 2」(make-frame-command)で新規フレームを生成する際、IMEがONのままだと Segfaultするバグを修正しました(参考)。
  • Windows10で emacs-w32で起動後、ウインドウをマウスで操作する事無くIMEの切り換えを行ってもIME入力が 有効にならないバグをワークアラウンドしてみました(参考)。 確認は「Windows10 Pro 1909(build18363.778)」 で行いました。何故これで上手くいくのか謎な対応方法なのでやっぱりダメな場合はあるかも知れません。 もしやっぱりダメそうな場合は「ウインドウを一回動かす」か 「他のアプリにウインドウフォーカスを移した後、再びウインドウフォーカスを戻す」で対応してみてください。
  • 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を共通化できると思います。

3 履歴

  2020/08/15 : 「Emacsの雑記」から分離。

TOP PREV

著者: TANE