キーカスタマイズ
シェルを手に馴染ませるために比較的簡単にできる設定の1つがキーカスタマイズである。そのための要点を示しておこう。
bindkeyコマンドとキーマップ
zshのキー割り当てはbindkey
コマンドで行なう。zshには複数のキーマップがあり,
% bindkey -e
vi風の操作感を好む場合は,
% bindkey -v
実はzshではさらに違うユーザ独自の新たなキーマップを作ることもできるし,
# 新しいウィジェットとなる関数 365march-forward() を定義
function 365march-forward () {
: ${_365march:-0}
if ((_365march++ % 4)) then
zle forward-char
else
zle backward-char -n 2
fi
}
# この関数をウィジェット化
zle -N 365march-forward
# emacsキーマップを見本に新しいキーマップ365marchを作る
bindkey -N 365march emacs
# 365marchキーマップの C-f に 365march-forward を割り当てる
bindkey -M 365march '^f' 365march-forward
# 使用するキーマップを 365march に変える
bindkey -A 365march main
この状態でコマンドラインに何文字か打って行頭に戻り
% bindkey -e
かくも過激な機能拡張ができるzshだが,
ヒストリ呼出しのカスタマイズ
シェルを使い始めの頃は,
そのためには検索機能つきで古いコマンドラインに戻る機能を用いればよい。その検索方法には大別して2つがある。
- 行頭マッチの検索
- インクリメンタル検索
(EmacsでいうC-s,C-r)
zshのemacsキーマップのデフォルトではC-p,C-nに検索なしの機能が割り当てられているが,
bindkey '^p' history-beginning-search-backward
bindkey '^n' history-beginning-search-forward
これは,
grep foo /usr/local/apache/logs/access_log
tail -f /usr/local/apache/logs/error_log
gimp &
コマンド入力履歴が上記のような場合に,grep
まで入力してhistory-beginning-search-backward
を呼び出すとカーソル位置は以下のようになる。
% grepC-p (C-pには history-beginning-search-backward が割り当てられている) ↓ % grep foo /usr/local/apache/logs/access_log ↑カーソル位置(pの次)
カーソルが行末に来る挙動に慣れていると最初はぎょっとするが,grep
の検索パターンを変えて何度も試したりするにはカーソル位置がその場の方が好都合だ。状況によるので一概にどちらが有利不利とは言えない。ただ,C-e
ですぐ行けるものの,
どうしても行末にカーソルが来た方がよい場合は別の機能を割り当てるとよい。
autoload -U up-line-or-beginning-search down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey '^p' up-line-or-beginning-search
bindkey '^n' down-line-or-beginning-search
エディタ (vi) とコマンドラインの往復
tcshの行エディタにある便利な機能にrun-fg-editor
というものがある。これは,
vi | C-z → ← C-z |
コマンドライン |
これと同じことをzshで行なうには,bindkey -s
で登録する。C-zに割り当てる例を示す。
setopt hist_ignore_space
bindkey -s '^z' '^[q %vi^m'
これは,C-zを押したときに," %vi"
を挿入し,C-mをタイプした」%vi
はシェルの管理下にあるジョブのうち,viという文字列で始まるジョブをフォアグラウンドにすることを意味し,hist_
有効時)。
ちなみに筆者自身はEDITOR
に登録されているエディタ」
export EDITOR=vim
alias vi='$EDITOR'
bindkey -s '^z' '^[q %\\$EDITOR^m'