bashショートカットキー備忘録

# 内容
以下ページが大変勉強になりました。

- [bashのキーバインド(キーボードショートカット) まとめ - readlineとbind、ついでにstty編](http://hogem.hatenablog.com/entry/20090411/1239451878#f-2585238a)


当記事では主に、自分がよく使うキーバインドを上記ページから抜粋しています。



## stty(端末)

### キーバインド確認

```bash:(bash)$ 
# 端末のキーバインド確認
stty -a
```

### キーバインド変更（設定）

```bash:~/.bashrc
# C-sによる画面の停止を無効にする
stty stop undef
```

## Bash キーバインド（GNUReadline emacsキーバインド)

### キーバインド確認
```bash:(bash)$ 
# bashのman(デフォルトのキーバインド・機能の説明がある)
man bash

# 現在のキーバインド確認
bind -p
```

## 中でも自分がよく使うキー

<table border="1">
  <tr>
    <td style="text-align:center;">区分</td>
    <td style="text-align:center;">readlineの関数名</td>
    <td style="text-align:center;">name</td>
    <td style="text-align:center;">説明 (#メモ)</td>
  </tr>
  <tr>
    <td style="text-align:center;">コマンド実行</td>
    <td style="text-align:left;">C-j</td>
    <td style="text-align:left;">accept-line</td>
    <td style="text-align:left;">Enter</td>
  </tr>
  <tr>
    <td style="text-align:center;" rowspan="8">カーソル移動</td>
    <td style="text-align:left;">C-a</td>
    <td style="text-align:left;">beginning-of-line</td>
    <td style="text-align:left;">行頭に移動 # Home</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-e</td>
    <td style="text-align:left;">end-of-line</td>
    <td style="text-align:left;">行末に移動 # End</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-b</td>
    <td style="text-align:left;">backward-char</td>
    <td style="text-align:left;">1文字戻る # ←</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-f</td>
    <td style="text-align:left;">forward-char</td>
    <td style="text-align:left;">1文字進む # →</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-f</td>
    <td style="text-align:left;">forward-word</td>
    <td style="text-align:left;">次の単語に移動</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-b</td>
    <td style="text-align:left;">backward-word</td>
    <td style="text-align:left;">前の単語に移動</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-]</td>
    <td style="text-align:left;">character-search</td>
    <td style="text-align:left;">文字を 1 つ読み込み、その文字が次に現われる場所に移動</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-C-]</td>
    <td style="text-align:left;">character-search-backward</td>
    <td style="text-align:left;">文字を 1 つ読み込み、その文字が前に現われた場所に移動</td>
  </tr>
  <tr>
    <td style="text-align:center;" rowspan="8">文字削除、<br>貼り付け</td>
    <td style="text-align:left;">C-h</td>
    <td style="text-align:left;">backward-delete-char</td>
    <td style="text-align:left;">直前の1文字を削除 # BackSpace</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-d</td>
    <td style="text-align:left;">delete-char</td>
    <td style="text-align:left;">直後の1文字を削除 # Delete</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-w</td>
    <td style="text-align:left;">unix-word-rubout</td>
    <td style="text-align:left;">直前の1単語を削除(単語境界は空白類)</td>
  </tr>
  <tr>
    <td style="text-align:left;">MC-h</td>
    <td style="text-align:left;">backward-kill-word</td>
    <td style="text-align:left;">直前の1単語を削除</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-d</td>
    <td style="text-align:left;">kill-word</td>
    <td style="text-align:left;">直後の1単語を削除</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-u</td>
    <td style="text-align:left;">unix-line-discard</td>
    <td style="text-align:left;">カーソル以前の文字を削除 # パスワード間違ったときなどに</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-k</td>
    <td style="text-align:left;">kill-line</td>
    <td style="text-align:left;">カーソル以降の文字を削除</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-y</td>
    <td style="text-align:left;">yank</td>
    <td style="text-align:left;">削除,killした単語を貼り付け</td>
  </tr>
  <tr>
    <td style="text-align:center;" rowspan="3">他編集</td>
    <td style="text-align:left;">C-t</td>
    <td style="text-align:left;">transpose-chars</td>
    <td style="text-align:left;">直前の文字と、その前の文字を入れ替える</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-t</td>
    <td style="text-align:left;">transpose-words</td>
    <td style="text-align:left;">スペース区切りでカーソル位置の単語と前の単語を入れ替える</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-xC-u</td>
    <td style="text-align:left;">undo</td>
    <td style="text-align:left;">変更を元に戻す(ExcelなどのCtrl + zと同じ)</td>
  </tr>
  <tr>
    <td style="text-align:center;" rowspan="6">履歴利用</td>
    <td style="text-align:left;">C-n</td>
    <td style="text-align:left;">next-history</td>
    <td style="text-align:left;">次の履歴を表示 # ↓</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-p</td>
    <td style="text-align:left;">previous-history</td>
    <td style="text-align:left;">前の履歴 # ↑</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-r</td>
    <td style="text-align:left;">reverse-search-history</td>
    <td style="text-align:left;">履歴を後方に(遡って)インクリメンタルサーチ</td>
  </tr>
  <tr>
    <td style="text-align:left;">C-s</td>
    <td style="text-align:left;">forward-search-history</td>
    <td style="text-align:left;">履歴を前方にインクリメンタルサーチ *2</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-&lt;</td>
    <td style="text-align:left;">beginning-of-history</td>
    <td style="text-align:left;">履歴の先頭を表示</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-&gt;</td>
    <td style="text-align:left;">end-of-history</td>
    <td style="text-align:left;">履歴の最後を表示</td>
  </tr>
  <tr>
    <td style="text-align:center;" rowspan="2">補完</td>
    <td style="text-align:left;">C-i</td>
    <td style="text-align:left;">complete</td>
    <td style="text-align:left;">コマンド、引数など。適した単語を補完 # Tab</td>
  </tr>
  <tr>
    <td style="text-align:left;">M-.</td>
    <td style="text-align:left;">insert-last-argument</td>
    <td style="text-align:left;">直前のコマンドの最後の引数を挿入</td>
  </tr>
  <tr>
    <td style="text-align:center;">他</td>
    <td style="text-align:left;">C-l</td>
    <td style="text-align:left;">clear-screen</td>
    <td style="text-align:left;">ターミナルをクリア # clearコマンド</td>
  </tr>
</table>


### M-の押し方
M-は通常Altが割り当てられていますが、ターミナルで別の機能に使われていたり、
メニューバーへのフォーカスに取られたりすることがあります。

teratermを使用している場合、設定-キーボード-メタキーを「on」にすれば、
Alt単発押しでメニュー、Alt+他のキーでキーバインドと使い分け可能です。



## 備考
あわせてbashで個人的によく使うオプションを備忘録としてメモ。

### Ctrl-Wの単語削除をスラッシュ区切りにする設定。
※最近は設定しなくても、MC-hを使えば事足りるような気がしている。

```bash:~/.bashrc
if [[ -t 1 ]]; then
    stty werase undef
    bind '\C-w:unix-filename-rubout'
fi
```

### リダイレクトの上書き抑止
以下のとおり、リダイレクトでの上書きは、set -C で抑止可能です。

- [シェルスクリプトでリダイレクトによる上書き防止](https://qiita.com/b4b4r07/items/3779fc3ab98b918c7711)

### history反映・再読み込み

```bash:(bash)$
# historyをhisotryファイルに書き出し（ログアウトせずに）。
history -a

# historyfileのload
history -r

# 同時にやる場合
history -a && history -r
```


### tty
リモート(ssh)で警告が出ることがあるので、 test -t 1でチェックして設定したほうが良さそうです。(下記サイトを参考）

- [bashrc 内で bind を使うとリモートからコマンド実行時に警告が出る](http://keyamb.hatenablog.com/entry/2017/01/08/193757)



## 他、参考ページ
- [Man page of BASH](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)