我可以使用右箭头键一次从上一个命令行填充一个参数吗?
$ mogrify -resize 50% file.jpg
$
现在按右箭头应该填充mogrify
,再次按右箭头应该填充一直到mogrify -resize
,如果我再次按mogrify -resize 50%
等等。
如果到目前为止的命令行与前面的命令行不匹配,则应从最近匹配的命令开始填写
$ mogrify -resize 50% file.jpg
$ echo hi
$ mo
按向右箭头应填写mogrify
not echo
。
如何配置 zsh 来支持这一点?
答案1
以下代码可以Right正常运行,除非它位于命令行末尾。如果它位于命令行的末尾,它将查找以当前行上的文本开头的上一个匹配的历史记录行(它必须是完全相同的文本,包括空格)。如果找到,它将插入匹配行的下一部分,直到下一个单词的开头。使用数字参数 N,它从第 N 个匹配行中提取。
function immediate-complete-word-from-full-history {
emulate -L zsh
setopt extended_glob
local line=${${history[(R)${(b)LBUFFER}*]}[${NUMERIC:-1}]}
local blank=$' \t\n\f'
if [[ -z $line ]]; then return; fi
line=${line#$LBUFFER}
LBUFFER+=${line%"${line##[^$blank]##[$blank]#}"}
}
function forward-char-or-immediate-complete-word-from-full-history {
if [[ -n $RBUFFER ]]; then
zle forward-char
else
immediate-complete-word-from-full-history
fi
}
zle -N forward-char-or-immediate-complete-word-from-full-history
bindkey '\e[C' forward-char-or-immediate-complete-word-from-full-history
bindkey '\eOC' forward-char-or-immediate-complete-word-from-full-history
已知错误:这不适用于包含换行符的历史行,因为fc
将换行符输出为,这与行内\n
实际存在的换行符无法区分。\n
一个完全正确的解决方案必须从$history
.