Bash中FZF高度小于100%时选择补全后提示符消失的问题
问题原因
当FZF以非100%高度运行时,它会在终端光标位置下方创建局部交互窗口,退出后未能正确恢复终端的光标位置与屏幕状态,导致Bash提示符被覆盖或未重新渲染。而100%高度模式下FZF会占用整个终端屏幕,退出时会自动恢复全屏状态,因此提示符能正常显示。
解决方案
提供两种可靠的修复方式:
方式1:让FZF窗口显示在光标上方
修改FZF调用参数,添加--reverse,让选择窗口出现在当前命令行上方,退出后光标自动回到原位置,不会干扰提示符:
_mycmd_fzf_completions() { if (( COMP_CWORD == 1 )); then local dir_select dir_select=$(find -L "${COMP_WORDS[COMP_CWORD]:-.}" -maxdepth 1 -mindepth 1 -type d 2> /dev/null | fzf --height 50% --reverse --query="${COMP_WORDS[COMP_CWORD]}" ) case "$?" in 0) COMPREPLY=( "${dir_select}" );; *) return 0;; esac fi } complete -F _mycmd_fzf_completions mycmd
方式2:强制Bash重绘提示符
如果--reverse不符合使用习惯,可在FZF执行完成后添加终端控制命令,强制Bash重新渲染提示符和当前命令行:
_mycmd_fzf_completions() { if (( COMP_CWORD == 1 )); then local dir_select dir_select=$(find -L "${COMP_WORDS[COMP_CWORD]:-.}" -maxdepth 1 -mindepth 1 -type d 2> /dev/null | fzf --height 50% --query="${COMP_WORDS[COMP_CWORD]}" ) case "$?" in 0) COMPREPLY=( "${dir_select}" );; *) return 0;; esac # 强制刷新终端并重新绘制提示符 echo -ne "\r$PS1$COMP_LINE" printf "\e[0m" fi } complete -F _mycmd_fzf_completions mycmd
注意:代码中已为路径变量添加双引号,避免路径含空格时出现解析错误。
内容的提问来源于stack exchange,提问作者Rishi K.
相关产品推荐
相关产品推荐

