You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用fzf实现命令行短语的部分补全?

如何使用fzf实现命令行短语的部分补全?

别担心,这个需求完全可以实现!fzf的灵活性很强,只要结合shell的命令行处理功能,自定义个小脚本就能搞定部分参数补全的需求。下面我分两种常用shell给你具体说怎么配置:

Bash 配置步骤

  • 首先在你的~/.bashrc里添加这个自定义函数:
fzf-history-arg-completion() {
  # 获取光标前的命令行内容,提取最后一个待补全的参数前缀
  local prefix="${READLINE_LINE:0:$READLINE_POINT}"
  local last_arg=$(echo "$prefix" | awk '{print $NF}')
  
  # 从历史命令里提取所有参数(跳过命令本身),筛选匹配前缀的内容去重后用fzf选择
  local selected=$(history | awk '{for(i=2;i<=NF;i++) print $i}' | grep "^$last_arg" | sort -u | fzf --query="$last_arg")
  
  # 如果选中了内容,替换当前的参数前缀
  if [ -n "$selected" ]; then
    local new_line="${prefix%$last_arg}$selected"
    READLINE_LINE="$new_line"
    READLINE_POINT=${#new_line}
  fi
}
  • 然后绑定这个函数到你喜欢的快捷键,比如Ctrl+Alt+R:
bind -x '"\e\C-r": fzf-history-arg-completion'
  • 保存后执行source ~/.bashrc生效,之后当你输入到某个参数的一半时,按Ctrl+Alt+R就能唤起fzf搜索历史里的匹配短语,选中后直接替换当前输入的前缀部分。

Zsh 配置步骤

如果你用的是zsh,配置逻辑类似,只是变量和绑定方式略有不同:

  • 在~/.zshrc里添加函数:
fzf-history-arg-completion() {
  local prefix=${BUFFER[1,$CURSOR]}
  local last_arg=$(echo "$prefix" | awk '{print $NF}')
  
  # 从zsh历史里提取所有参数,筛选匹配前缀的内容去重后用fzf选择
  local selected=$(history -n 1 | awk '{for(i=2;i<=NF;i++) print $i}' | grep "^$last_arg" | sort -u | fzf --query="$last_arg")
  
  if [ -n "$selected" ]; then
    BUFFER="${prefix%$last_arg}$selected"
    CURSOR=${#BUFFER}
  fi
}
  • 绑定快捷键(同样用Ctrl+Alt+R为例):
zle -N fzf-history-arg-completion
bindkey '^[^R' fzf-history-arg-completion
  • 执行source ~/.zshrc生效即可。

小优化建议

  • 如果想忽略大小写匹配,可以把grep "^$last_arg"改成grep -i "^$last_arg"
  • 如果希望光标在命令开头(没有输入任何参数)时,也能唤起所有历史参数的搜索,可以加个判断:当last_arg为空时,直接搜索所有历史参数。

备注:内容来源于stack exchange,提问作者Oneechan69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:28:12