memo

2011-02-06

zsh で履歴を menu-select で選べるようなの

zsh で履歴を menu-select で選べるようなのを http://www.zsh.org/mla/users/2004/msg00383.html を参考にしつつ書いてみた。

_history_select:

#compdef -k menu-select ^xs ^x^s

_history_select() {
    local h
    local -a hists disps
    h="$(fc -l -n -m "*${BUFFER}*" -1 0)"
    if [[ -z "$h" ]]; then
        # no histories matched
        return 1
    fi
    # split by newline
    hists=(${(f)h})
    disps=(${(f)"$(fc -l -n -i -m "*${BUFFER}*" -1 0)"})
    if [[ -n "${BUFFER}" ]]; then
        # highlight matches
        disps=("${disps[@]//(#b)(${~BUFFER})/${fg[magenta]}${match[1]}${fg[black]}}")
    fi
    # FIXME: if (( CURRENT != 1 )); compadd insert result in wrong place
    # TODO: starts with interactive mode
    compadd -U -Q -l -V hists -d disps -a hists
}

_history_select "$@"

$fpath 以下に置いて ^x^s で開始。

archives/2011-01/2011-01-31_1.rst の設定をしてあるなら ^s で interactive mode に移って候補を絞り込める。

ホントは開始後すぐに interactive mode に移りたいんだけど、うまくいかん。 zstyle ':completion:*' menu select interactive しちゃうと他の補完も道連れになっちゃうし、 普通の補完を一回やらないと何故か動いてくれない。