Bash(Zsh)上でよく使うカーソル移動などのショートカットを覚えると得する話

# きっかけ
最近他人のターミナルの画面を見る機会が多くなりまして、よく矢印キーだけでカーソル移動したりする方が多いなぁと感じたりするので、紹介用にまとめました。

また、これらのショートカットを覚えることで他のLinuxコマンドなどでも通用することも多いので、ぜひ覚えておいても損はないのかなと思います。

## Bash(Zsh)に存在するEmacsモードとviモード
bash、Zshなどのカーソル移動にはEmacsモードとViモードが存在します。
これらのモードはカーソル移動におけるショートカットにおいて主に違いがあります。

これらのショートカットキーはreadlineというGNUのライブラリによって提供されています。(2017-09-25 13:11 コメントの指摘より追記)

（更にコメントの指摘より追記：2017-09-27 10:33） Zshに関してはZsh Line Editorとして別途実装しているようでした。
https://wiki.archlinux.org/index.php/zsh#Key_bindings
> Zsh does not use readline, instead it uses its own and more powerful Zsh Line Editor, ZLE.

(--追記ここまで--)
　
　
大抵の場合BashやZshの場合、デフォルトのEmacsモードで事足りるかと思うので、今回はBashについてはEmacsモードについてまとめます。(Viモードについて気になる方は他の方の紹介しているViモードの記事をどうぞ)


## Emacsモードのカーソル移動
|ショートカット|意味|
|---|-------|
|Ctrl + a|カーソルを行頭に移動|
|Ctrl + e|カーソルを行末に移動|
|Alt + → ※1|単語ブロック毎に右に移動 ※2|
|Alt + ← ※1|単語ブロック毎に左に移動 ※2|
※1 Altは適宜メタキー(Escなど)に読み替えて下さい。以降Altが記載してあれば同じように読み替えて下さい。
※2 日本語に対しても使用できますが、基本的に英語に比べると、単語ブロックの判定の精度は落ちます。

## Emacsモードの文字削除
文字削除も便利なショートカットが存在します

|ショートカット|意味|
|---|-------|
|Ctrl + h|カーソル前の文字を削除|
|Ctrl + d|カーソル位置の文字を削除|
|Ctrl + w|単語ブロック毎に削除|
|Ctrl + u|カーソルから行頭まで削除|
|Ctrl + k|カーソルから行末まで削除|

ちなみに、Terminalでパスワードを入力する場面で打ち間違えたときに、Ctrl + uしたりするとパスワードを最初から打ち直したりできます。

Ctrl + w と Ctrl + h はVi(Vim)でも使えます。
Ctrl + hは地味ですが、ホームポジション崩したくない人(Vimmerとか)がよく使います[要出典]。

また、Bash、Zshにおいては行に文字が全く無い場合にはCtrl + dはexitと同じコマンドになります。

## 次候補、前候補
また、コマンドのヒストリーを遡る際の『候補列挙リストの移動』としての Ctrl+n Ctrl+p も同じです。

|ショートカット|意味|
|---|-------|
|Ctrl + n|前のヒストリーの候補へ|
|Ctrl + p|次のヒストリーの候補へ|

この候補列挙のショートカットはVimでも補完の候補の列挙リストの移動などで利用します。


## MySQLのCLIでも同様なキー操作が可能
これらのキー操作、CLIのMySQL操作でも一部同じショートカットをサポートしています。

MySQLのCLIもreadlineのライブラリによってショートカットが提供されているようです。(2017-09-25 13:11 コメントの指摘より追記)

|ショートカット|意味|
|---|-------|
|Ctrl + a|カーソルを行頭に移動|
|Ctrl + e|カーソルを行末に移動|
|Alt + →|単語ブロック毎に右に移動|
|Alt + ←|単語ブロック毎に左に移動|
|Ctrl + h|カーソル前の文字を削除|
|Ctrl + d|カーソル位置の文字を削除|
|Ctrl + u|**行を削除**|
|Ctrl + w|**カーソルから行頭まで削除**|
|Ctrl + k|カーソルから行末まで削除|
|Ctrl + n|前のヒストリーへ|
|Ctrl + p|次のヒストリーへ|

Ctrl + w と Ctrl + uが若干惜しい感じですが、概ねサポートしています。

また、CLIのMySQLでもCtrl + dのショートカットによるexitをサポートしています。
ほかにも、Bash、Zshと同じようにCtrl + rによるヒストリー検索もサポートしてますよね。

追記：BashとMySQLのCLIでCtrl + u Ctrl + w のショートカットの実装が異なるのは
https://dev.mysql.com/doc/refman/5.6/ja/mysql-tips.html
> Unix では、キーシーケンスは mysql のビルドに使用された入力ライブラリ (たとえば、libedit または readline ライブラリ) に依存します。

とのことでした。


## これらのEmacsっぽいショートカットはMacならデフォルトで利用可能
MacはこのEmacsモードのターミナルのカーソル操作に影響を受けているっぽい（それか、Emacs自体に影響を受けているか）ので、Macではおおよそ同じショートカットが利用できますので覚えておいてきっと損はありません。

|ショートカット|意味|
|---|-------|
|Ctrl + a|カーソルを行頭に移動|
|Ctrl + e|カーソルを行末に移動|
|Alt + →|単語ブロック毎に右に移動|
|Alt + ←|単語ブロック毎に左に移動|
|Ctrl + h|カーソル前の文字を削除|
|Ctrl + d|カーソル後の文字を削除|
|Ctrl + k|カーソルから行末まで削除|
|Ctrl + n|次の候補へ (※変換中)|
|Ctrl + p|前の候補へ(※変換中)|
※Ctrl-uとCtrl-wがダメっぽいです(追記：Ctrl + u と Ctrl + w はreadlineにより提供されていないからでしょうか・・・。)

一部対応していないキーがありますが、概ね対応しているのではないかと思います。
但し、エディタによってはこれらのキーを上書きして別の機能を割り当ててしまっている場合があるのでご注意を…。


## Viも色々と影響与えてますよ
ここまでEmacsのショートカットが多かったですが、Viのショートカットをサポートしているものも色々ありますよね。

カーソルの移動ではないですが、`man` や `--help`オプション や `git diff` で開くときに使われるlessなんかもViライクなショートカットをサポートしてますよね。

ちなみに、自分はこの記事を書くまで`less`コマンドで開いてたということに気づいてなかったと言うのは内緒…（viにそういう開くモードが有るもんだとばっかり思ってました…）


|ショートカット|意味|
|---|---|
|j|1行上に移動|
|k|1行下に移動|
|d|下にページ送り (※viだとノーマルモードでCtrl + d)|
|u|上にページ送り (※viだとノーマルモードでCtrl + u)|
|g|ページ先頭へ (※viだとノーマルモードでgg)|
|G|ページ終わりへ (※viだとノーマルモードでG)|
|/|ページ内検索の文字列入力開始|
|n|次のページ内検索結果へ|
|N|次のページ内検索結果へ|

なお、`less`の場合単にd,uではなくて、Ctrl + d, uでも元のショートカットと同じ挙動になります。
また、gもggも最終的には同じ場所にたどり着くので、vi使いは全く気にせず同じショートカットで使えるようになっていますよね。
qで`less`コマンドを終了するのとかもviみたいですよね。

## Viのショートカット体系のコマンド達
screenのコピーモードもViのようなショートカットコマンドをサポートしています。

|ショートカット|意味|
|---|---|
|h|左へ|
|j|下へ|
|k|上へ|
|l|右へ|
|gg|バッファ内先頭へ|
|G|バッファ内末尾へ|
|Ctrl-u|半ページ上に移動|
|Ctrl-d|半ページ下に移動|
|/|検索の文字列入力開始|
|n|次の検索結果へ|
|N|次の検索結果へ|

他にもViと同じ動作をするコマンドが幾つかあります(^,$,w,b,eなど)

他にも、個人的にはtigとかよく使ったりしますが、こちらもviライクなコマンドラインをサポートしたりしてます。

たぶん、他にもたくさんあるんだろうなーと思いつつ、思いつき次第書き込む形式で追記していきたいと思います。それかコメントで教えて下さい (←えっ…)

## おまけ
webの小ネタ系でViのhjklをショートカットとしてサポートしている場合も多いですが、個人的によく使うのは、

- Google日本語入力でzh、zj、zk、zlでviの移動方向にあわせて各矢印が出る(←↓↑→)

いろいろなwebサービスでおもむろにhjklと叩くと色々と反応がある場合があって、『あぁ、意識してるんだな』感が感じられます。


## まとめ
特にCLI系は新しいものに触れたときでも、Vi系やEmacs系のショートカットをサポートしているものも多いですので、特にマニュアル読まずに他で使えているショートカットを試してみるだけで意外と使えちゃったりします。
というわけで、ショートカットはEmacs系とVi系を少し覚えるだけでも決して損はないかと思いますので頑張って覚えましょう！

それでは皆さん、良いショートカットライフを！


*※ この記事では便宜上Emacsライク、Viライクなショートカットというような表現をしてますが、Emacsやviが先に実装したのか、それとも他から影響を受けて、後から実装したのかについては検証しませんのでご了承下さい。*