Emacs 29.4 +パッチ20240624版 build on Cygwin

目次

1. この文書は

2024年6月時点でCygwinパッケージでは Emacs 29.4が配布されています。 emacs-w32_29.4_20240813.patch.xzを公開した為、本emacs-w32_29.3_20240624.patch.xzを使用したビルドは 古いものとなりましたが、説明と合わせた記録として「Emacsの雑記」の文書を切り出しました。

2. Emacs-W32 on Cygwinについて(29.4 +パッチ20240624版)

TANEが2013年頃からメインに使用しているのはCygwinのemacs-w32です。 Cygwin上で動作しながらもウインドウ描画などはWindowsネイティブ で動作するという組み合わせです。因みに、2013年より前はX-windowを使う(2013年以降で言うemacs-X11、2022年以降で言うemacs-gtk)か、 ターミナルで使う(いわゆる 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を利用できるようになっています。

という訳で2024年6月現在「IMEパッチって要るの?」って感じなのですが、 自分好みに大分自由にいじってしまってます😅 IME以外の部分についても具合の悪いと 思った点を実験的に弄っている部分がありますので、もしお役に立つような事がありましたら幸いです。

Emacs-29.4をベースにしています。 過去バージョン向けには

  • Emacs-24.5はこちらを、
  • Emacs-25.xはこちらを、
  • Emacs-26.1はこちらを、 Emacs-26.2はこちらを、 Emacs-26.3はこちらを、
  • Emacs-27.1(+パッチ20200815版)はこちらを、 Emacs-27.1(+パッチ20200901版)はこちらを、 Emacs-27.2(+パッチ20210328版)はこちらを、 Emacs-27.2(+パッチ20211003版)はこちらを、
  • Emacs-28.1(+パッチ20220417版)はこちらを、 Emacs-28.2(+パッチ20220917版)はこちらを、 Emacs-28.2(+パッチ20221209版)はこちらを、
  • Emacs-29.1(+パッチ20230805版)はこちらを、 Emacs-29.1(+パッチ20230909版)はこちらを、 Emacs-29.2(+パッチ20240203版)はこちらを、 Emacs-29.3(+パッチ20240329版;問題あり)はこちらを、 Emacs-29.3(+パッチ20240331版)はこちら

参照してみてください。

ビルドとインストール方法は以下の通りです。

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

    xz -dc ~/Downloads/emacs-29.4.tar.xz | tar xf -
    cd emacs-29.4
    xz -dc ~/Downloads/emacs-w32_29.4_20240624.patch.xz | patch -p1
    ./configure --prefix=/usr --with-w32 --with-imagemagick --with-native-image-api
    make -j $(nproc)
    

    「--with-imagemagick」や「--with-native-image-api」はお好みでどうぞ。

  4. /usr/bin/emacs-w32.exe (と、もしあれば /usr/bin/emacs-w32.pdmp も; emacs-29.4-1では.pdmpは無いようです)を それぞれビルドした src/emacs.exe と src/emacs.pdmp で置き換える。 元の実行ファイルは別名で退避しておくのが良いでしょう。
  5. lisp/international/w32-ime.el と lisp/international/w32-ime.elc を/usr/share/emacs/29.4/lisp/international/. にコピーする。
  6. 以下の設定を.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)))
        )
      )
    

以上で使えるんじゃないかと思いますが、エラーなど出た時はうまく対応してください😅

ネイティブコンパイルについて

  • 28.1からELISPのネイティブコンパイル機能が利用可能になりました。 Cygwin64では 29.4-1 はネイティブコンパイル無し、29.4-2 はネイティブコンパイル有効でテスト版としてリリースされています (emacs 29.4-1emacs 29.4-2 (TEST)) Cygwin64の場合はconfigureオプションに「--with-native-compilation」を追加することで有効になります。 実際に使うと色々(特にrebaseに関連して)ハマりどころがありそうです。もし有効にして事件に遭遇した場合は がんばって対応するしかないようです😅
    拙作のパッチ適用は自前でビルドする事を前提としていますので、ネイティブコンパイルの有無はお好きな方を選んでいただければ良いかと思います。
  • Cygwin32では未サポートという扱いですが、特別なconfigureオプション「--with-cygwin32-native-compilation」で ビルドを行う事はできるようです。ただ起動してみると「child_info_fork::abort」メッセージが出てまともに使える感じではありませんでした。 Cygwin 3.4以降、Cygwin32はサポートされなくなりました。

パッチのざっくりした内容や注意事項は以下です。

  • 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では(22H2時点でも)単語登録ダイアログが開けなくなってしまった為、結局機能しません😓 (参考: 単語登録を行うWin32APIである ImmConfigureIME の実験)
      もう機能する事は無さそうです(2023年8月時点)。
    • 「C-x 5 2」(make-frame-command)で新規フレームを生成する際、IMEがONのままだと Segfaultするバグを修正しました(参考)。
    • Windows10で emacs-w32で起動後、ウインドウをマウスで操作する事無くIMEの切り換えを行ってもIME入力が 有効にならないバグをワークアラウンドしてみました(参考)。 何故これで上手くいくのか謎な対応方法なのでやっぱりダメな場合はあるかも知れません。 もしやっぱりダメそうな場合は「ウインドウを一回動かす」か 「他のアプリにウインドウフォーカスを移した後、再びウインドウフォーカスを戻す」で対応してみてください。
    • フォント設定を行っていない場合(例えば -Qオプションで起動した時など)、「MS Gothic-10」が最優先となるようにしました。 もし、他のフォントが良いとかサイズを変えたい場合などは各自でソースコードを弄っていただければと思います。
      ※補足:IMEパッチと連動したのは「MSゴシック」が日本語版Windowsに標準搭載される和文フォントという位置づけのため、 日本語文字を入力する為のIMEパッチと連動させるのが良い(逆にIMEパッチが無いのであれば和文フォントをデフォルトにする 必要は無い)と考えたからです。
    • USE_W32_IMEをdefineしない場合(即ちW32_IMEパッチを含まないビルドを行う場合)に コンパイルエラーするのを修正しました。 configure実行後、src/config.hの 「#define USE_W32_IME 1」となっている箇所を削除すれば IMEパッチに関係する機能を 含まないビルドが可能になっていると思います。 すみませんがconfigureオプションでは指定できるようになってません....
    • Cygwin64でビルドした際にワーニングになるコードがあったのを修正しました。 SetWindowLong()とGetWindowLong()を使うコードは32bitと64bitで共通コードにできないのか...?🤔
    • Emacs 28系でイベントの発生状況が変わった事から、IMEのステータス表示の更新に ELISP機能の run-with-timerを 使用するようにlisp/international/w32-ime.elを更新しました(参考)。
    • emacs-w32_29.1_20230909.patch.xzから バッファのテキストスケール変更 (C-x C-+, C-x C--, C-x C-0, C-mouse wheel)で変更されたフォントサイズに IMEで変換中のインライン表示の フォントサイズが連動するように対応してみました(参考)。
      伝統的に、Emacsバッファ表示と変換中インライン表示のフォントのサイズがズレるという問題に対処する為に

      (modify-all-frames-parameters '((ime-font . "MeiryoKe_Console-9"))) ;インライン表示フォントのズレに対応する伝統的な方法
      

      のように フレームパラメータの ime-font にEmacsバッファ表示と合うようにフォントファミリ名を指定するという方法がありますが、 本パッチでは「環境変数LANGがja_JP.UTF-8のようにシフトJIS系ではない設定の場合に ...」で直したフォント関連対応が 作用している為、ime-fontを指定しなくても Emacsバッファ表示と 変換中インライン表示のフォントファミリは連動するように なっていました(サイズが対応できていなかったので今回はそれを対応した)。本対応では以下のような振舞いになります。

      • ime-fontを指定しない(もしくは「(ime-font . nil)」の)場合、変換中インライン表示は Emacsバッファ表示に応じてフォントファミリとサイズが自動的に連動します。 ただし、フォントによっては微妙にサイズがズレる場合があります。そういうものだと思ってやってください💦 emacs-w32_29.2_20240203.patch.xzで追加されたフォントサイズ補正を抑止するとサイズがズレる 事はなくなります。各自の要件に合わせて設定いただければと思います。
      • (ime-font . "MeiryoKe_Console")」のように ime-fontにフォントファミリ名(のみ)を指定した場合、 変換中インライン表示の フォントファミリは ime-fontで指定したものを、サイズはEmacsバッファ表示に連動します。 これもフォントによってサイズがズレる場合があります💦 emacs-w32_29.2_20240203.patch.xzで追加されたフォントサイズ補正を抑止するとサイズがズレる 事はなくなります。各自の要件に合わせて設定いただければと思います。
      • (ime-font . "MeiryoKe_Console-10.5")」のように ime-fontにフォントファミリ名とサイズを指定した場合、 変換中インライン表示は Emacsバッファ表示によらず常に ime-fontで指定したフォントファミリとサイズで表示されます。

      変数w32-ime-enable-font-scalingを nilにすると emacs-w32_29.1_20230805.patch.xz 以前の動作に戻ります。 デフォルトは tになっています。

  • 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以降でも相性問題の対応は必要です。 28.2+パッチ20221209版以降 Emacs本体でimagemagick-render-typeを無視するようにしました (2022年12月時点の新しいpdf-toolsでも設定されていてバージョンアップ等の理由でパッケージインストールすると ハマる可能性があったので(参考))。
    • termモードのターミナルエミュレーション表示が遅い点を改造しています (参考)。
    • C-x C-f のファイル読み込みなどで「*.c」のような正規表現で複数のファイルを読み込もうとしたとき 64個以上のファイルを開こうとするとSegfaultになっていたのをワークアラウンドしていました (参考)。2019年2月時点ではFD_SETSIZEは64で定義されていましたが、 2023年6月時点ではCygwinの場合は1024に変更されているようです。 ワークアラウンドの効果は相殺されていますが EmacsのコードでFD_SETSIZEを再定義するワークアラウンドは残したままとしています。 29.1では正規表現指定で1024個を超えるファイルを読み込んでも大丈夫になっているようです。
    • 27.1以降で画像を180°回転させたときに(加えて29.1では上下反転/左右反転したときも)表示が化けるバグを修正しています(参考)。
    • 環境変数LANGがja_JP.UTF-8のようにシフトJIS系ではない設定の場合に、 日本語文字フォント名(フォントファミリ)の フォントを設定できなかったり、 describe-fontコマンドでフォント名が化ける場合があった(参考) のを対応してみました。内部的にUTF-16を扱うWin32APIを使用するようにしたので LANGの影響は受けないようになっています。
    • フォントによって幅や高さが異常に大きくなる場合があるのに対応してみました (参考)。 ポイント値からDPIとスケーリングが考慮されたピクセルサイズの高さが、 1.16倍を 超えるようなサイズになった場合は、ピクセルサイズを元にアセント値とディセント値を 再計算しています。 対処方法としては正しくないかも知れません。
      今更ですが emacs-w32_29.2_20240203.patch.xzから本機能を抑止する設定を追加しました。 w32-enable-tweak-font-metricsを nilにするとフォントサイズ補正を行ないません。デフォルトは tになっています。 また、フォントキャッシュが機能している為、フォントを表示した後に設定を変更しても即反映されない場合があります。 .emacsに設定値を記す事を推奨します。
    • harfbuzzが有効な時、Cygwinでは cygharfbuzz-0.dll を読み込むようにしました (参考)。 「👨‍👩‍👧‍👦」のような合字の絵文字などが表示できるようになります。また、モノクロ絵文字フォントの 「Noto Emoji」を使用するにはこの対応が必要なようです (参考)。
    • emacs-gtk(旧emcas-X11)において、読み込んだフォントによってSegfaultで落ちる場合があったのをワークアラウンドしました(参考)。 29.1で修正されています。
    • イタリック体のフェイスを持たないフォントに対して斜体表示する機能を追加してみました(参考)。 以下の設定を.emacsに追加する事で有効になります。

      (setq w32-enable-synthesized-fonts t)
      (set-face-attribute 'italic      nil :weight 'normal :slant 'italic :underline nil)
      

      イタリックの字形を持たないフォント(例えば "MS Gothic")ではイタリック体で表示する事はできません (参考)。 Emacs22の頃に w32-enable-synthesized-fonts という変数を tに設定すると任意のフォントでも 斜体表示する事ができたようですが (Emacs22をベースとするMeadow3では特に設定はしなくても有効でした)、Emacs23で機能自体が削除されたようです。 今回、機能の有効/無効を切り替える為に 変数 w32-enable-synthesized-fonts を再利用する形を 取っています。 ただ、表示の仕方が完璧では無い為、例えば斜体表示されている文字列の上を左から右にカーソル移動すると表示が欠けます。 表示が乱れた場合は redraw-displayで再描画する必要があるかと思います。 29.1で追加されたダブルバッファリング機構により 少しタイムラグはありますが自動的に再描画されるようになっています。

    • image-diredでサムネイルを生成する際、(恐らくCygwinの問題で)ハング状態に陥った後Segfaultで落ちる場合があったのをEmacsでワークアラウンドしました (参考)。 ただし、なぜこれでうまくいくのか判らない対応方法なので避けきれていない可能性があります (参考)。
      emacs-w32_29.3_20240329.patch.xzでも対応パッチを含めていたのですが、問題のある事が判明したので emacs-w32_29.3_20240331.patch.xzで対応パッチを削除しました (参考1, 参考2)。 ただし、何故影響を受けていたのかは判明していません(2024年3月31日時点)。
    • src/w32image.cがCygwinでのビルドに対応していなかったのを対応してみました (参考)。Cygwinでもconfigureオプション「--with-native-image-api」 を指定できます。
    • メニューの「Option→Set Default Font ...」で開くフォント選択ダイアログで選択出来なかったフォントも選べるように 対応してみました(参考)。 w32apiの ChooseFont()関数 のFlags変数に CF_INACTIVEFONTS フラグを立てる事で対応しています。 ただし、本フラグが機能するのはWindows7以降のようなので、WindowsVista以前のWindowsでは機能しないかも知れません(未確認)。
    • emacs-w32_28.2_20221209.patch.xzと同じ方法で29.xでもカラー絵文字表示に対応しています(参考)。 DirectWriteを扱うコードがC++となっている為、追加で g++などのコンパイラをインストールしておく必要があります。 configureオプションによる切り替えはありませんのでカラー絵文字表示は常に有効でビルドされます。
      カラー絵文字フォントのフォーマットには いくつか種類がありますが Windowsの「Segoe UI Emoji」で使用されているCOLR/CPALテーブルという方式のカラー絵文字フォントのみの対応となります。 EmojiOne Colorや Twitter Color EmojiのようなSVGのOpenTypeフォントや、 Noto Color Emoji(Windowsではフォントファイルが認識できないみたいですが)は 対象外となります。 表示するには.emacs等にフォントの設定を行う必要があります。 パッチ無しemacs-w32でSegoe UI Emojiを モノクロ表示で使用できていれば そのままで問題ありません。 もし設定されていない場合、最小限の設定としてひとまず

      (set-fontset-font "fontset-default" 'emoji
                       '("Segoe UI Emoji" . "iso10646-1") nil 'prepend)
      

      を.emacsに足せば良いかと思います。各自環境都合もあるかと思いますのでうまく設定していただければと思います。
      変数 w32-enable-color-emoji-render をnilにするとモノクロ表示になります(redraw-displayコマンドでの再描画が必要です)。

    • SVG描画に対応しています(Cygwinパケージのemacs-w32は対応していません)。 emacs-w32でのRSVG表示対応は24.3で実験していた頃 (参考1,参考2)から 行なっていたのですが記してませんでした😅
    • 組み込みImageMagickを使用した image-mode画像表示の 上下反転/左右反転に対応しました (参考)。
    • 「--with-native-image-api」で アニメーションGIFファイルを表示した際、アニメーションしない為ワークアラウンドとして GIFファイルは native-image-apiでの表示対象から外しました (参考)。
    • src/w32font.c および src/w32uniscribe.c 内のフォントファミリ一覧を生成するコードにおいて、 重複削除を行なっているようなのですがうまく動いていないようだったのを修正しました。 フォントフォールバックを検査する際に、重複していた分の処理が無くなるのでフォールバックに かかる時間が若干短くなります(参考)。
    • emacs-w32_29.2_20240203.patch.xzでフォントフォールバック時にフォントを探すのに時間が かかる原因箇所を調べる手段を組み込んでみました (参考)。次のように使う想定です。

      1. Emacs起動後、scratchバッファなどで以下のようなロギング設定を行なう。

        (progn
          (setq font-log nil)
          (setq debug-font-find-time-limit 900) ;今回追加した設定変数. 900msより時間がかかるとログに記録する.
          ) ; and press C-j
        
      2. 例えば「M-x view-hello-file」を実行します。
      3. 終わったら「M-x font-show-log」で開いたログの中に 以下のような文字列で記録されます。

        font_find_for_lface: exec time 6892.0ms > 900.0ms char=0x1787 (#<font-entity harfbuzz outline Leelawadee UI sans iso10646-1 regular normal normal 0 nil 0 nil ((:format . opentype) (:script symbol buginese khmer lao thai latin))>)
        

        この例では、char=0x1787というユニコード文字を表示しようとして 6892ms時間がかかり、 「Leelawadee UI」が選ばれたという事を示しています。 文字0x1787は scratchバッファなどで 「C-x 8 RET」で16進文字コードで文字入力した後、 「M-x describe-char」で文字を調べて 「script: khmer」である事が分かります。 他にもあれば同じ要領で探すのに時間のかかったフォントを特定してください。

      4. .emacsに

        (set-fontset-font t 'khmer "Leelawadee UI")
        

        を追加して明示的にフォントを指定します。フォントフォールバックの発生を防げるので フォントを探す時間の短縮になります。

      我が家ではview-hello-fileが表示されるまでに1分近くかかっていたものが1秒に短縮されるケースがありました (参考)。

  • IME以外のEmacsLISPに関するパッチについて
    • image-diredでリモートファイルのサムネイルを生成する際(拙作スクリプト wrapped_convertが必要です)、 TRAMPが複数の非同期プロセスに対応していないのが原因でハング状態に陥るのをワークアラウンドしました (参考1,参考2)。 29.1以降でも同じように対応していますが、ファイル数が多いとimage-diredバッファウインドウが表示されるまで 時間がかかるようです(参考3)。 ※lisp/image/image-dired-external.el
    • system-typeが cygwinの場合は org-plantuml-jar-path で指定されるCygwin形式のファイルパスを、 内部でWindows形式のファイルパスに変換するように変更しました。 (参考)。 ※lisp/org/ob-plantuml.el
    • --with-imagemagickでビルドしたEmacsで 且つ、org-modeで変数org-image-actual-widthを nilに 設定した上で、#+ATTR_HTML: や #+ATTR_ORG: の :width で画像表示幅の指定を省略した場合に 画像フォーマットによって インライン画像が表示されない場合があったのをワークアラウンドしてみました (参考)。 ※lisp/org/org.el
    • 29.1以降のewwで背景色の塗りつぶしができていない場合があったのを 修正しました(参考)。 ※lisp/net/shr.el
    • 28.1以降のewwでバイナリファイルへのリンクを開こうとするとハング状態に陥るのをワークアラウンドしてみました (参考1,参考2)。 29.1以降でも同じように対応しています。 ※lisp/net/eww.el
    • image-dired でサムネイルを選択して画像を表示する際 29.1では image-mode を 使用するようになったのですが、バッファの再利用を行なわない方式になった為、 同じウインドウに表示されない場合があったりしたのを改善してみました (参考)。 ※lisp/image/image-dired.el
    • 29.1で機能追加された image-crop に色々と不具合 (参考)があったのを修正してみました。
      emacs-w32_29.3_20240329.patch.xzで不具合修正と改善を追加 (参考, 参考) ※lisp/image/image-crop.el
    • info 表示でセクションタイトルのフォントフェイスが適用されない場合があるのを ワークアラウンドしました(参考)。 ※lisp/info.el
    • emacs-w32_29.4_20240624.patch.xzで ewwでローカルHTMLファイルを読み込んだ時、Eキー(eww-set-character-encoding) でエンコーディングを指定しても変化が無かったのを対応してみました(参考)。 ※lisp/net/eww.el

その他

  • Emacs-27.1以降、--with-imagemagickでビルドした場合に JPEG2000画像フォーマットのファイルを表示させた際、 SegfaultでEmacsが落ちる事がありました(参考)。 パッケージのImageMagickが壊れているのが原因でした。 ImageMagickを自前でビルドして(その際に--with-gslibというconfigureオプションを外してビルドする) DLL(cygMagickCore-7.Q16HDRI-7.dllとcygMagickWand-7.Q16HDRI-7.dll)を Cygwinパッケージのものと入れ替える事で対応する必要がありました (参考)。
    ImageMagickのCygwinパッケージが 7.0.10.27 から 7.0.10.61 にアップデートされた時に直ったようです (参考)。
  • ImageMagickの不具合をいくつか対応してみました (ImageMagick-7.0.10-61_20230620a.patch.xz)。

    • HEICフォーマットの画像ファイルを表示すると色が化けるのを対応 (参考1, 参考2)。
    • TGAフォーマットで 透明度付きのグレースケールタイプの場合に表示が化けるのを対応(参考)。

    ビルドや置き換え (ビルドしたDLL(cygMagickCore-7.Q16HDRI-*.dllcygMagickWand-7.Q16HDRI-*.dll)をパッケージ版と置き換える)は 面倒臭いですが もしCygwinパッケージで困った場合に試してみていただければと思います。

  • ImageMagickの convertコマンドを外部起動して画像を表示するようなケース (例えば --without-imagemagickでビルドしたり image-diredを使用する場合など)で遭遇した不具合に対応するための perlスクリプトを作成しました(wrapped_convert_240328a.tar.xz)。 素のconvertをラップして機能追加する感じなので素のconvertコマンド自体は必要ですが、 Emacsでconvertコマンドを指定しているものをwrapped_convertに切り替える事で不具合対応します。 詳細はスクリプトの先頭部分に記してあります(utf-8の日本語です😓)。
    wrapped_convert_240328aでは MinGW Emacs向けにD言語版のwrapped_convertを同梱しています。 面倒臭いですが dmd等でコンパイルして生成された.exeを使用してください。

3. 履歴

  2024/08/13 : 「Emacsの雑記」から分離。

TOP PREV

著者: TANE