少し前にこちらの記事が話題になりました。
naoya_itoの火を噴いたシェルtips - Togetterまとめ
rebuild.fmのEpisode41 でも言及されていた気がします。
弊社フィードフォース でも、ペアプロの時にこういった話をすることはあります。ただ、C-rやC-uは知られていても、M-pはあまり知られていない雰囲気でしたのでまとめました。
はじめに
M-pやM-nは、Escapeを押して離してpまたはnです。
OSXのターミナルをお使いの方は以下を設定すると、option-pまたはoption-nが使えます。それ以外の環境ではAltが使えるかもしれません。
デフォルトの動作を知る
デフォルトのM-pとM-nには、それぞれhistory-search-backwardとhistory-search-forwardが割り当てられています。
敢えて設定を書くとこんな感じです。
bindkey "^[p" history-search-backward
bindkey "^[n" history-search-forward
“git re"のあとにM-pを続けて打つ様子。“git"にマッチした履歴が現れます。M-nすると戻ってきます。
既存の関数をキーに割り当てる
以下の設定をすると、マッチする履歴が変わります。
bindkey "^[p" history-beginning-search-backward
bindkey "^[n" history-beginning-search-forward
設定場所は~/.zshrcが適切でしょう。[2002-05-14-1]
“git re"のあとにM-pを続けて打つ様子。今度は"git re"から始まる履歴にマッチします。こちらの方が直感的だと思います。
期待する履歴が現れたらReturnキーで確定して下さい。C-eで行末に移動したくなりますが不要です。
もう少しカスタマイズ
以下の設定をすると、ヒット後のカーソル位置が変わります。
autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[p" history-beginning-search-backward-end
bindkey "^[n" history-beginning-search-forward-end
“git re"から始まる履歴にマッチするのは変わりませんが、カーソル位置が行末になります。
期待した履歴が現れたらReturnキーで確定してください。カーソル位置が行末なので、こちらの方が自然に感じるかもしれません。Emacsのshell-modeをお使いの方は特に。
この設定はおそらく漢のzshで知ったのだと思いますが、昔すぎて覚えていません。
漢のzsh (4) コマンド履歴の検索~EmacsとVi、どっちも設定できるぜzsh|マイナビニュース
履歴マニアの話
シェルの履歴を辿るには十分な数の履歴が必要です。この程度の設定は当然でしょう。
# 履歴を保存するファイル
HISTFILE=$HOME/.zhistory
# メモリ内の履歴の数
HISTSIZE=1000000
# $HISTFILE に保存される履歴の数
SAVEHIST=1000000
※ 信じられないことにHISTSIZEのデフォルト値は30、SAVEHISTは0です。
こちらの設定もオススメです。
# $HISTFILEに時間も記録
setopt extended_history
# 全履歴の一覧を出力する
alias hall="history -E -i 1"
私が履歴の重要性を知った伝説の記事です。
横着プログラミング 第3回: 履歴マニア
10年以上前の記事というのに、全く色褪せることがありません(褒めすぎ)。
履歴を味方につけて開発スピードを上げましょう!
おまけ1
M-.(insert-last-word)もオススメです。直前の履歴の最後の引数をカーソル位置に挿入します。続けて打つと履歴を辿ります。意外に便利です。
おまけ2
以下の設定をするとM-x tetrisでテトリスをプレイ出来ます。有名ですよね?
autoload -U tetris; zle -N tetris
おまけ3
私の~/.zshenvと~/.zshrcを晒します。
~/.zshenv https://gist.github.com/masutaka/9287567
~/.zshrc https://gist.github.com/masutaka/9287575