# rfig：Rust 终端自动补全，支持 zsh、Bash、Fish

**URL:** <https://meta.appinn.net/t/topic/93146>\
**Category:** 发现频道\
**Created:** [2026 年10 月 9 日 03:35 UTC](https://meta.appinn.net/t/topic/93146 "2026-10-09T03:35:37Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![tamia6](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/tamia6/32/80247_2.png) [@tamia6](https://meta.appinn.net/u/tamia6)\
**Post date:** [2026 年10 月 9 日 03:35 UTC](https://meta.appinn.net/t/topic/93146/1 "2026-10-09T03:35:37Z")

</div>

## 软件名称

rfig

## 推荐类型

开发者自荐

## 平台

macOS、Linux

## 一句简介

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

## 核心功能

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

## 安装

```bash
brew tap tamia6/rfig

brew install rfig

rfig setup

```

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

## 演示

![rfig-demo](https://h2cdn.appinn.me/original/3X/f/f/ff41e01b4322313a74b98e5fa20d09aadb4acace.gif)

## 官网

> **[rfig — Rust Terminal Autocomplete for zsh, Bash, and Fish](https://tamia6.github.io/rfig/)**
>
> Open-source, IDE-style command-line autocomplete with dynamic menus and local, directory-scoped history suggestions. Independent and Fig-inspired.

## 源码

> **[GitHub - tamia6/rfig: Command completion menus and history-based...](https://github.com/tamia6/rfig)**
>
> Command completion menus and history-based autosuggestions for zsh, Bash and Fish on macOS and Linux

## 费用

免费、开源。

## 说明

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

---

<div class="post-metadata">

**Author:** ![VictoryRoad](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/victoryroad/32/58964_2.png) [@VictoryRoad](https://meta.appinn.net/u/VictoryRoad)\
**Post date:** [2026 年10 月 9 日 05:03 UTC](https://meta.appinn.net/t/topic/93146/2 "2026-10-09T05:03:08Z")

</div>

> [@tamia6](#):
>
> 核心功能：
> 
> - 输入命令时自动展示补全菜单，不需要按 Tab。

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

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

---

<div class="post-metadata">

**Author:** ![Junkai\_Wu](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/junkai_wu/32/72313_2.png) [@Junkai\_Wu](https://meta.appinn.net/u/Junkai_Wu)\
**Post date:** [2026 年10 月 10 日 02:47 UTC](https://meta.appinn.net/t/topic/93146/3 "2026-10-10T02:47:36Z")

</div>

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

## 现象

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

```plaintext
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`、秒数都在变),折行行为跟着变。
