CUI Emacs 入門: macOS から SSH で Ubuntu に接続して使う
目次
- はじめに
- 起動と終了
- ファイル操作
- バッファとウィンドウ
- カーソル移動
- コピー・切り取り・貼り付け
- 取り消しと中断
- 検索と置換
- シェルとの連携
- コマンド実行とヘルプ
- 最小限の設定 (init.el)
- チートシート
0 はじめに
0.1 環境
本記事の環境は次のとおりです。
- 接続元: macOS(標準的な JIS 配列キーボード)
- 接続先: Ubuntu(SSH 接続)
- シェル: bash
- Emacs: 端末上で動作する CUI モード(
-nwオプション)
CUI モードで起動しやすくするため、~/.bashrc に次のエイリアスを追加しています。
alias emacs='emacs -nw'
追加後は source ~/.bashrc を実行するか、シェルを起動し直してください。これにより、次のコマンドで CUI 版の Emacs が起動します。
$ emacs test.txt
-nw は "no window system" の意味で、ウィンドウを開かずに端末内で Emacs を動かすオプションです。
0.2 キーバインドの表記規則
本記事では Emacs の慣例に従い、修飾キーをハイフンでつないで表記します。
| 表記 | 意味 |
|---|---|
C |
Control キー |
M |
Meta キー(macOS の端末では ESC または Option。) |
SPC |
スペースキー |
C-p |
Control を押しながら p を押す |
C-x C-s |
C-x を入力し、いったん指を離してから C-s を入力する |
C-x 2 |
C-x を入力し、指を離してから 2 を単独で押す |
M-x |
Meta 修飾つきで x を押す |
C-SPC |
Control を押しながらスペースを押す |
Emacs では C-x や C-c は「プレフィックスキー」と呼ばれ、それ単独では動作せず、後続の入力と組み合わせて 1 つのコマンドになります。
0.3 用語
| 用語 | 意味 |
|---|---|
| バッファ | 編集対象を保持する Emacs 内部の作業領域。ファイルを開くと、その内容を保持するバッファが作られる。バッファへの変更は保存するまでファイルには反映されない。要は開いている文章ファイルとかのことを指す。 |
| ウィンドウ | 画面を分割した各領域。Emacs では「ウィンドウ」は OS のウィンドウではなく、この分割領域を指す。 |
| ミニバッファ | 画面最下部の 1 行。ファイル名やコマンド名の入力欄、およびメッセージの表示欄として使われる。 |
0.4 画面が急に閉じたときの対処
C-z を押すと Emacs はサスペンド(一時停止)し、シェルに戻ります。この場合は端末で次のコマンドを実行すると復帰します。
$ fg
停止中のジョブは jobs で確認できます。
1 起動と終了
$ emacs file.txt # ファイルを指定して起動
$ emacs # ファイルを指定せずに起動
| キー | コマンド | 動作 |
|---|---|---|
C-x C-c |
save-buffers-kill-terminal | Emacs を終了する。未保存の変更があれば保存するか確認される |
C-z |
suspend-frame | サスペンドしてシェルに戻る(fg で復帰) |
2 ファイル操作
2.1 ファイルを開く
C-x C-f # ファイルを開く (find-file)
ミニバッファに Find file: ~/ と表示されるので、パスを入力します。TAB キーで補完できます。存在しないパスを指定した場合は空のバッファが作られ、保存した時点でファイルが実際に作成されます。
2.2 保存する
C-x C-s # 上書き保存 (save-buffer)
C-x C-w # 別名で保存 (write-file)
C-x C-w ではミニバッファに Write file: と表示されるので、保存先のパスを入力します。
原稿でよく見かける誤りとして、保存を
C-c C-sと書いてしまうケースがあります。C-cで始まるキーはメジャーモード固有の機能に割り当てられる領域であり、保存はC-x C-sです。
2.3 変更を破棄する
M-x revert-buffer # ファイルの内容を読み直し、バッファの変更を捨てる
C-x k # バッファを閉じる(未保存なら確認される)
2.4 バックアップと自動保存
Emacs は既定で次の 2 種類のファイルを作ります。
-
file~: 保存時に作られるバックアップ -
#file#: 一定間隔で作られる自動保存ファイル
クラッシュや接続断からの復旧には M-x recover-file(単一ファイル)または M-x recover-session(セッション単位)を使います。これらのファイルを作業ディレクトリに散らかしたくない場合は、10 節の設定で 1 か所にまとめられます。
2.5 読み取り専用の切り替え
C-x C-q # 読み取り専用と編集可能を切り替える
3 バッファとウィンドウ
3.1 バッファの操作
C-x b # バッファを切り替える(TAB 補完可)
C-x C-b # バッファの一覧を表示する
C-x k # バッファを閉じる
ファイルを開くたびにバッファが増えます。ウィンドウを閉じてもバッファは残る点に注意してください。
3.2 画面の分割
C-x 2 # 上下に分割する (split-window-below)
C-x 3 # 左右に分割する (split-window-right)
「縦分割」「横分割」という言い方は、分割線の向きを指す場合と分割後の並びを指す場合があり、資料によって意味が逆転します。本記事では誤解を避けるため「上下分割」「左右分割」と表記します。
3.3 ウィンドウ間の移動
C-x o # 別のウィンドウへ移動する (other-window)
3.4 ウィンドウを閉じる
C-x 0 # 現在のウィンドウを閉じる
C-x 1 # 現在のウィンドウ以外を閉じる
いずれもバッファ自体は閉じません。バッファを閉じるには C-x k を使います。
3.5 ウィンドウの大きさを変える
C-x ^ # 現在のウィンドウを縦に広げる
C-x } # 現在のウィンドウを横に広げる
C-x { # 現在のウィンドウを横に狭める
C-x + # すべてのウィンドウの大きさを均等にする
4 カーソル移動
4.1 文字・行単位
C-p # 上の行へ
C-n # 下の行へ
C-b # 1 文字左へ (backward)
C-f # 1 文字右へ (forward)
4.2 単語単位
M-f # 次の単語の末尾へ
M-b # 前の単語の先頭へ
4.3 行頭・行末
C-a # 行頭へ
C-e # 行末へ
4.4 バッファの先頭・末尾
M-< # バッファの先頭へ
M-> # バッファの末尾へ
JIS 配列では < は shift + ,、> は shift + . です。不等号の開いている側が向いている方向(< は左=先頭、> は右=末尾)と対応させると覚えやすくなります。
原稿で
M->を先頭、M-<を末尾と書いてしまう誤りが頻出します。正しくはM-<が先頭、M->が末尾です。
4.5 画面のスクロール
C-v # 1 画面分進む
M-v # 1 画面分戻る
C-l # カーソル行を画面中央に置き直す(繰り返すと上端・下端へ)
4.6 行番号を指定して移動
M-g g # 指定した行番号へ移動する (goto-line)
5 コピー・切り取り・貼り付け
Emacs では、切り取りとコピーの結果は kill-ring と呼ばれる履歴に積まれ、貼り付け(ヤンク)はそこから取り出す操作として実装されています。
5.1 範囲を選択する
C-SPC # 現在位置にマークを設定する (set-mark-command)
C-x h # バッファ全体を選択する
C-SPC を押すとミニバッファに Mark set と表示されます。その後カーソルを動かすと、マークとカーソルの間がリージョン(選択範囲)になります。
5.2 コピーと切り取り
M-w # リージョンをコピーする (kill-ring-save)
C-w # リージョンを切り取る (kill-region)
C-k # カーソル位置から行末までを切り取る (kill-line)
C-k は行末で再度押すと改行そのものを削除します。したがって、行頭で C-k を 2 回押すと 1 行がまるごと消えます。
M-xはコマンド実行のためのキーであり、コピーではありません。コピーはM-wです。
5.3 貼り付け
C-y # kill-ring の先頭を貼り付ける (yank)
M-y # 直前に貼り付けた内容を、1 つ前の履歴に置き換える (yank-pop)
M-y は C-y の直後にのみ有効で、繰り返すと履歴をさかのぼれます。
5.4 組み合わせの例
カーソル行からバッファ末尾までをコピーする場合は次のとおりです。
C-SPC # マークを設定
M-> # バッファ末尾まで移動(ここまでがリージョン)
M-w # リージョンをコピー
5.5 矩形編集
列を揃えた編集には矩形コマンドが使えます。
C-x r k # 矩形領域を切り取る (kill-rectangle)
C-x r y # 矩形領域を貼り付ける (yank-rectangle)
C-x r t # 矩形領域の各行に文字列を挿入する (string-rectangle)
いずれも C-SPC でマークを置き、対角の位置にカーソルを移動してから実行します。
6 取り消しと中断
C-g # 実行中のコマンドや入力を中断する(ミニバッファから抜ける)
C-x u # 取り消し (undo)
C-/ , C-_ # 取り消し(同上。端末によっては C-/ が届かないため C-x u が確実)
Emacs には独立した「やり直し (redo)」コマンドが標準では用意されていません。取り消しの途中で C-g を押して系列を区切り、再度 C-x u を押すと、取り消した操作を戻す動作になります。
操作に迷ったとき、あるいは想定外のプロンプトが出たときは、まず C-g を押してください。
7 検索と置換
7.1 インクリメンタル検索
C-s # 前方検索 (isearch-forward)
C-r # 後方検索 (isearch-backward)
文字を入力するたびに候補が絞り込まれます。検索中の主な操作は次のとおりです。
-
C-s: 次の一致へ進む -
C-r: 前の一致へ戻る -
RET: 現在位置で検索を終了する -
C-g: 検索を中止し、開始位置に戻る
正規表現で検索する場合は C-M-s(前方)を使います。
7.2 置換
M-% # 対話的な置換 (query-replace)
C-M-% # 正規表現による対話的な置換 (query-replace-regexp)
置換対象ごとに次の入力を求められます。
-
yまたはSPC: 置換する -
n: 置換せず次へ -
!: 残りをすべて置換する -
qまたはRET: 置換を終了する
置換はカーソル位置から末尾方向に進みます。バッファ全体を対象にしたい場合は、M-< で先頭へ移動してから実行してください。
8 シェルとの連携
8.1 Emacs 内でシェルを動かす
M-x shell # シェルをバッファ内で動かす
M-x eshell # Emacs Lisp で実装されたシェル
M-x ansi-term # 端末エミュレーション(curses を使うプログラムも動く)
起動は
M-x shellです。C-x shellではありません。M-xはコマンド名を入力して実行するためのキーであり、shellはコマンド名です。
M-x shell で起動したバッファは通常の Emacs バッファなので、出力を C-SPC と M-w でコピーしたり、C-s で検索したりできます。
8.2 単発のコマンド実行
M-! # コマンドを実行し、結果を別バッファに表示する (shell-command)
M-| # リージョンを標準入力として渡し、コマンドを実行する (shell-command-on-region)
8.3 分割してシェルを開く例
C-x 2 # 上下に分割
C-x o # 下のウィンドウへ移動
M-x shell # シェルを起動
これで、上のウィンドウでファイルを編集しながら、下のウィンドウでコマンドを実行できます。
8.4 ビルドとエラー箇所への移動
M-x compile # ビルドコマンド(既定は make -k)を実行する
エラー行が出力された場合、その行にカーソルを合わせて RET を押すと該当ファイルの該当行へ移動できます。
9 コマンド実行とヘルプ
9.1 コマンドを名前で実行する
M-x # コマンド名を入力して実行する (execute-extended-command)
キーバインドが割り当てられていない機能は、すべてこの方法で呼び出せます。TAB で補完できます。
9.2 ヘルプ
C-h k # 指定したキーに割り当てられたコマンドを表示する
C-h f # 関数(コマンド)の説明を表示する
C-h v # 変数の説明を表示する
C-h b # 現在有効なキーバインドの一覧を表示する
C-h t # チュートリアルを開く
C-h k は、キー操作を忘れたときや、あるキーが何をするか確認したいときに有用です。ヘルプ画面は q で閉じます。
10 最小限の設定 (init.el)
設定ファイルは ~/.emacs.d/init.el に置きます。以下は副作用が小さく、CUI 環境でも有効な設定の例です。
;; 起動時のスタートアップ画面を表示しない
(setq inhibit-startup-screen t)
;; 行番号を表示する(Emacs 26 以降)
(global-display-line-numbers-mode 1)
;; 対応する括弧を強調する
(show-paren-mode 1)
;; インデントにタブではなくスペースを使う
(setq-default indent-tabs-mode nil)
;; バックアップ (file~) と自動保存 (#file#) を 1 か所にまとめる
(setq backup-directory-alist '(("." . "~/.emacs.d/backup")))
(setq auto-save-file-name-transforms '((".*" "~/.emacs.d/backup/" t)))
global-display-line-numbers-mode は Emacs 26 以降で利用できます。バージョンは端末で emacs --version を実行するか、Emacs 内で M-x emacs-version を実行すると確認できます。設定を書き換えた後は、M-x eval-buffer で読み込むか、Emacs を起動し直してください。
11 チートシート
| 分類 | キー | 動作 |
|---|---|---|
| 終了・中断 | C-x C-c |
Emacs を終了する |
C-g |
実行中の操作を中断する | |
C-z → fg
|
サスペンドと復帰 | |
| ファイル | C-x C-f |
ファイルを開く |
C-x C-s |
上書き保存 | |
C-x C-w |
別名で保存 | |
| バッファ | C-x b |
バッファを切り替える |
C-x C-b |
バッファ一覧 | |
C-x k |
バッファを閉じる | |
| ウィンドウ |
C-x 2 / C-x 3
|
上下分割 / 左右分割 |
C-x o |
別のウィンドウへ移動 | |
C-x 0 / C-x 1
|
現在のウィンドウを閉じる / 他を閉じる | |
| 移動 |
C-p C-n C-b C-f
|
上 / 下 / 左 / 右 |
M-f / M-b
|
単語単位で前後へ | |
C-a / C-e
|
行頭 / 行末 | |
M-< / M->
|
バッファ先頭 / バッファ末尾 | |
C-v / M-v
|
1 画面進む / 戻る | |
M-g g |
行番号を指定して移動 | |
| 編集 | C-SPC |
マークを設定(範囲選択の開始) |
M-w |
コピー | |
C-w |
切り取り | |
C-k |
行末まで切り取り | |
C-y / M-y
|
貼り付け / 履歴をさかのぼる | |
C-x u |
取り消し | |
| 検索・置換 |
C-s / C-r
|
前方検索 / 後方検索 |
M-% |
対話的な置換 | |
| シェル | M-x shell |
Emacs 内でシェルを起動 |
M-! |
単発のコマンド実行 | |
| ヘルプ | C-h k |
キーに対応するコマンドを調べる |
C-h t |
チュートリアル |