少し前にこちらの記事が話題になりました。
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が使えるかもしれません。

OSX Terminal setting

デフォルトの動作を知る

デフォルトの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すると戻ってきます。
history-search-backward

既存の関数をキーに割り当てる

以下の設定をすると、マッチする履歴が変わります。

bindkey "^[p" history-beginning-search-backward
bindkey "^[n" history-beginning-search-forward

設定場所は~/.zshrcが適切でしょう。[2002-05-14-1]

“git re"のあとにM-pを続けて打つ様子。今度は"git re"から始まる履歴にマッチします。こちらの方が直感的だと思います。
history-beginning-search-backward

期待する履歴が現れたら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"から始まる履歴にマッチするのは変わりませんが、カーソル位置が行末になります。
history-beginning-search-backward-end

期待した履歴が現れたら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