从之前的命令参数中填写

从之前的命令参数中填写

我可以使用右箭头键一次从上一个命令行填充一个参数吗?

$ mogrify -resize 50% file.jpg
$

现在按右箭头应该填充mogrify,再次按右箭头应该填充一直到mogrify -resize,如果我再次按mogrify -resize 50%等等。

如果到目前为止的命令行与前面的命令行不匹配,则应从最近匹配的命令开始填写

$ mogrify -resize 50% file.jpg
$ echo hi
$ mo

按向右箭头应填写mogrifynot 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.

相关内容