Help us understand the problem. What is going on with this article?

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

はじめに

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

Screen Shot 2019-08-29 at 11.32.26.png

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

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") としてきた設定を,"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 氏のナイスな記事を参照して,公証対応インラインパッチ適用済みインストーラを作ってみました.オプション設定間違えたので,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) ),やはり 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

最新の安定版を使う場合(26.3)

最新の安定版は,26.3です.インラインパッチは,25.2用のものをそのまま適用できます.

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

さらにMojave ユーザは,tccd に起因するプチフリを回避するために,自己署名を加える一手間が必要になりますので,野良ビルドした Emacs で tccd が暴走するのを防ぐ(Mojave) も合わせて確認してください.

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

#!/bin/sh

# LIBXML2 for Catalina
MACSDK=`xcrun --show-sdk-path`
export LIBXML2_CFLAGS="-I${MACSDK}/usr/include/libxml2"
export LIBXML2_LIBS="-lxml2"

cd ~/Desktop
mkdir emacs_ns
cd ~/Desktop/emacs_ns
VERSION=26.3
curl -LO ftp://ftp.gnu.org/gnu/emacs/emacs-$VERSION.tar.gz
curl -LO https://gist.githubusercontent.com/takaxp/3314a153f6d02d82ef1833638d338ecf/raw/156aaa50dc028ebb731521abaf423e751fd080de/emacs-25.2-inline.patch
# curl -LO https://gist.githubusercontent.com/takaxp/5294b6c52782d0be0b25342be62e4a77/raw/9c9325288ff03a50ee26e4e32c8ca57c0dd81ace/emacs-25.2-inline-googleime.patch
# curl -LO https://gist.githubusercontent.com/takaxp/e2b97f67d9e8db09961c8c4fb4be309d/raw/da9edcdedacfe5c48ecbfc73a629e7c553199e8d/ns-26.2-private.patch
tar zxvf emacs-$VERSION.tar.gz
cd ./emacs-$VERSION
patch -p1 < ../emacs-25.2-inline.patch
# patch -p1 < ../emacs-25.2-inline-googleime.patch
# patch -p1 < ../ns-26.2-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
# codesign --force --deep --sign "myApp" Emacs.app
open .

最新の開発コードを使う場合(28.0.xx)

最新の開発コードをビルドして,インラインパッチを適用して使いたい人は,次のパッチを使用してください.26系と一部の実装が変わっているため,インラインパッチも少し修正されています.したがって,27,28系専用のパッチになります.

次のスクリプトでは --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-27.1-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 .

Mojave 対応の開発コードを使う場合(26.1.xx)

NOTE: 26.2 が公開されました(2019-04-12)ので,めでたく,この節は役目を終えました.

安定版の 26.1 は残念ながらMojaveでは正しく動作しないので,EMP版をインストールするか,開発コードをビルドしなければなりません.emacs-26 ブランチの 9ad0f1d15c 以降を使えばOKです.同ブランチ内の最新のコミットが良いと思いますので,適宜スクリプトにあるコミット番号を書き換えてください.(git log -n 1 --format=%Hで最新コミットがわかります.)インラインパッチは,25.2 と同じものを使えます.

#!/bin/sh

cd ~/Desktop
git clone git://git.sv.gnu.org/emacs.git
curl -LO https://gist.githubusercontent.com/takaxp/3314a153f6d02d82ef1833638d338ecf/raw/156aaa50dc028ebb731521abaf423e751fd080de/emacs-25.2-inline.patch

cd emacs
# git reset --hard 6217746dd6
git checkout -b emacs-26
git reset --hard 9ad0f1d15c
patch -p1 < ../emacs-25.2-inline.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

以前の安定版を使う場合

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

ただ,ちゃんと遊ぶには,emacs-module.h が必要で, これはまだGit版のソースコードにしか同梱されていませn src/emacs-module.hとして格納されています.

  • --with-xwidgets(Emacs をガチブラウザ化するオプション.Linuxでお試しあれ.# 私自身Macでは成功していない)

また,「ddskkやAquaSKKは素のバイナリでも問題ないようす。」(by @kaz_yos)とのことです.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした