C-z fg $ 【vterm】
Emacsの中で完結させるか、C-zで端末に
戻るか

Emacsを使っていると、ふとした瞬間に迷います。
シェルコマンドはEmacsの中で実行するべきか。それとも C-z で一度Emacsを止め、元のターミナルに戻って作業し、fg で帰ってくるべきか。

Emacs内完結 vs C-z端末戻り $ 作業の性質で使い分ける Emacs内 編集中心 外部端末 実行中心

どちらもできる。だからこそ、判断が揺れます。

関連記事

1. Emacs内でシェルを使う(shell / eshell / vterm)

Emacsには、外部コマンドを実行するための仕組みがいくつもあります1

Emacs内でシェルを使う 1 shell / eshell 簡易シェル ✓ 軽量 ✓ Emacs統合 ✗ 互換性制限 2 vterm 高性能端末 ✓ 高速 ✓ 完全互換 ✓ libvterm使用 3 C-z + 外部 端末切替 ✓ 最速 ✓ TUI対応 ✗ 文脈分離 作業内容に応じて選択
  • M-! のような単発実行
  • shelleshell のような簡易シェル
  • 実際の端末にかなり近い挙動をする vterm

特に vterm は、bash や zsh をそのまま動かせるため、
「ほぼ端末なのに、Emacsの中にある」という感覚がありました2

コードを少し直す。
すぐ下のバッファで makepytest を実行する。
出力を見て、またその場で修正する。

この往復がとても速いです3
作業の文脈が一つの画面にまとまっている感じがあります。

ログをコピーしてメモに貼ったり、
コマンド結果をそのまま編集対象にしたりするのも自然でした。

1.1. C-z でターミナルに戻るという選択

ここで一度、話を整理します。
C-z は、実行中のプログラムを「一時停止」する操作です4

Emacsで C-z を押すと、Emacsは止まり、
起動元のターミナルに制御が戻ります。
そこで別の作業をして、fg(foreground)と入力すると、
再びEmacsが前面に戻ってきます5

C-z でターミナルに戻る Emacs実行中 (フォアグラウンド) C-z Emacs停止 (SIGTSTP) fg 端末で作業 (制御取得) UNIXジョブ制御の仕組み C-z = プロセスに SIGTSTP シグナル送信 fg = フォアグラウンドに復帰 (SIGCONT)

かなり昔からある、UNIXらしい操作です。

  • 出力が非常に多いコマンド
  • フルスクリーンのTUIツール(htop など)
  • tmuxで複数ペインを切り替えながらの作業

こうした場面では、Emacs内のvtermより、
素の端末のほうが安定していて速いと感じます6

2. どちらも正しく、どちらも不完全

ここまで使ってきて感じたのは、
どちらの選択も「間違いではない」ということです。

どちらも正しく、どちらも不完全 Emacs内 ○ 統合性 バッファ間移動 コピペ容易 △ 制限 TUIツール不完全 大量出力で重い 外部端末 ○ 純粋性 高速・安定 完全互換 △ 分離 文脈切替必要 操作が二段階 作業内容で切り替える 編集中心 → Emacs内 / 実行中心 → 外部端末
  • Emacs内シェルは統合性が高い。
  • 外部端末は純粋に操作しやすい。

問題は、作業内容が日によって変わる点です。

短い編集と確認を繰り返す日もあれば、
ほぼ一日中、端末で調査や実行をする日もあります。

そのため、

  • Emacs内で完結させる日は vterm
  • 端末作業が中心の日は、最初からEmacsを別ウィンドウで起動

という切り分けに落ち着きました。

  1. Emacsでは shell, eshell, term, vterm など複数のシェル・インターフェースがあり、それぞれ特徴と互換性が異なります。たとえば vterm はCで書かれた libvterm を使うため高い互換性と性能があります。 – emacsmirror/vterm: Fully-featured terminal emulator
  2. vtermは、C言語で実装されたlibvtermライブラリを動的モジュールとして読み込むことで、Emacs内で完全に機能する端末エミュレータを実現しています。Emacs Lispのみで実装された他のシェルモードと比較して、エスケープコードの完全なサポートと高速な描画性能を持ちます。 – GitHub – akermu/emacs-libvterm: Emacs libvterm integration
  3. 実際に vterm は Emacs Lisp 単体のシェルモードとは異なり、外部シェルを端末エミュレーションとして完全に近い形で動かせます。 – emacsmirror/vterm: Fully-featured terminal emulator
  4. UNIXのジョブ制御では C-z がSIGTSTPシグナルを送りプロセスを一時停止し、fg で再度フォアグラウンドに復帰させます。これはbashなどPOSIXシェルで広くサポートされている制御方法です。 – Ask HN: If you were rewriting Emacs from scratch
  5. fgコマンドは、停止中またはバックグラウンドで実行中のジョブをフォアグラウンドに移動させます。ジョブが停止している場合はSIGCONTシグナルを送信して再開し、直接的な端末インタラクションモードに移行させます。ジョブを指定しない場合、最も最近のジョブがデフォルトで選択されます。 – How To Use Bash’s Job Control to Manage Foreground and Background Processes | DigitalOcean
  6. 一部の端末ツール(例: htop のようなTUIアプリ)はEmacs標準の shell モードでは正しく表示されないことがあり、専用端末や vterm のような高互換ターミナルが推奨されます。 – emacsmirror/vterm: Fully-featured terminal emulator