rfig:Rust 终端自动补全,支持 zsh、Bash、Fish

软件名称

rfig

推荐类型

开发者自荐

平台

macOS、Linux

一句简介

用 Rust 编写的终端自动补全工具,支持 zsh、Bash、Fish,在输入时展示交互式菜单,并结合本地历史提供灰字建议。

核心功能

  • 输入命令时自动展示补全菜单,不需要按 Tab。
  • 支持多级子命令、选项、参数和动态上下文,例如 git checkout 后显示当前仓库分支。
  • 优先使用已安装的 shell 补全定义;缺少定义时可从命令的 --help / -h 学习,并在安装后后台优化缓存。
  • 根据用户选择习惯调整候选排序。
  • 结合本地历史提供类似 autosuggestions 的灰字提示。
  • 支持 zsh、Bash、Fish。
  • 使用终端配色适配菜单颜色和分类图标。

安装

brew tap tamia6/rfig

brew install rfig

rfig setup

也可以从 GitHub Releases 下载包含二进制和安装脚本的压缩包。

演示

rfig-demo

官网

源码

费用

免费、开源。

说明

当前界面以英文为主,项目正在完善多语言支持。

发帖前麻烦检查一下排版,这里的 Markdown 标记都被转义掉了,没有正常显示出来。

刚刚给您调整了一下排版。

表现有点差啊,rfig 在多行 prompt下有重绘漂移的问题

现象

终端窗口较窄(约 58 列)时,输入 tar 后屏幕变成这样(空行原样保留):

wujunkai@windows11 ~
                              2 × 10:40:47
wujunkai@windows11 ~
                              2 × 10:42:48
$ tar
→ ⚑ -c
  ⚑ -t
  ...

两个观察:

  1. 状态行被画了两份,而且时间戳不同(10:40:47 vs 10:42:48)——说明其中一份是过期位置上的重印;
  2. 持续输入后空行不断累积,输入行逐渐"沉"到屏幕底部。

看了下代码,感觉当前的重绘模型建立在"屏幕静止"的假设上:

  • rfig.bash 在 PS1 前埋 \[\e7\],每次按键用 \0338 恢复到这个保存的绝对位置并重印整个 prompt(_rfig_edit 里的 printf '\0338%s' "$prompt");
  • editor.rs 的菜单用 MoveTo(self.x, self.y) 绝对定位,坐标在进程启动时取一次;
  • editor.rs 里有滚动补偿(let scroll = (self.y + height).saturating_sub(self.rows)),但看起来只补偿菜单自身溢出引起的滚动。

问题在于,外部因素一样会让屏幕滚动或折行:bash 的回显换行、终端 resize 重排、以及 WSL/Windows Terminal 的滚动缓冲行为。一旦发生,DECSC 保存的坐标就是过期值,重印会落在
错位的地方,而且每次按键误差累积。

多行 + 右对齐块的 prompt 会放大这一点,我遇到的具体链条是:

  1. prompt_rows 只统计字面 \n,而 omp 第一行(用户名 + 右对齐的执行时间/时间戳)在窄窗口下会折行,实际占 2 行、按 1 行算;
  2. prompt=${PS1@P} 在每次按键时重新求值,而 PS1='$(_omp_get_primary)' 里是命令替换——也就是说每个键都会重跑一次 oh-my-posh。重新求值出的 prompt 内容宽度和屏
    幕上那份不同(状态符号、0ms/2ms、秒数都在变),折行行为跟着变。
1 个赞