我正在尝试实现按下时 zsh 历史搜索的自定义版本ctrl-r
(尽管我的功能将映射到不同的快捷方式)。
到目前为止,我已尝试使用read
,vared
并read-command
在用户按下定制的快捷键后读取输入。我的代码如下:
# Bind \eg to `git status`
function _cust-hist {
zle -I
local line
read -r line
echo $line
zle accept-line
}
zle -N _cust-hist
bindkey '\eg' _cust-hist
但似乎什么都没起作用。我肯定忽略了一些显而易见的东西,zsh 能做到这一点吗?
答案1
是的,这绝对有可能。
这应该可以帮助你入门:
function _cust-hist {
local REPLY
autoload -Uz read-from-minibuffer
# Create a sub-prompt, pre-populated with the current contents of the command line.
read-from-minibuffer 'History search: ' $LBUFFER $RBUFFER
# Use the modified input to search history & update the command line with it.
LBUFFER=$(echo "$(fc -ln $REPLY $REPLY)" )
RBUFFER=''
# Put some informational text below the command line.
zle -M "History result for '$REPLY'."
}
zle -N _cust-hist
bindkey '\eg' _cust-hist
如果你对它的工作原理感兴趣read-from-minibuffer
,你可以找到它的源代码在这里。如您所见,它使用read -k
或zle recursive-edit
来获取来自用户的输入。