Macを使う新人エンジニアに絶対に覚えてもらいたいキーバインド入門

**VS Codeを使うならこの記事を参考にしておくと良いです。**
[VSCodeのEmacsキーバインド拡張まとめ](https://qiita.com/kurun_pan/items/507517c3f569b080abe2)


**ショートカットキーについて良い記事がありました。**
[Macで開発するなら抑えておくべきショートカットキーまとめ - Qiita](https://qiita.com/ryuichi1208/items/95b835b63c31d39c7629 "Macで開発するなら抑えておくべきショートカットキーまとめ - Qiita")

こんにちは！
新人エンジニアに向けてキーバインドを布教しています。
エンジニアといえばMacですが、MacではEmacsキーバインドがデフォルトで利用できます。
そのキーバインドが利用できるシーンは非常に多く、入力スピードを向上させてくれます。
エンジニアの技術スキルを向上させることももちろんですが、どのプログラミング言語とも相性がよく、ターミナル作業、ドキュメント作成、ブラウジングといったどのシーンでも活用できます。

キーバインドが使えるようになるとこんなに利点があります。

* キーバインドを使えると時間効率が上がる
* キーバインドは技術寿命が長い（Emacsキーバインドが登場してかなりの年月が経っているため、今後も長く使える可能性が高い）
* キーバインドでエンジニア人生の一日は得をする

# 1. 最初に
## 1.1. キーバインド
Emacsキーバインドの登場は1972年ごろ[^history-emacs-keybind]だそうです。2018年現在だと (2018年 - 1972年) = 46年 も経過してます。
キーバインドを「46年間も使われている技術」だと考えると今後もまだまだ寿命の長い技術だと捉えることができます。

[^history-emacs-keybind]: もし違っていたら教えてください。 http://xahlee.info/kbd/keyboard_hardware_and_key_choices.html


## 1.2. どこでつかえるの？
* ***Emacs***
* Mac OS Xのいろんなところ
* Unix/Linuxのターミナル
* IDE
 
プログラミング&インフラ系の作業が気持ちよくなること請け合いです。
またMac OS Xであれば各種アプリケーション上で使えることも多いです。
例えばブラウザのChromeやSafariであればほとんど使えます。
IDE(Eclipse, VisualStudio, NetBeans, IntelliJ)ではキーバインドのプリセットとしてemacs系キーバインドが用意されていることが多いです。

## 1.3. 表記について
(Emacsの)伝統的にキーバインドの表記はCtrlキーをC、Alt(Option, Graphic)キーをMと表します。
C-pであればCtrlとp、M-pであればAltとpを押す、ということです。

## 1.4. キーバインドが使える環境
ターミナルかEmacsを用意しましょう。
Mac OS XであればブラウザでもだいたいOKです。

## 1.5. コントロールキーの場所
日本語配列のキーボードであればAキーの左側にコントロールキーがあります。
英語キーボードの場合にはCAPS Lockキーをコントロールキーに変更します。

変更するには
「システム環境設定 > キーボード > 修飾キー」からCAPS Lockキーをコントロールキーにしておくと良いです。[^1]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47327/824ed5c7-4d54-7673-9515-ae26d9387a83.png)

[^1]: Zの左下のControlキーが標準だった時代、Emacs小指と言われる指の痛みがありました。Sunのキーボードは良かった…。

# 2. 絶対に覚えてもらいたいキーバインド
ここで紹介するキーバインドはエンジニア必携です。
ターミナルで「あっ、三回ほど前に実行したコマンドをちょっと変えて…」という場合などに効果バツグンです
Macでの文書編集でも(ほぼ)使えます。

## 2.1. 上下左右
* 上 C-p (Previous LineのP)
* 下 C-n (Next LineのN)
* 左 C-b (BackwardのB)
* 右 C-f (ForwardのF)

## 2.2. 行末、行頭
* 行頭 C-a (headのa)
* 行末 C-e (endのe)

C-aはheadでh, eが先に確保された…、らしいです。

## 2.3. 削除
* 一文字削除 C-d (deleteのd, Delキーと一緒)
* バックスペース C-h (キーシーケンスの^Hがバックスペース)
* 一行削除 C-k (kill ringのk)
* 一行削除 C-u (Cutのuらしい。Bashではカーソルから行頭までを削除。Zshでは行全体を削除。）

C-kは現在のカーソル位置から後ろを全部削除。
~~C-uはカーソル位置のある行を全て削除。(viのddみたいな感じです)~~ 
C-uはシェルによって動作が違うようです。　

**Bash** 現在のカーソル位置から前を全部削除。
**Zsh** 行削除

（@hnakamur さんから指摘をいただきました。ありがとうございます！）

C-kは一行削除ではありません。C-uは使えないけどC-kが使える、という環境も多いのでこのように書きました。
C-k、C-uで切り取った文字列はC-yで貼り付けることができます。便利！

## 2.4. ペースト
* C-kのペースト C-y (yankのy)

C-yは普通のペーストとは違い、OS側のクリップボードとは共有しません。
C-kでkill ringした文字列を貼り付けるときに使います。

## 2.5. 改行、リターン
* C-m 改行
* C-j 改行＋インデント

シェルだとどっちも改行になります。叩く頻度の多いリターンキーの代わりになります。
C-mはCR、C-jはCRLF?
参考: http://docstore.mik.ua/orelly/perl/cookbook/ch08_12.htm

# 3. zshで使えるプラスアルファ
zshだともう少し多くのキーバインドが使えます。bashやcshは長らく使ってないので不明。bashだとC-rが使えるというウワサ。
## 3.1. コマンド履歴検索
* 一つ前のコマンド検索 C-p コマンド履歴が上に並んでいて、そこにカーソルを動かす感覚で
* 一つ後のコマンド検索 C-n C-pしすぎたときに戻るように
* 後方履歴検索 C-r (Reverse incremental searchのr) 10回ほど前に打ったtarコマンドを探したい時に
* カーソル位置と直前文字を入れ替え C-t (hogeと打つところをhoegと打ってしまった時に)

C-rについては最初慣れるまで大変ですが、慣れると超便利です。
```shell> tar zcvf hogehoge.tar hogehoge/
shell> blah; blah; blah;
```
で、tarコマンドを探して編集したいときには
``` C-r, tar zcv``` と打てば出てきます
## 3.2 単語操作、移動　
* 一単語削除 M-BS (Alt(Option)キーとBS(Delete)キー、バックスペースキーです。)
* 単語を前に M-f (forwardのf)
* 単語で後ろに M-b (backwardのb)

M-BSが少し特殊ですね。ターミナルソフトウェアの設定によってM-hが使えるかもしれませんが、M-BSが無難です。
```shell> tar zcvf /path/to/fuga/hoge/piyo/pathto/fuga/blah.tar /tmp/hoge/```
なんていう長いコマンドの際に、スペースで区切られた単語を削除します。
この場合だと `/path/to/fuga/hoge/piyo/pathto/fuga/blah.tar`を単語として認識して移動、削除が行えます。

# 4 IDEで使えるかもしれない移動系
この辺は使える機会も減ってくるのであんまり覚えなくて良いです
Alt(オプションキー)との組み合わせがほとんどでね。AltになるとCtrlキーバインドのアップグレード版と覚えておくと良いです。
Ctrlなら文字に対して、Altなら単語に対して作用します。 (C-v, M-vだけ違いますね)

* 一画面次へ C-v (Vertical move? PageDownと一緒です)
* 一画面前へ M-v (Vertical Move? PageUpと一緒です)
* 一単語次へ M-f (C-fの派生)
* 一単語前へ M-b (C-bの派生)
* 一単語削除 M-d (C-dの派生)
* 一単語後ろを削除 M-h (C-hの派生)
* 改行 C-m
* 改行+インデント C-j (デフォルトだと使えない環境も多いです)

# Macブラウザ系
ChromeとSafariがメインなので間違ってたら教えてください。

## そこそこ共通
* Cmd-l ロケーションバー(URLバー)にフォーカス
* Ctrl+Tab 次のタブ
* Shift+Ctrl+Tab 前のタブ
* Option + Cmd + I 開発者ウィンドウ(Inspection Tool) 一部でF12

ロケーションバーにフォーカスは覚えておいて損は無いです。めっちゃ便利です。

## Safari
* (ロケーションバーで) Cmd + enter 新規タブで検索
* Cmd + T 新規タブ
* Cmd + N 新規ウィンドウ
* Shift + Cmd + N プライベートウィンドウ
* Cmd + F 検索

プライベートウィンドウはｹﾞﾌﾝｹﾞﾌﾝ…な用途ではなくて、ログイン周りなどでクッキーをオフにして試験するときに重宝します。

## Chrome
* Cmd + F 検索

# Mac系
* Cmd + w ウィンドウを閉じる
* Cmd + q アプリケーションの終了

UNIX/Linuxのウィンドウマネージャ時代からデフォルトの由緒正しき(?)キーバインドでした。。
アプリケーションでのマルチウィンドウ(?)が一般的になったのでCmd+wでウィンドウをを閉じるのは重宝します。
ブラウザ系やFinderなどだとタブを閉じることと同意です。


# 5. 使用例
## 5.1. あるシェルでの出来事1
```shell-session
shell> cd /path/to/hoge
```
とここまで入力して、「あっ、ディレクトリを掘ってないから先にmkdirしておこう」という場合、次のキーバインドが使えます。
C-a, C-k, mkdir -p /path/to/hoge, C-y
* C-a でカーソル位置を先頭まで持って行って
* C-k で行を切り取り
* mkdir -p /path/to/hogeでディレクトリを一気に作成
* C-y で切り取った行を貼り付け

となります。~~C-aの後にmkdir -p /path/to/hoge;って書けば良いというのはナシで~~

## 5.2. あるシェルでの出来事2

```shell-session
shell> cd /path/to/dir
shell> tar zcvf hoge.tar.gz hoge/
shell> cp hoge.tar.gz example.com:/tmp/hoge.tar.gz
shell> mv hoge.tar.gz hoge2.tar.gz
shell> rm -rf hoge
shell> cd /tmp/
```

ここでhoge.tar.gzを解凍したくなった時には次のようにキーバインドを使います。
C-r, 'tar ', M-BS, C-a, M-f, M-d, zxvf
とすると…

* C-rで過去のコマンド履歴を開始
* tar に一致するコマンドを検索 (tar zcvf hoge.tar.gz hoge/がヒット)
* M-BSでhoge/を削除
* C-aで行頭へ移動
* M-fでzcvfへカーソル移動
* zxvf で解凍用のコマンドを入力

これで tar zxvf hoge.tar.gz が入力されます。

# 6. さいごに
この辺りのキーバインドの系譜はEmacsから派生しています。
Emacsを使えるように一度はトライしてみましょう。
viも独特のキーバインド(というかモード)がありますがそちらも使えるようにしましょう。

# 謝辞
いくつかのキーバインドは後輩の櫻井君に教えてもらいました。Thanks!


# 7. 参考
Emacsのキーバインド覚書
http://www.aise.ics.saitama-u.ac.jp/~gotoh/EmacsKeybind.html
OS のキーバインドを Emacs 風にするツールまとめ
http://qiita.com/senda-akiha/items/7dd828241423d473c576
通常の3倍の速度でプログラミング！？「Emacsキーバインドのすすめ」
http://www.slideshare.net/KinkumaDesign/emacs-keybind