Emacsの使い方を忘れてしまったので思い出す

最近職場が変わり、それまではWindows7しか使ってこなかった（使わせてもらえなかった）自分が、Macしか使わせてもらえない職場に移った。Macで使うとき標準にしたいテキストエディタを何にしようか迷っていたが、こだわっているような暇もなかったのでとりあえずEmacsをインストールした。数年ぶりにEmacsを起動したが、昔使っていたときのキーバインドを忘れてしまっていたので、思い出す意味でも記事にまとめることにした。

# `-nw`オプション
思い出せば初めてEmacsに触れたのは大学一年目の授業だった。RedHatLinuxのEmacs21だったような気がする。RedHatLinux自体はGUIだったが、なぜか`emacs -nw`で起動するように教授が指示していたので、そのときはGUIで動かせることを知らなかった。今思えば、`-nw`オプションをつけるとマウスが使えないという制約が生まれるので、自然とEmacsのキーバインドを覚えざるを得なくなるのが狙いだったのではないかと思う。

そんな昔話を思い出したので、しばらく思い出すまではGUIモードは封印する。

# Emacsのキー操作
## バッファ操作
Emacsはバッファという作業領域をもっており、そこに編集ファイルを表示したり、Shellプログラムを表示してコマンドを実行したりできる素晴らしい仕組みを持っている。先のとおり、GUIを封印するので、このバッファ操作は、WindowsOSのAlt+Tabでウィンドウを切り替えるのと同じくらい重要な操作になる。これを忘れるとどうしようもないくらいEmacsが使いづらくなってしまうので、これだけは忘れてはいけないと思われる代表的なキー操作をまとめる。

| キー操作 | 効果                                   |
|----------|--------------------------------------------|
| C-x C-b  | バッファの一覧を表示する                   |
| C-x b    | 指定したバッファに切り替える               |
| C-x k    | そのバッファを殺す（作業内容が消える）     |
| C-x o    | 次のバッファに移動する                     |
| C-x 0    | そのバッファを閉じて消す（作業内容は残る） |
| C-x 1    | そのバッファ以外を消す（作業内容は残る）   |
| C-x 2    | そのバッファを水平分割する                 |
| C-x 3    | そのバッファを垂直分割する                 |

## カーソル移動
方向キーとマウスがあれば事足りると思っていた時期が私にもありました。( ･ิω･ิ)
というのも、これまで仕事の都合でEmacsしか使わなくて済むようなことはなかった。いろんなアプリ（メモ帳とかExcelとかIEとかviとか自社製の謎のIDEとか）やCapsLockをCtrlにできないシンクラPCを使った仕事をしていると、↑→↓←やHome/End/PageUp/PageDownキー（あとFnキーも）を覚えたほうが効率が良かったりする。

とはいうものの、Emacsを使うならばこれくらいは知っておくと便利と思うものをまとめておく。

| キー操作 | 効果               |
|----------|------------------------|
| C-a      | 行先頭に移動           |
| C-e      | 行末尾に移動           |
| M-<      | ファイル先頭に移動     |
| M->      | ファイル末尾に移動     |
| C-l      | その行を中央に表示する |
| C-v      | 一画面分下に移動       |

## 編集操作
クリップボードにコピーしたり保存したりするのは、メモ帳でもショートカットキーを覚えたほうが使いやすい。だが、OS標準のショートカットキーとEmacsキーバインドは異なる点が多いのでまとめておく。

| キー操作 | 効果                   |
|----------|----------------------------|
| C-x u    | Undo                       |
| C-g C-/  | Redo                       |
| C-SPC    | 文字選択開始               |
| M-w      | 選択部分をコピー           |
| C-y      | 貼り付け                   |
| C-d      | その文字削除               |
| C-k      | その文字以降の行末まで削除 |
| C-x h    | すべてを選択               |
| C-s      | 文字列検索                 |
| M-x replace-string      | 文字列置換                 |
| C-q tab  | Tab文字を入力              |
| M-/      | 単語を補完する  |
| C-\      | 半角全角切り替え           |

## その他の操作
ファイル操作などの基本的なものと、シェルコマンドと連携するような「知っておくと便利」な機能をまとめる。

| キー操作   | 効果                |
|------------|-------------------------|
| C-x C-f    | ファイルを開く(※1)   |
| C-x C-s    | 上書き保存              |
| C-x C-c    | Emacs終了               |
| C-z        | 作業中断。再開するときは`fg`コマンドを実行 |
| M-!        | 任意のshellコマンド実行(※2) |
| M-;        | コメントアウト挿入 |
| M-x eshell | eshell起動(※3)          |
| M-x compile| Makefileがあるとビルドできる|
| M-x tetris | テトリス起動            |
| M-x eww    | ブラウジング(※4)  |

### ※1: TRAMP機能
`/ssh:username@hostname:/path/to/file`でsshログインできるサーバのファイルも開くことができる。たしか、sshじゃなくてftpでもできた気がするが忘れてしまった。

### ※2: 標準入力するコマンドの実行
任意のコマンド1行を入力できるようになる`M-!`だが、標準入力を求められるコマンドを実行するとうまく動かない。これを回避するにはコマンドの最後に`&`をつけるといい。

### ※3: Emacs Lisp製のシェル
eshell以外にも`M-x shell`などもあるが、古いemacsだとTabキーで補完できなかったり、`passwd`コマンドで入力した値が表示されたり、ところどころ困る時がある。
対してeshellはemacs内部でもTabキーで補完でき、基本的にどのバージョン・環境(Cygwin/Meadow/XEmacsとか)でも同じような動きをするのでおすすめ。

### ※4: emacsの中でブラウジングできる
昔は`w3m`だったと思うのだが、今は(Emacs24以降)`eww`というemacsで動作するブラウザが搭載されたらしい。
この記事をmarkdownで書いているのもemacsだが、例えばmarkdownのプレビューをewwで確認することもできる。詳細は割愛するが、`markdown-mode`をインストールしていると`C-c C-c l`でバッファが分割されてewwでプレビューできる。


# さいごに
emacsは奥が深いので調べ始めるとキリがないですが、変にカスタマイズして何でもEmacsで作業するようなこだわりは求めなくてもいいんですよ。マウスに手を伸ばさずにサクッと操作できる、これがとても気持ちがいい。これだけです。特にノートパソコンやSSHでリモートした環境で作業するときは。
このサクっと操作できる幸せだけを忘れなければ、きっと今後もEmacsと付き合っていけると思う。