pecoのコマンド履歴に日付を表示し、かつ日付を貼り付けない


概要

・mac/zsh
・history(コマンドの実行履歴)に日付も含めて保存
・pecoを使って、ctrl+rからコマンド履歴を引用する
・日付からも検索したい
・履歴の選択時に日付が貼られると困る

historyに日付が記録できていない人

下記を.zshrcに追加し source ~/.zshrc してください。

precmd='history -a; history -c; history -r' # 履歴のリアルタイム反映
setopt Extended_History           # 日付を保存する
setopt append_history             # 履歴を既存のhistoryに追加していく
setopt EXTENDED_HISTORY           # 開始と終了を記録


日付から検索したい

まず、下記のように設定するとhistory自体に日付は入っていても、pecoの検索画面に日付が表示されません。
(日付で検索できない)
参考: pecoを使って端末操作を爆速にする

function peco-history-selection() {
    BUFFER=`history -n 1 | tac | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection



「いつのコマンドなのか」も知りたい且つ絞りたいため、「-i」のオプションを追加

BUFFER=`history -n 1 | tac | awk '!a[$0]++' | peco`
↓
BUFFER=`history -i -n 1 | tac | awk '!a[$0]++' | peco`



一見できたように見えますが、これをそのまま選択すると日付もコマンドとして貼り付けられてしまいます。

解決策

下記に置き換えると↑と同様の表示で、貼り付け時に日付だけ除外できます。
BUFFER= 部分で出力された内容から、historyの番号や日付の区切りのスペースを数えて、以降の文字列に加工しています。
awk '!a[$0]++' は表示から重複を削除するものなので、不要なら削除可

function peco-history-selection() {
    local selected_log=`history -i -n 1 | tac | awk '!a[$0]++' | peco`
    if [ -n "$selected_log" ]; then
    BUFFER=`echo $selected_log | cut -d ' ' -f 4-`
    CURSOR=$#BUFFER
    zle reset-prompt
fi
}

zle -N peco-history-selection
bindkey '^R' peco-history-selection

結果

日付からコマンドを検索して貼り付けられるようになりました。