【emacsclient】
Emacsはデーモンで起動しておくもの
(emacs-plus)

Emacsは起動が遅く感じることがあります。
しかし、どうもそれは起動の仕方を間違えていたからだったみたいです。

その考えを強めたきっかけが、DistroTube 氏の Three HUGE Mistakes New Emacs Users Make でした。

関連記事

1. デーモンを常駐しておくと起動は速い

最初に Emacs を触ったとき、単純に次のように起動していました。

emacs file.txtCode language: CSS (css)

数秒待たされ、ようやくウィンドウが開く。
「Emacsは重い」という印象が先に立ちます。

当時はそれを当然だと思っていました。

1.1. サーバー(デーモン)という発想

「初心者の勘違い」は、「Emacsをサーバーとして起動していないこと」です。

Emacs には、バックグラウンドで常駐させておき、必要なときにクライアントを瞬時に開く仕組みがあります。
具体的には次のように起動します。

emacs --daemon

でも、起動できません。
そこで、emacs-plusをインストールしました。

brew tap d12frosted/emacs-plus
brew install emacs-plus

1.2. emacsclient -c -a ”

デーモンを立ち上げたら、普段は次のコマンドで Emacs を開きます。

emacsclient -c -a ''
Code language: JavaScript (javascript)

これを初めて試したとき、体感ははっきり変わりました。
ウィンドウが「起動する」のではなく、「現れる」感覚に近いです。

各パーツの意味を分解して解説します。

emacsclient」は、すでにバックグラウンドで動いている Emacsサーバー(デーモン)に「新しいウィンドウを開いて!」と命令を出すためのツール です。

通常の emacs コマンドだと、毎回すべての設定ファイルを読み込むので起動が遅いですが、emacsclient はすでに準備ができているサーバーに繋ぐだけなので、一瞬(0.1秒以下)で開きます。

-c (Create Frame)」は、「新しいGUIウィンドウ(フレーム)を作成せよ」 というオプションです。

これがないと、すでに開いている既存のEmacsウィンドウの中でファイルが開かれてしまいます。

-a '' (Alternate Editor)」は、「もしサーバーが動いていなかったらどうするか?」 を指定するオプションです。
ここがポイントです。

本来 -a の後には代替のエディタ名(nano など)を書きますが、あえて空文字 '' を渡すと「サーバーが動いていないなら、まずサーバーを自分で立ち上げてから接続せよ」という特別な意味になります。

この時点で、「Emacsは遅い」という前提が崩れました。

1.3. サーバーを終了するには?

Emacsサーバは、直接プロセスを終了するのではなく、emacsclientから終了します。

emacsclient -e '(kill-emacs)'Code language: JavaScript (javascript)

確認メッセージなしで強制終了するには、1

emacsclient -e '(progn (defun yes-or-no-p (p) t) (kill-emacs))'Code language: JavaScript (javascript)

2. ターミナルでのcdやファイルマネージャーは不要(Dired)

次につまずいていたのは、作業の流れそのものです。

  • ターミナルで cd
  • emacs file.txt で編集
  • 別ウィンドウでファイル一覧を確認

この流れは、他のエディタでは自然に感じます。

しかし、Emacsでは「非効率」。
理由は単純で、Emacsの中に同じ機能が揃っているからです。

たとえば Dired は Emacs 内蔵のファイルマネージャーです。
ディレクトリを一覧し、移動し、ファイルを開くところまで一貫して操作できます。

また vterm は Emacs 内で動くターミナルエミュレーターです。
外部ターミナルと遜色ない速度で、同じウィンドウ内に収まります。

Emacsを起点に作業を組み立てると、「外に出る理由」が減っていきます。

2.1. Emacsは-nw で使わなくてもよい

Emacsは、ウィンドウを出さずターミナル内で使うものだと思い込んでいました。

emacs -nw

これだと起動も速い気がします。

ところが、GUI版の Emacs にはターミナル版にはない機能があります。

  • 見出しごとにフォントサイズを変えられる
  • 画像をそのまま表示できる

3. Emacsを「完結する環境」として扱う

「Emacsはオペレーティング・システムのようなものだ」という表現は、比喩ではありますが、体感としては理解できます。
もっと正確に言うなら、「シェル」なんでしょうね。

一つのプロセスの中で、

  • 編集
  • ファイル管理
  • ターミナル操作
  • 情報参照

が完結する。
その一貫性が、慣れてくるほど効いてきます。

もちろん、すべてを Emacs に寄せることが常に正解だとは思っていません。
用途やチームによっては、外部ツールと併用した方が合理的な場面もあります。

  1. Emacsサーバを適切に終了する – 貳佰伍拾陸夜日記