Emacs-25.3/26.3(Mojave, Catalina, BigSur)/27.2/28.x にインラインパッチをあてて使う（macOS）

# はじめに

GNU Emacs (25.1/25.2/25.3, 26.1/26.2/26.3, 27.2, 28x) にインラインパッチをあてて使いたい人向けの記事です．
macOS で野良ビルドできる人が対象です．

![Screen Shot 2019-08-29 at 11.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12232/3bfc324c-8e9a-61f0-fc1a-0b0feddc198c.png)

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12232/3136a009-7999-822a-c8de-68668eef286c.gif)


**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`になります．インラインパッチは，既存のものがそのまま使えますが，ビルドスクリプトを準備しました．~~

- ~~[build script (normal)](https://gist.github.com/takaxp/5bb38d3d4f691964c12e90d0a49c9ce2)~~
- ~~[build script (google IME, locale=en)](https://gist.github.com/takaxp/49dc14c3da3e293a1f458095a2585d34)~~

**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 情報] とりあえず以下の手順・変更が必要そうです．継続調査します．
1. xcode-select --install
2. brew の更新 or 再インストール
3. `CC=clang` を指定する場合は，brew の llvm を再インストールするか，XCode の llvm を使う．~~`CC=clang` を指定するしない（Cコンパイラが無いと怒られるのを回避）ただし，brew 再インストールの場合は問題ない模様（手元は再インストールしてしまった）~~
4. ~~`--without-xml2` を指定する（回避方法を探索中．`configure` 的にはパスが通っているハズが...）~~ シェル側で明示的に指定すればOK．下記の(26.3以降用)各スクリプトに反映．

**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 氏の[ナイスな記事](https://www.hiroakit.com/archives/20200514/)を参照して，公証対応インラインパッチ適用済みインストーラを作ってみました．~~オプション設定間違えたので，`brew install imagemagick && brew install gnutls` が必要かもしれません．そのうちちゃんとします．~~ GnuTLS を同梱した pkg に仕上げました．気軽にインストールして試せます（インストール先は `/Applications/Emacs-takaxp` です）
- https://github.com/takaxp/ns-inline-patch#test-pre-built-distribution-package

# 日本語入力対策

野良ビルドでやはり気になるのは日本語入力です．
実はプレリリースされる以前から，開発版では inline-patch がなくても日本語入力が効くようになっています．ところが，変換候補を入力している最中に，キータイピングのたびにカーソルが単語の先頭に移動するという残念な現象が生じていて（少なくとも私のところでは．see video: [Emacs 25.1 (brew version, NS)](https://youtu.be/OOnZeJU8sWI) ），やはり inline-pach の出番です．

下のビルド手順で使用しているパッチは，`mac-ime-cursor-type` なる新しい変数を設けています．日本語入力時に使っている `cursor-type` をそのまま代入すると，カーソルを変換後の先頭で表示しないトリックが発動します．~~正直なところ，それでもチラつきが残ります．我慢できない場合は，~~ 

```el
(setq mac-ime-cursor-type '(bar . 2))
```

`init.el`等で上の設定を加えます．加えない場合は，いつもどおりの振る舞いですので安心してください．上の例で `'(bar . 2)` になっているところは，`frame`に普段指定している日本語入力用の`cursor-type`と同じ値を入れてください．

内部的には，日本語入力が始まったタイミングでカーソルを消して，日本語入力完了時に `mac-ime-cursor-type` で指定するカーソルタイプに戻しています．

またNS版とは見た目と機能がそれなりに異なる[EMP版](http://qiita.com/takaxp/items/a86ee2aacb27c7c3a902)もありますので，お試しあれ．


# 野良ビルド手順

## 必要なライブラリ

ビルドの前に，下記をインストールしておくことをオススメします．最新の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）も当てましょう．

```zsh
#!/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` で最新コミットのみ取り寄せていることに留意してください．

```sh
#!/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 の場合

https://github.com/takaxp/ns-inline-patch/blob/master/build/emacs-26.3.sh

が使えます．

インラインパッチは，25.2用のものをそのまま適用できます．現在は，`unexmacosx.c` への修正が必要です．27系がリリースされることから，この修正は本家には反映されません．

Mojaveユーザは `26.1` では正しく動作しません．迷わず `26.3` を使いましょう．~~修正が組み込まれた `26.2` のリリースが待たれますが，しばらく先になりそうです（2019-03-11時点）．~~

さらにMojave ユーザは，`tccd` に起因するプチフリを回避するために，自己署名を加える一手間が必要になりますので，[野良ビルドした Emacs で tccd が暴走するのを防ぐ（Mojave）](https://qiita.com/takaxp/items/2a0abaa6e5f1a7a9c440) も合わせて確認してください．

**NOTE:** make のコア数指定を `-j1` から `-j4` に更新しました．途中でビルドがコケる場合は， `-j1` に戻してから（スクリプト内で`CORES=1`とする)スクリプトを動かしてください．なお `CORES=` で動かすと各環境の全力でビルドしてくれます．

### 25.3/25.2 の場合

以下はいつもの野良ビルド手順(25.3)
なお25.2用パッチがそのまま使えます．また25.2用にビルドする場合は，VERSION変数を変更してください．

```zsh
#!/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 の場合はこちら

```zsh
#!/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用のパッチは同じものです．）

```zsh
#!/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用．

```zsh
#!/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関連でコケる人は，[マスタカさんの記事](https://masutaka.net/chalow/2014-10-25-1.html)をお読みください．


起動時間が高速化してますね．手元の環境で，24.5で 1475[msec] が 747[msec] に．

# Follow up

./configure 時にオプションを付けると幸せになれそうです（by @syohex）

- --with-modules（詳しくは => [http://qiita.com/syohex/items/fa71f1c61107b5e30c43](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）とのことです．