zshとiTerm2でキーボードショートカット(キーバインド)を作成する
bashやzshでは、alias gs='git status'のように設定ファイルに登録すると、gsと入力するだけでgit statusを実行してくれる機能、エイリアスがあります。
今回は、エイリアスよりカスタマイズ性に優れた、emmetのような「キーバインド」という機能を紹介したいと思います。
キーバインドとは、登録したコマンドを任意のキーで呼び出したら、実行はせず、ターミナル上にコマンドが展開された状態になります。さらに、展開した時にカーソルの位置を自由に設定することも出来ます。
文章だけではイメージが湧きにくいし、すぐ実行しないならエイリアスのほうが便利ではないかと思う方もいると思うので、サンプルを用意しました。
[Option]+[c]を入力したら、git commit -m ""がターミナル上に展開され、""の中にカーソルが自動で移動されるような設定をしているとします。
上記のような設定をしていると、gitでコミットをする場合、下記のようにとても楽にコミットすることが出来ます。
- [Option]+[c]と入力して、git commit -m ""をターミナル上に展開
- カーソルが""の中に来ているので、そのままコミットメッセージを入力
- エンターキーを押してコミットを実行
このように、キーバインドを設定していると、自分で長いコマンドを入力する必要も無くなり、カーソル位置を←→のキーで移動する必要も少なくなります。
では、実際にキーバインドを設定していきます。
キーバインドを作成
キーバインドは.zshrcに追記します。
.zshrcについては以下の記事で紹介しています。
サンプルコード
以下の例では、[Control]+[c]でgit commit -m (カーソル位置) -m "" -m ""のように展開されます。
function git_commit() {
BUFFER='git commit -m "#'
CURSOR=$#BUFFER
BUFFER=$BUFFER'" -m "" -m ""'
}
zle -N git_commit
bindkey '^a' git_commit
解説
■ 関数名
1, 6, 7行目のgit_commitは関数名です。関数名には任意の名前を付けることが出来ます。
■ BUFFER=' '
カーソルより前に表示させたいコマンドを記述しています。コマンドはシングルクォーテーションかダブルクォーテーションで囲みます。
■ BUFFER=$BUFFER' '
カーソルの後ろに表示させたいコマンドを記述しています。こちらもコマンドをシングルクォーテーションかダブルクォーテーションで囲みます。
■ bindkey
上記では[Control]+[c]で、関数git_commitを呼び出すよう記述しています。
^は[Control]キーのことです。
bindkeyにControlキー以外を割り当てる
zshでbindkeyに[Control]キーを割り当てることは出来ますが、[Command]キーや[Option]キーを割り当てることは出来ません。
しかし、iTerm2というターミナルアプリを使えば[Command]キーなどを割り当てることが出来ます。
手順は以下の通りです。
1. .zshrcのbindkeyの記述を変更
サンプルコードを参考にすると、7行目の箇所を以下のように書き換えます。
2. iTerm2でのbindkeyの設定
環境設定 > Keysの+ボタンをクリックします。
- Keybord Shortcut:コマンドを呼び出す時に使用したいキー
- Action:Send Escape Sequence
- Esc+:先程.zshrcで設定した「任意の名前」
以上で好きなキーを使い、設定したコマンドを呼び出すことが出来ます。
まとめ
基本的にコマンドをショートカットキーで呼び出す設定はaliasで十分だと思います。しかし、いろいろカスタマイズしようとするとaliasでは限界があります。
そのような時は、bindkeyを使って自分の好きなようにカスタマイズしてみてはいかかでしょうか。