はじめに
GNU Emacs (25.1/25.2/25.3, 26.1/26.2/26.3, 27.2, 28x) にインラインパッチをあてて使いたい人向けの記事です.
macOS で野良ビルドできる人が対象です.
NOTE1: NS版のチラつきを解消するパッチが作成されたようです.
https://ja.osdn.net/projects/macemacsjp/lists/archive/users/2017-April/001756.html
NOTE2: 25.2用にインラインパッチを作り,上記のパッチを取り込みました.
https://gist.github.com/takaxp/3314a153f6d02d82ef1833638d338ecf
NOTE3: macOS Mojave では公式の 26.1(NS build)
が動きません.26.2
以降を使いましょう.修正パッチがEmacsのGitに登録されています.emacs-26@9ad0f1d15c
以降をビルドすればOKです.Version は26.1.50
になります.インラインパッチは,既存のものがそのまま使えますが,ビルドスクリプトを準備しました.
NOTE4: Mojave で野良ビルドしたEmacsを使う時にプチフリする場合の対処法がわかりました.
https://qiita.com/takaxp/items/2a0abaa6e5f1a7a9c440
NOTE5: 気の早い人に向けて,27系で使えるパッチも準備しました.
- https://gist.github.com/takaxp/534a5a1bc6e0494a78eb72a271b429c5 (for general)
- https://gist.github.com/takaxp/8da64eb5e6c8094ef9bdba1d27d529a5 (for google IME, locale=en)
NOTE6: [macOS Catalina 情報] とりあえず以下の手順・変更が必要そうです.継続調査します.
- xcode-select --install
- brew の更新 or 再インストール
-
CC=clang
を指定する場合は,brew の llvm を再インストールするか,XCode の llvm を使う.CC=clang
を指定するしない(Cコンパイラが無いと怒られるのを回避)ただし,brew 再インストールの場合は問題ない模様(手元は再インストールしてしまった) -
シェル側で明示的に指定すればOK.下記の(26.3以降用)各スクリプトに反映.--without-xml2
を指定する(回避方法を探索中.configure
的にはパスが通っているハズが...)
NOTE7: [emacs 27 情報] 最近入ったチラつき防止コードとインラインパッチの相性が悪く,今頒布しているパッチでは不十分です.作り直すのでお時間ください.
NOTE8: [emacs 27 情報] 修正しました.変換候補の入力周りのコードは,Emacs 27の標準コードで十分なことがわかったので,パッチから当該コードを削除しました.これに伴い,しばらくしたら,インラインパッチと言うのを止め,IMEパッチに改名したいなと思います.また,これまで (setq default-inline-patch "MacOSX")
(setq default-input-method "MacOSX")
としてきた設定を,"macOS" の指定でも同じ効果になるようにしました.
NOTE9: [emacs 27 情報] インライン編集で壊れていた部分を修正できたので, IMEパッチ に改名するのを止めました.わりとコードを修正したので,GitHub にパッチを移し,今後はパッチファイルをそちらで管理することにします.https://github.com/takaxp/ns-inline-patch なお,mac-ime-cursor-type
の代わりに,mac-ime-hide-cursor
を導入して,デフォルトを t
にしました.GoogleIMEではうまくいきますが,ことえりだとちょっと文節の切替が微妙です(faceが正確に反映されない)
NOTE10: [公証対応パッケージ] @hiroakit 氏のナイスな記事を参照して,公証対応インラインパッチ適用済みインストーラを作ってみました.オプション設定間違えたので, GnuTLS を同梱した pkg に仕上げました.気軽にインストールして試せます(インストール先は brew install imagemagick && brew install gnutls
が必要かもしれません.そのうちちゃんとします./Applications/Emacs-takaxp
です)
日本語入力対策
野良ビルドでやはり気になるのは日本語入力です.
実はプレリリースされる以前から,開発版では inline-patch がなくても日本語入力が効くようになっています.ところが,変換候補を入力している最中に,キータイピングのたびにカーソルが単語の先頭に移動するという残念な現象が生じていて(少なくとも私のところでは.see video: Emacs 25.1 (brew version, NS) ),やはり inline-pach の出番です.
下のビルド手順で使用しているパッチは,mac-ime-cursor-type
なる新しい変数を設けています.日本語入力時に使っている cursor-type
をそのまま代入すると,カーソルを変換後の先頭で表示しないトリックが発動します.正直なところ,それでもチラつきが残ります.我慢できない場合は,
(setq mac-ime-cursor-type '(bar . 2))
init.el
等で上の設定を加えます.加えない場合は,いつもどおりの振る舞いですので安心してください.上の例で '(bar . 2)
になっているところは,frame
に普段指定している日本語入力用のcursor-type
と同じ値を入れてください.
内部的には,日本語入力が始まったタイミングでカーソルを消して,日本語入力完了時に mac-ime-cursor-type
で指定するカーソルタイプに戻しています.
またNS版とは見た目と機能がそれなりに異なるEMP版もありますので,お試しあれ.
野良ビルド手順
必要なライブラリ
ビルドの前に,下記をインストールしておくことをオススメします.最新のOSに切り替えた直後の場合, xcode-select --install
します.
brew install autoconf automake pkg-config gnutls texinfo
最新の安定版を使う場合(27.2)
最新の安定版は,27.2
です.インラインパッチは,27系用のものを使います.必要に応じて,IME入力時のちらつきを回避するためのパッチ(revert-89d0c445.patch, fix-working-text.patch)も当てましょう.
#!/bin/sh
# LIBXML2 for Catalina
MACSDK=`xcrun --show-sdk-path`
export LIBXML2_CFLAGS="-I${MACSDK}/usr/include/libxml2"
export LIBXML2_LIBS="-lxml2"
export WORKING_DIR="${HOME}/Desktop"
while getopts d: opt
do
case ${opt} in
d)
WORKING_DIR=${OPTARG}
;;
esac
done
cd ${WORKING_DIR}
mkdir emacs_ns
cd ${WORKING_DIR}/emacs_ns
VERSION=27.2
# inline-patch
git clone --depth 1 https://github.com/takaxp/ns-inline-patch.git
# get the source
curl -LO http://ftpmirror.gnu.org/emacs/emacs-$VERSION.tar.gz
tar zxvf emacs-$VERSION.tar.gz
cd ./emacs-$VERSION
patch -p1 < ../ns-inline-patch/emacs-27.1-inline.patch
if [ $? -ne 0 ]; then echo "FAILED"; exit 1; fi
patch -p1 < ../ns-inline-patch/revert-89d0c445.patch
if [ $? -ne 0 ]; then echo "FAILED"; exit 1; fi
patch -p1 < ../$PATCH/ns-inline-patch/fix-working-text.patch
if [ $? -ne 0 ]; then echo "FAILED"; exit 1; fi
sleep 5
./autogen.sh
./configure CC=clang --without-x --with-ns --with-modules
CORES=
#CORES=4
make bootstrap -j$CORES
make install -j$CORES
cd ./nextstep
open .
最新の開発コードを使う場合(28.0.xx)
最新の開発コードをビルドして,インラインパッチを適用して使いたい人は,次のパッチを使用してください.28系(master)専用のパッチになります.
次のスクリプトでは --depth 1
で最新コミットのみ取り寄せていることに留意してください.
#!/bin/sh
# LIBXML2 for Catalina
MACSDK=`xcrun --show-sdk-path`
export LIBXML2_CFLAGS="-I${MACSDK}/usr/include/libxml2"
export LIBXML2_LIBS="-lxml2"
cd ~/Desktop
git clone --depth 1 git://git.sv.gnu.org/emacs.git
git clone --depth 1 https://github.com/takaxp/ns-inline-patch.git
cd emacs
patch -p1 < ../ns-inline-patch/emacs-head-inline.patch
sleep 5
./autogen.sh
./configure CC=clang --without-x --with-ns --with-modules
CORES=
#CORES=4
make bootstrap -j$CORES
make install -j$CORES
cd ./nextstep
open .
以前の安定版を使う場合
26.3 の場合
が使えます.
インラインパッチは,25.2用のものをそのまま適用できます.現在は,unexmacosx.c
への修正が必要です.27系がリリースされることから,この修正は本家には反映されません.
Mojaveユーザは 26.1
では正しく動作しません.迷わず 26.3
を使いましょう.修正が組み込まれた 26.2
のリリースが待たれますが,しばらく先になりそうです(2019-03-11時点).
さらにMojave ユーザは,tccd
に起因するプチフリを回避するために,自己署名を加える一手間が必要になりますので,野良ビルドした Emacs で tccd が暴走するのを防ぐ(Mojave) も合わせて確認してください.
NOTE: make のコア数指定を -j1
から -j4
に更新しました.途中でビルドがコケる場合は, -j1
に戻してから(スクリプト内でCORES=1
とする)スクリプトを動かしてください.なお CORES=
で動かすと各環境の全力でビルドしてくれます.
25.3/25.2 の場合
以下はいつもの野良ビルド手順(25.3)
なお25.2用パッチがそのまま使えます.また25.2用にビルドする場合は,VERSION変数を変更してください.
#!/bin/sh
cd ~/Desktop
mkdir emacs_ns
cd ~/Desktop/emacs_ns
VERSION=25.3
curl -LO http://ftpmirror.gnu.org/emacs/emacs-$VERSION.tar.gz
curl -LO https://gist.githubusercontent.com/takaxp/3314a153f6d02d82ef1833638d338ecf/raw/156aaa50dc028ebb731521abaf423e751fd080de/emacs-25.2-inline.patch
tar zxvf emacs-$VERSION.tar.gz
cd ./emacs-$VERSION
patch -p1 < ../emacs-25.2-inline.patch
sleep 5
./autogen.sh
./configure --without-x --with-ns --with-modules
CORES=4
#CORES=1
#CORES=
make bootstrap -j$CORES
make install -j$CORES
cd ./nextstep
open .
# あとはお好きな場所に Emacs.app を移動させてお試しください
25.1 の場合
25.1 の場合はこちら
#!/bin/sh
cd ~/Desktop
mkdir emacs_ns
cd ~/Desktop/emacs_ns
VERSION=25.1
curl -LO http://ftpmirror.gnu.org/emacs/emacs-$VERSION.tar.gz
curl -LO https://gist.githubusercontent.com/takaxp/f30f54663c08e257b8846cc68b37f09f/raw/6ac48eac29f9d0df65310a249cfe04d7351657ee/emacs-25.1-inline.patch
tar zxvf emacs-$VERSION.tar.gz
cd ./emacs-$VERSION
patch -p1 < ../emacs-25.1-inline.patch
sleep 5
./autogen.sh
./configure --without-x --with-ns --with-modules
CORES=4
#CORES=1
#CORES=
make bootstrap -j$CORES
make install -j$CORES
cd ./nextstep
open .
25.3/25.2 で Google IME(locale=en) な場合
最後に,locateが en
で,Google IME を使う人は,次を(パッチが違います).25.3向け(25.2の場合は,VERSION変数を変更してください.25.2用と25.3用のパッチは同じものです.)
#!/bin/sh
cd ~/Desktop
mkdir emacs_ns
cd ~/Desktop/emacs_ns
VERSION=25.3
curl -LO http://ftpmirror.gnu.org/emacs/emacs-$VERSION.tar.gz
curl -LO https://gist.githubusercontent.com/takaxp/5294b6c52782d0be0b25342be62e4a77/raw/9c9325288ff03a50ee26e4e32c8ca57c0dd81ace/emacs-25.2-inline-googleime.patch
tar zxvf emacs-$VERSION.tar.gz
cd ./emacs-$VERSION
patch -p1 < ../emacs-25.2-inline-googleime.patch
sleep 5
./autogen.sh
./configure --without-x --with-ns --with-modules
CORES=4
#CORES=1
#CORES=
make bootstrap -j$CORES
make install -j$CORES
cd ./nextstep
open .
フレームの周囲にある余白を消したい場合
(2018-05-29) 26.1 リリース,インラインパッチは 25.2がそのまま使えます.以下は,フレームの余白をソースコードレベルで消す等に対応した個人用パッチ付きビルドスクリプト.GoogleIME用.
#!/bin/sh
cd ~/Desktop
mkdir emacs_ns
cd ~/Desktop/emacs_ns
VERSION=26.1
#POSTFIX=-rc1
curl -LO ftp://ftp.gnu.org/gnu/emacs/emacs-$VERSION.tar.gz
#curl -LO ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-$VERSION$POSTFIX.tar.xz
curl -LO https://gist.githubusercontent.com/takaxp/5294b6c52782d0be0b25342be62e4a77/raw/9c9325288ff03a50ee26e4e32c8ca57c0dd81ace/emacs-25.2-inline-googleime.patch
curl -LO https://gist.githubusercontent.com/takaxp/01ff965361d70de93e9aba3795193cc7/raw/4265d48c13f33a2046669086756c85a2bb83c318/ns-private.patch
tar zxvf emacs-$VERSION$POSTFIX.tar.gz
cd ./emacs-$VERSION
patch -p1 < ../emacs-25.2-inline-googleime.patch
patch -p1 < ../ns-private.patch
sleep 5
./autogen.sh
./configure CC=clang --without-x --with-ns --with-modules
CORES=4
#CORES=1
#CORES=
make bootstrap -j$CORES
make install -j$CORES
cd ./nextstep
open .
patch が動かない等はコメントへお願いします.また,libxml2関連でコケる人は,マスタカさんの記事をお読みください.
起動時間が高速化してますね.手元の環境で,24.5で 1475[msec] が 747[msec] に.
Follow up
./configure 時にオプションを付けると幸せになれそうです(by @syohex)
- --with-modules(詳しくは => http://qiita.com/syohex/items/fa71f1c61107b5e30c43)
ただ,ちゃんと遊ぶには,emacs-module.h が必要で, これはまだGit版のソースコードにしか同梱されていませn src/emacs-module.h
として格納されています.
- --with-xwidgets(Emacs をガチブラウザ化するオプション.Linuxでお試しあれ.# 私自身Macでは成功していない)
また,「ddskkやAquaSKKは素のバイナリでも問題ないようす。」(by @kaz_yos)とのことです.