如何使用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
相关产品推荐
相关产品推荐

