ZSH 有一個強大的選單選擇自動完成功能,例如選擇目錄、使用kill 選擇進程(kill[tab][tab])。您可以使用箭頭來瀏覽選項。
是否也可以彈出歷史搜尋選單(CTRL+R)?選單允許導航目前 CTRL+R 搜尋列的匹配項嗎?
答案1
我知道這與您的要求相去甚遠,但它可能會解決您的根本問題。
有一個 shell 歷史記錄擴展,可以在搜尋歷史記錄時向您顯示一個充滿結果的頁面。它還首先根據當前目錄、git 儲存庫、退出狀態和主機向您顯示相關結果。
您可以在此處安裝該項目:https://github.com/curusarn/resh
CTRL使用+ 啟動它R(取代反向搜尋)。
搜尋應用程式如下所示:
免責聲明:我是該專案的創建者,這是無恥的自我推銷
答案2
zsh-navigation-tools
做這樣的事情。如果你使用 oh-my-zsh,你只需要添加zsh-navigation-tools
到plugins=(...)
你的.zshrc
然後 ctrl-R 將為你提供向上/向下和搜尋/過濾的滾動記錄。您可以在沒有 oh-my-zsh 的情況下使用它,但設定看起來需要更多工作。
答案3
從來沒聽過。
也許你想嘗試一下
predict-on
,它會做一些與你所要求的相關的事情:autoload -U predict-on zle -N predict-on zle -N predict-off bindkey '^X1' predict-on bindkey '^X2' predict-off
答案4
這是可能的;原則上,我修改了_kill
完成方式,使其也適用於歷史事件。
這是一個例子;選擇條目後,按 [ENTER] 一次接受事件編號(命令列顯示 fe hc 780
),然後再按 [ENTER] 執行命令。 (如果您想在執行之前修改命令列,請使用fc
而不是)。hc
$ hc Makefile[TAB]
history event
1906 9.3.2013 18:10 vi Makefile
1867 9.3.2013 17:26 less Makefile
780 3.2.2013 17:54 cat Makefile
776 3.2.2013 17:51 cat ../Makefile
要使用它,請將附加文件放入您的目錄中$fpath
,並將這些行添加到您的~/.zshrc
:
zstyle ':completion:*:historyevent' command 'fc -dE -lr 1'
zstyle ':completion:*:historyevent' sort no
最後,開始新的zsh
會話。
請注意,這是一個快速而骯髒的解決方案,但它已經運行良好一段時間了。
_歷史事件
#autoload
local out histevent list expl match desc listargs all nm ret=1
_tags historyevent || return 1
all=(-U)
match="*[[:blank:]]*[[/[:blank:]]$PREFIX*$SUFFIX*"
nm="$compstate[nmatches]"
out=( "${(@f)$(_call_program historyevent fc -l 2>/dev/null)}" )
desc="$out[1]"
out=( "${(@M)out[2,-1]:#${~match}}" )
histevent=( "${(@)${(@M)out##[^0-9]#[0-9]#}##*[[:blank:]]}" )
if zstyle -T ":completion:${curcontext}:historyevent" verbose; then
list=( "${(@Mr:COLUMNS-1:)out}" )
desc=(-ld list)
else
desc=()
fi
_wanted processes expl 'history event' \
compadd "$@" "$desc[@]" "$all[@]" -a - histevent && ret=0
if [[ -n "$all" ]]; then
zstyle -s ":completion:${curcontext}:historyevent" insert-ids out || out=menu
case "$out" in
menu) compstate[insert]=menu ;;
single) [[ $compstate[nmatches] -ne nm+1 ]] && compstate[insert]= ;;
*) [[ ${#:-$PREFIX$SUFFIX} -gt ${#compstate[unambiguous]} ]] &&
compstate[insert]=menu ;;
esac
fi
return ret
_fc
#compdef fc
local curcontext="$curcontext" line state ret=1
_arguments -C \
'-e[editor command]' \
'-l[list last history events]' \
'-n[suppress numbers]' \
'-r[reverse order]' \
'*:history event:->historyevent' && ret=0
if [[ -n "$state" ]]; then
_alternative \
'historyevent:: _historyevent' && ret=0
fi
return ret