私は長らく、Emacs に Mac port のパッチを当てたビルド版である railwaycat/homebrew-emacsmacport を使っていました。

なぜ NS 版に乗り換えたのか

しかしここ数年、以下の課題を感じていました。

  • Mac port が最新の Emacs に追いついていない
    • 現在の Emacs の最新は 30.2 だが、Mac port がサポートするのは 29.4
  • railwaycat/homebrew-emacsmacport の最新リリース emacs-29.4-mac-10.1 を使うと、私の環境では issue #389 の問題に遭遇するため、ひとつ前の emacs-29.1-mac-10.0 を使っていた
  • できれば最新の Emacs を使いたい

そもそも私が Mac port 版を使う理由はただ一つで、M-x した時などに自動的に日本語入力を OFF にし、終わったら元の状態に戻すためでした。そんな設定 です。

この振る舞いさえ実現できれば、標準の NS 版に乗り換えられます。今回それが叶った形です。

なお NS は NeXTSTEP の略で、macOS では Cocoa(AppKit)を使う GUI ビルドを指します。

sis で解決できそうだと分かった

調べたところ、emacs-smart-input-source (以下 sis)を使えば、Mac port 版でやっていたことを実現できそうでした。

そして sis は macOS では、入力ソースの切り替えに macism という CLI をバックエンドとして使います。作者は sis と同じ @laishulu さんです。

NS 版 Emacs をインストールした

まずは emacsformacosx.com のビルドを Homebrew でインストールしました。

$ brew install --cask emacs-app

sis を設定して解決できた

macism のインストール

macism を Homebrew でインストールしました。

$ brew install laishulu/homebrew/macism

macism は単体でも、コマンドラインからこのように入力ソースを切り替えられます。

# 入力ソースを「ABC」にする
$ macism com.apple.keylayout.ABC

# 入力ソースを Google 日本語入力の「あ」にする
$ macism com.google.inputmethod.Japanese.base

sis の設定

設定したのはこれだけです。

;; ミニバッファにカーソルを移動する際、自動的に英語モードにして、
;; 元のバッファに戻った後に、日本語入力状態をリストアする。
(sis-ism-lazyman-config
 "com.apple.keylayout.ABC"               ;; ABC
 "com.google.inputmethod.Japanese.base") ;; Google 日本語入力
(sis-global-respect-mode 1)

;; 入力モードに合わせてカーソル色を切り替える。
(sis-global-cursor-color-mode 1)

sis-global-respect-mode が、M-x などでミニバッファに移った時に英語入力へ切り替え、元のバッファに戻ると日本語入力状態を復元してくれます。まさに Mac port 版でやっていたことそのものです。

これで sis でも問題なく解決でき、無事に標準の NS 版へ乗り換えられました。

まとめ

長年使ってきた Mac port 版から、標準の NS 版に乗り換えられました。M-x 時の入力ソース切り替えという、唯一にして最大の課題が解決できて良かったです。

Mac port 版と比べても、不便を感じる場面は特にありません。

最新の Emacs に追随できるようになりました。Emacs 30 はネットワーク周りが速くなった気がします。navi2ch (!) を使うとよく分かります。

どなたかの参考になれば幸いです。

関連

付録

文脈で入力ソースを切り替える sis-global-context-mode

sis には、カーソル周辺の文字(文脈)を見て入力ソースを自動で切り替える sis-global-context-mode もあります。

(sis-global-context-mode 1)

たとえば「日本語を書く → 別の場所を編集 → 元の場所に戻って続きを書く」とき、戻った場所が日本語の途中なら自動で日本語入力に、英語の途中なら英語に切り替えてくれます。カーソル前後の文字が日本語か英語かを判定し、判定できたときだけ切り替えるので、誤爆も少ないです。

ただし、発火タイミングを決める sis-context-hooks のデフォルトは '(evil-insert-state-entry-hook) で、evil 前提です。evil を使わない場合はこのフックが呼ばれず動かないため、自分の運用に合わせてフックを追加する必要があります。

sis-global-respect-modeM-x 等で英語に切り替えて戻す)だけで十分なら、無理に有効化しなくてよいと思います。

日本語に英単語を混ぜる sis-global-inline-mode

sis には、日本語の文章の途中に英単語を混ぜたいときに便利な sis-global-inline-mode もあります。

(sis-global-inline-mode 1)

たとえば 日本語 some english text 日本語 と書きたいとき、日本語<スペース>some english text<スペース><RET>日本語 と打つだけで済みます。日本語の直後にスペースを入れた瞬間に、その場だけ自動で英語入力に切り替わり(オーバーレイで色が付く)、末尾のスペースや RET、領域外へのカーソル移動で元の日本語入力に戻ります。IME を手動で切り替える必要がありません。

デフォルトでは「日本語の中の英語」だけが対象です(sis-inline-with-english)。逆に「英語の中の日本語」も使いたい場合は (setq sis-inline-with-other t) を追加します。

sis-global-respect-mode / sis-global-context-mode が入力ソースの「切り替え」を担うのに対し、こちらは一時的な英語領域をその場で作る、という違いがあります。

1 日試したものの、当然ながらこの振る舞いは Emacs 内だけのもので、Emacs とそれ以外で文字入力の挙動が変わってしまいます。これが地味に戸惑うので、使うのを止めました。Emacs 内でも、そこまで直感的な操作にはならなかったのも理由です。

追記(2026-06-25): Emacs 30.2 の Mac port 版がある

Mastodon 経由で教えてもらいました。jdtsmith/emacs-mac は知っていましたが、カスタマイズは最小限にしたい派なので、今回標準の NS 版に移行するいい機会と捉えた形です。

Post by @[email protected]
View on Mastodon

一番下の [ メッセージ送信 ] でも初めて(!)同じ内容でコメントをいただきました。ありがとうございます 😄

Mac port 版使っている方は、それなりにいらっしゃるのですね。Input Method が必要な言語圏は分かるけど、そうじゃない言語圏の方は、どんなメリットで Mac port 版使っているのだろう?