- CLI
- 开发工具
【免费下载链接】zsh-autosuggestions
Fish-like autosuggestions for zsh
zsh-autosuggestions 是一个模仿 Fish shell 交互体验的 zsh 自动建议插件:在你键入命令时,它会基于历史记录与补全系统,在光标右侧以灰暗颜色即时给出建议(suggestion)。本文以仓库 CHANGELOG.md 为骨架,从 v0.2.17 到当前版本 v0.7.1 的演进记录出发,逐条对应到 src/ 下的源码实现与 spec/ 下的集成测试,帮助你理解该插件的异步抓取机制、三种建议策略、widget 包裹体系以及全部配置项的真实含义。读完本文,你将不仅知道「怎么配」,更能看懂「为什么这么实现」,并能安全地将这些配置迁移到自己的.zshrc中。
当前版本:v0.7.1(见 VERSION)。需求环境:Zsh v4.3.11 或更高版本(见 README.md)。
一、版本脉络总览:一条从「实验特性」到「默认行为」的演进主线
CHANGELOG 完整记录了从 v0.2.17 到 v0.7.1 共十余个版本的变更。纵观全局,可以归纳出四条贯穿始终的演进主线:
- 异步化:v0.4.0 引入实验性异步建议 → v0.5.2 将异步实现从
zpty重构为进程替换(process substitution)→ v0.7.0 起在 zsh 5.0.8+ 上默认启用。 - 策略化:v0.3.0 提出「建议策略」概念并新增
match_prev_cmd→ v0.5.0 将默认策略由「default」更名为更名副其实的history,并支持以数组形式配置多策略回退 → v0.6.0 加入基于补全系统的completion策略。 - 可配置化:先后新增最大缓冲区限制(v0.3.3)、widget 忽略列表(v0.3.3)、手动重绑开关(v0.5.2)、历史/补全忽略模式(v0.6.4)等配置项。
- 工程化:v0.4.0 引入 RSpec + tmux 集成测试与 CI,v0.7.1 将 CI 从 Circle CI 切换到 GitHub Actions。
后文将按主题深入每一条演进,并在每个主题末尾给出「源码印证」小节,指出对应的实现文件。
二、异步建议机制:从实验特性到默认开启
2.1 演进时间线
异步抓取建议是 CHANGELOG 中最高频的主题之一,其演进脉络清晰可见:
- v0.4.0:「Experimental support for asynchronous suggestions (#170)」——异步模式首次作为实验特性落地,同时集成测试与 CI 上线。
- v0.4.3:「Fix issue creating new pty for async mode when previous pty is not properly cleaned up (#249)」——修复上一次 pty 未正确清理导致新建 pty 失败的问题,说明当时异步实现基于
zpty。 - v0.5.2:「Refactor async mode to use process substitution instead of zpty (#417)」——这是异步架构的关键转折点:用进程替换取代
zpty实现异步,并修复SH_WORD_SPLIT开启时的异步建议问题。 - v0.7.0:「Enable asynchronous mode by default (#498)」——异步模式转正为默认行为。
- v0.7.1:「Always reset async file descriptor after consuming it (#630)」「Always use builtin
exec(#628)」——对异步实现做细节加固。
2.2 源码印证:异步请求的完整链路
当前异步实现位于 src/async.zsh,核心逻辑在_zsh_autosuggest_async_request()中:
- 请求发起时先
zmodload zsh/system(为读取$sysparams),并把异步请求的 fd 与子进程 PID 记入全局变量_ZSH_AUTOSUGGEST_ASYNC_FD、_ZSH_AUTOSUGGEST_CHILD_PID; - 若已有未完成的请求,会先关闭 fd、移除
zle -F处理器,并按MONITOR选项是否开启决定对「进程组」还是「单个子进程」发送kill -TERM(见 src/async.zsh)——这正是 v0.7.1「Always reset async file descriptor after consuming it」所加固的部分; - 随后通过
builtin exec {fd}< <(...)以进程替换方式 fork 子进程,子进程调用_zsh_autosuggest_fetch_suggestion抓取建议并通过管道回传(见 src/async.zsh); - 父进程用
zle -F注册 fd 可读时的响应处理函数_zsh_autosuggest_async_response(),数据就绪后读取建议并调用zle autosuggest-suggest,最后关闭 fd 并清理状态(见 src/async.zsh)。
子进程与管道由 src/fetch.zsh 中_zsh_autosuggest_fetch_suggestion()统一负责:它按ZSH_AUTOSUGGEST_STRATEGY数组依次尝试各策略,并从首个返回建议的策略处停止(见 src/fetch.zsh)。
2.3 默认开启的版本门槛与测试印证
异步默认开启的版本门槛写死在 src/start.zsh:
autoload -Uz add-zsh-hook is-at-least if is-at-least 5.0.8; then typeset -g ZSH_AUTOSUGGEST_USE_ASYNC= fi即:zsh ≥ 5.0.8 时异步默认启用;更旧的版本保持同步模式,因为旧版本存在「异步抓取建议后立即按 Ctrl+C 无法重置提示符」的已知 bug(CHANGELOG v0.4.3 与 v0.5.0 中也有相关痕迹)。这一行为在 spec/async_spec.rb 中有直接验证,其中还专门有一组用例测试「pressing ^C after fetching a suggestion」:
describe 'pressing ^C after fetching a suggestion' do before do skip 'Workaround does not work below v5.0.8' if session.zsh_version < Gem::Version.new('5.0.8') end ... end注意 spec/async_spec.rb 中的「Workaround」一词对应 src/async.zsh 中那段注释:is-at-least 5.8 || command true强制 fork 以规避旧版 Ctrl+C 失效的怪癖。
三、建议策略体系:history、completion 与 match_prev_cmd
3.1 策略概念的诞生与改名
- v0.3.0:「Adds concept of suggestion 'strategies' for different ways of fetching suggestions」「Adds 'match_prev_cmd' strategy (PR #131)」——策略机制正式成型。
- v0.5.0:「Rename 'default' suggestion strategy to 'history' to name it based on what it actually does」——默认策略改名为
history,让配置语义更准确。
3.2 三种策略的实现细节
三个策略分别位于 src/strategies/history.zsh、src/strategies/completion.zsh、src/strategies/match_prev_cmd.zsh:
history(历史策略):返回与当前缓冲区前缀匹配的最近一条历史命令。实现上先对前缀转义 glob 元字符(使用(#m)标志,见 src/strategies/history.zsh),再拼接成$prefix*模式,用$history[(r)pattern]的(r)下标标志做值匹配(见 src/strategies/history.zsh)。若设置了ZSH_AUTOSUGGEST_HISTORY_IGNORE,模式会扩展为($pattern)~($ZSH_AUTOSUGGEST_HISTORY_IGNORE)形式剔除命中忽略模式的历史条目。
completion(补全策略):基于 zsh 补全系统生成建议(依赖zpty模块,zsh 4.0.1 起内置)。实现较为复杂(见 src/strategies/completion.zsh):
- 定义
autosuggest-capture-completionwidget,在补全捕获阶段强制compstate[insert]=1(总是插入第一个补全)并取消列表展示(见 src/strategies/completion.zsh); - 通过
zpty在伪终端中执行补全捕获(同步路径zle autosuggest-capture-completion,异步路径则vared 1配合_complete包装,见 src/strategies/completion.zsh); - 补全结果以
\0分隔输出,父进程用zpty -r读取并用${${(@0)line}[2]}提取两条 null 字节之间的内容作为建议(见 src/strategies/completion.zsh)。 - v0.6.4 新增的
ZSH_AUTOSUGGEST_COMPLETION_IGNORE在这里生效:[[ "$1" == $~ZSH_AUTOSUGGEST_COMPLETION_IGNORE ]]时直接放弃补全建议(见 src/strategies/completion.zsh)。
match_prev_cmd(匹配上一条命令策略):与history类似,但要求「建议条目的上一条历史命令」与「最近执行的命令」一致(见 src/strategies/match_prev_cmd.zsh)。其实现会先收集所有匹配前缀的历史事件编号,再遍历前 200 条(${(@)history_match_keys[1,200]}),找到history[$key-1] == prev_cmd的那条作为建议(见 src/strategies/match_prev_cmd.zsh)。该策略同样受ZSH_AUTOSUGGEST_HISTORY_IGNORE约束,但依赖历史顺序,因此不适用于HIST_IGNORE_ALL_DUPS、HIST_EXPIRE_DUPS_FIRST等打乱历史顺序的 zsh 选项(源码注释与 README 均有明确说明)。
3.3 多策略回退配置
v0.5.0 起支持以数组形式配置多策略回退:ZSH_AUTOSUGGEST_STRATEGY是数组变量(默认值(history),定义于 src/config.zsh),各策略依次尝试、命中即停。例如:
ZSH_AUTOSUGGEST_STRATEGY=(history completion)含义:优先从历史命中;历史无匹配时再交给补全引擎。_zsh_autosuggest_fetch_suggestion会校验每条建议确实以当前缓冲区前缀开头,不匹配则丢弃继续尝试下一个策略(见 src/fetch.zsh)。
四、Widget 包裹机制:插件如何「劫持」你的按键
4.1 核心原理
该插件通过包裹(wrap)zle widget 实现行为注入:插件把forward-char、end-of-line等 widget 替换为自动建议版本,并在内部保留对原始 widget 的引用。绑定逻辑在 src/bind.zsh 中:
_zsh_autosuggest_bind_widget()根据 widget 类型(用户自定义user:*、内置builtin、补全completion:*、已绑定user:_zsh_autosuggest_(bound|orig)_*)分别保存原 widget,并以ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX(默认autosuggest-orig-,见 src/config.zsh)为前缀生成原始副本(见 src/bind.zsh);- 调用原 widget 统一走
_zsh_autosuggest_invoke_original_widget(),显式传入原 widget 名称,避免依赖不可靠的$WIDGET变量——这是 v0.3.2「Escapes widget names within evals to fix problems with irregular widget names (#152)」与 v0.5.1「Respect user's set options when running original widget (#402)」等修复的基础; - widget 的归类由五个数组决定,定义于 src/config.zsh,绑定入口
_zsh_autosuggest_bind_widgets()遍历zle -la列出的所有 widget,按「清空 / 接受 / 执行 / 部分接受 / 修改」五类分别绑定(见 src/bind.zsh)。
4.2 五个 widget 归类数组(源码级默认值)
下表完整列出 src/config.zsh 中的默认值,你可以通过覆盖这些变量来定制行为:
| 变量 | 默认值 | 行为 |
|---|---|---|
ZSH_AUTOSUGGEST_CLEAR_WIDGETS | history-search-forward、history-search-backward、history-beginning-search-*、history-substring-search-up/down、up-line-or-beginning-search、down-line-or-beginning-search、up-line-or-history、down-line-or-history、accept-line、copy-earlier-word | 调用时清空当前建议 |
ZSH_AUTOSUGGEST_ACCEPT_WIDGETS | forward-char、end-of-line、vi-forward-char、vi-end-of-line、vi-add-eol | 调用时接受整条建议 |
ZSH_AUTOSUGGEST_EXECUTE_WIDGETS | 空数组 | 调用时接受并执行建议 |
ZSH_AUTOSUGGEST_PARTIAL_ACCEPT_WIDGETS | forward-word、emacs-forward-word、vi-forward-word、vi-forward-word-end、vi-forward-blank-word、vi-forward-blank-word-end、vi-find-next-char、vi-find-next-char-skip | 调用时按光标移动位置部分接受建议 |
ZSH_AUTOSUGGEST_IGNORE_WIDGETS | orig-\*、beep、run-help、set-local-history、which-command、yank、yank-pop、zle-\* | 调用时不触发任何自动建议行为 |
CHANGELOG 中多处修复与这些数组直接相关,例如:
- v0.4.1「Add
emacs-forward-wordto default list of partial accept widgets (#246)」——对应 src/config.zsh 中的emacs-forward-word; - v0.3.2「Add
vi-add-eolto list of accept widgets (#143)」——对应 src/config.zsh; - v0.4.3「Don't fetch suggestions after [up,down]-line-or-beginning-search (#227, #241)」——对应清空列表中的
up-line-or-beginning-search/down-line-or-beginning-search; - v0.6.0「Don't fetch suggestions after copy-earlier-word (#439)」——对应清空列表中的
copy-earlier-word; - v0.7.1「Add
history-beginning-search-*-endwidgets to clear widget list (#619)」——对应 src/config.zsh 中的history-beginning-search-forward-end/history-beginning-search-backward-end。
4.3 包裹机制相关的版本修复
CHANGELOG 中还有一组围绕「包裹谁、不包裹谁」的演进,理解了才不容易踩坑:
- v0.4.0:「Avoid wrapping any
zle-*widgets (#206)」——插件不再包裹所有zle-*系统 widget,避免影响行编辑器内部机制。 - v0.6.0:「Allow users to unignore zle-* widgets (e.g. zle-line-init) (#432)」——默认忽略列表虽含
zle-\*(见 src/config.zsh),但用户可自行从ZSH_AUTOSUGGEST_IGNORE_WIDGETS中移除某项来解除忽略。 - v0.7.0:「No longer wrap user widgets starting with
autosuggest-prefix (#496)」——避免与插件自身提供autosuggest-accept、autosuggest-execute等 widget 产生循环包裹;src/bind.zsh 的ignore_widgets数组中即包含由_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS生成的autosuggest-*前缀(内置动作清单定义于 src/widgets.zsh)。 - v0.7.0:「Fix a bug wrapping widgets that modify the buffer (#541)」——修正对修改缓冲区类 widget 的包裹逻辑,对应 src/widgets.zsh 中
_zsh_autosuggest_modify()对PENDING/KEYS_QUEUED_COUNT的检查以及对「手动正在键入建议」场景的优化分支。 - v0.5.0:「Support widgets starting with dashes (ex:
-a-widget) (#337)」——解决以短横线开头的特殊 widget 名在 eval 中的转义问题。
4.4 插件自带 widget 与键位绑定
vsrc/widgets.zsh 定义了八个内置动作(clear、fetch、suggest、accept、execute、enable、disable、toggle),并以zle -N autosuggest-<action>注册为可绑定 widget。用户可用bindkey自由绑定,例如:
bindkey '^ ' autosuggest-accept常用内置 widget:autosuggest-accept(接受建议)、autosuggest-execute(接受并执行)、autosuggest-clear(清空)、autosuggest-fetch(强制抓取,禁用状态下也可用)、autosuggest-disable/autosuggest-enable/autosuggest-toggle(开关建议)。对应实现见 src/widgets.zsh:disable置位_ZSH_AUTOSUGGEST_DISABLED并清空;enable取消置位并在缓冲区非空时重新抓取;toggle依据状态二选一。
五、配置项演进与完整配置参考
5.1 各配置项引入版本与默认值
CHANGELOG 记录了每个配置项的「出生」版本,以下按引入先后排列:
| 配置变量 | 引入版本 | 默认值 / 用法 | 说明 |
|---|---|---|---|
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE | v0.0.x 时期(v0.4.0 移除废弃项) | fg=8 | 建议高亮样式,格式遵循region_highlight |
ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE | v0.3.3 (#178) | 默认 unset | 缓冲区超过该长度时不抓取建议;v0.6.0 起允许设为空字符串 |
ZSH_AUTOSUGGEST_IGNORE_WIDGETS | v0.3.3 (#184) | 见上文 | 忽略的 widget 列表(支持 glob) |
ZSH_AUTOSUGGEST_STRATEGY | v0.3.0(v0.5.0 起支持数组回退) | (history) | 建议策略数组,依次尝试 |
ZSH_AUTOSUGGEST_USE_ASYNC | v0.4.0(v0.7.0 起默认启用) | 由 src/start.zsh 按 zsh 版本设置 | 异步开关 |
ZSH_AUTOSUGGEST_MANUAL_REBIND | v0.5.2 (#418) | unset(默认自动重绑) | 置位后关闭 precmd 自动重绑,需手动执行_zsh_autosuggest_bind_widgets |
ZSH_AUTOSUGGEST_HISTORY_IGNORE | v0.6.4 (#456) | unset | glob 模式,命中则不对该历史条目提供建议(仅影响 history 与 match_prev_cmd 策略) |
ZSH_AUTOSUGGEST_COMPLETION_IGNORE | v0.6.4 (#487) | unset | glob 模式,缓冲区命中时跳过补全建议(仅影响 completion 策略) |
ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX | 早期版本 | autosuggest-orig- | 原始 widget 副本的命名前缀 |
补充:v0.5.0「Don't overwrite config with default values (#335)」意味着默认值只在变量未定义时才写入(src/config.zsh 中所有配置均以
(( ! ${+VAR} ))守卫,不会覆盖用户已设的值);v0.6.0「Allow settingZSH_AUTOSUGGEST_BUFFER_MAX_SIZEto an empty string (#422)」则对应 src/widgets.zsh 中[[ -z "$ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE" ]] || (( $#BUFFER <= ... ))的空串兼容判断。
5.2 实战:一份可直接复制的完整配置
结合 src/config.zsh 的默认值与 README 的说明,以下是一份覆盖主要特性的.zshrc配置示例:
# 1) 建议样式:加粗、下划线、粉字 + 青色背景(风格可组合,参考 zsh 手册 Character Highlighting) ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#ff00ff,bg=cyan,bold,underline" # 2) 策略:先历史、再补全 ZSH_AUTOSUGGEST_STRATEGY=(history completion) # 3) 超过 20 字符的缓冲区不再抓取建议(粘贴大段文本时避免误触发) ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=20 # 4) 永远不要建议 cd 命令;也不要建议 50 字符以上的长命令(仅影响 history / match_prev_cmd) ZSH_AUTOSUGGEST_HISTORY_IGNORE="cd *" # 5) 缓冲区以 "git " 开头时跳过补全建议(仅影响 completion) ZSH_AUTOSUGGEST_COMPLETION_IGNORE="git *" # 6) 性能优化:关闭每次 precmd 的自动重绑,由自己手动重绑 ZSH_AUTOSUGGEST_MANUAL_REBIND=1 # 7) 绑定 Ctrl+Space 接受建议 bindkey '^ ' autosuggest-accept其中第 6 项需要特别注意:开启ZSH_AUTOSUGGEST_MANUAL_REBIND后,自动重绑被关闭(src/start.zsh 会移除 precmd 钩子),若日后修改了任一 widget 列表、或安装了会包裹 autosuggest widget 的其他插件(如 zsh-syntax-highlighting),必须手动执行_zsh_autosuggest_bind_widgets重新绑定。关闭自动重绑的原因在于 src/start.zsh 的注释:每次 precmd 重绑的初衷是保证包裹顺序正确(否则高亮会被其他插件破坏),但代价是性能损耗。
5.3 高亮实现的源码细节
建议的高亮并非 zle 的region_highlight直接设置,而是通过 src/highlight.zsh 中的_zsh_autosuggest_highlight_reset()与_zsh_autosuggest_highlight_apply()维护:每次动作前移除上一条高亮记录,动作后依据POSTDISPLAY长度追加"$#BUFFER $(( $#BUFFER + $#POSTDISPLAY )) $ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE"到region_highlight(见 src/highlight.zsh)。这解释了为何ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE必须遵循region_highlight的格式语法。
六、性能与兼容性修复:那些「看不见」的工程细节
CHANGELOG 中有大量条目属于性能优化与边缘兼容性修复,它们共同保证了插件在多样化的 zsh 环境中的稳定性:
6.1 性能相关
- v0.3.3:「Switch from
$historyarray tofcbuiltin for better performance with large HISTFILEs (#164)」——历史查找改用fc内建命令,避免超大历史文件下$history关联数组的性能问题。 - v0.5.1:「Speed up widget rebinding (#413)」「Clean up global variable creations (#403)」——重绑提速并收敛全局变量创建(配合 v0.4.1 引入的
typeset -g,规避WARN_CREATE_GLOBAL/warnnestedvar警告,见 src/config.zsh 中全量typeset -g用法)。 - v0.5.2:「Allow disabling automatic widget re-binding for better performance (#418)」——即前文所述
ZSH_AUTOSUGGEST_MANUAL_REBIND。 - v0.4.0:「Optimize case where manually typing in suggestion」——对应 src/widgets.zsh:若当前缓冲区正是原缓冲区叠加建议前缀(即用户正在顺着建议手动输入),则直接剪裁
POSTDISPLAY而非重新抓取。
6.2 跨版本与跨 shell 选项兼容
- v0.4.2:「Fix bug in zsh versions older than 5.0.8 (#296)」「Officially support back to zsh v4.3.11」——正式宣布支持 zsh v4.3.11 及以上,与 README 的 Requirements 一致。
- v0.6.2:「Degrade gracefully when user doesn't have
zsh/systemmodule installed (#447)」——src/async.zsh 中zmodload zsh/system 2>/dev/null的容错,缺失时仅失去 PID 读取能力而不崩溃。 - v0.5.2:「Fix async suggestions when
SH_WORD_SPLITis set」——异步子进程中的分词选项隔离。 - v0.5.0:「Reset opts in some functions affected by
GLOB_SUBST(#334)」——src/strategies/history.zsh 等函数以emulate -L zsh+setopt EXTENDED_GLOB隔离选项影响;spec/integrations/glob_subst_spec.rb 即针对该场景的集成测试。 - v0.4.1:「Switch to
[[and((conditionals instead of[(#257)」——全库改用 zsh 原生条件语法(可从 src/widgets.zsh 中大量[[ ... ]]、(( ... ))看到)。 - v0.6.2:「Fixed bug deleting the last character in the buffer in vi mode (#450)」「v0.6.3:Fixed bug moving cursor to end of buffer after accepting suggestion (#453)」「v0.4.3:Fix partial-accept in vi mode (#188)」「Fix suggestion disappearing on fast movement after switching to
vicmdmode (#290)」「Fix issue rotating through kill ring withyank-pop(#301)」——这一组全部围绕 vi 模式与 kill ring 的细节修复,实现上对应 src/widgets.zsh 的_zsh_autosuggest_accept()(vicmd 下光标最多移动到$#BUFFER - 1)与_zsh_autosuggest_partial_accept()(vi/emacs 光标位置归一化),并有 spec/integrations/vi_mode_spec.rb 覆盖。
6.3 其他边界修复
- v0.6.1:「Fixed bug occurring when
_completehad been aliased (#443)」——对应 src/strategies/completion.zsh 中autoload +X _complete再包装_complete的处理。 - v0.4.0:「Handle history entries that begin with dashes」「Gracefully handle being sourced multiple times (#126)」——分别处理
-l这类特殊历史条目与重复 source 的幂等性。 - v0.3.2:「Return code from original widget is now correctly passed through (#135)」——src/widgets.zsh 中
retval的层层回传。 - v0.3.2:「Plugin now clears suggestion while within a completion menu (#149)」——补全菜单展开时清空建议,避免冲突。
- v0.3.2:「.plugin file no longer relies on symbolic link support, fixing issues on Windows (#156)」——修复 Windows 下符号链接不可用导致的加载失败。
- v0.4.3:「Avoid bell when accepting suggestions with
autosuggest-accept(#228)」「v0.6.4:Fixvi-forward-chartriggering a bell when using it to accept a suggestion (#488)」——接受建议时避免终端响铃,后者的修复逻辑见 src/widgets.zsh 中先移动光标前调用原 widget、再手动定位光标的顺序。
七、测试与 CI 工程化演进
7.1 测试基础设施
- v0.4.0:「High-level integration tests using RSpec and tmux」「Add continuous integration with Circle CI」——引入 Ruby + RSpec + tmux 的高层集成测试:通过 tmux 驱动伪终端、发送模拟按键并对终端内容做断言(README 的 Development 一节有完整说明)。
- v0.3.1:「Split out a separate test file for each widget」——按 widget 拆分独立测试文件。
- v0.3.2:「Test runner now supports running specific tests and choosing zsh binary」——
TESTS=spec/some_spec.rb make test指定用例、TEST_ZSH_BIN指定 zsh 二进制。 - v0.3.0:「Uses git submodules for testing dependencies」——用 git submodule 管理测试依赖。
- v0.5.0:「Skip async tests in zsh versions less than 5.0.8 because of reliability issues」——与 spec/async_spec.rb 中的 skip 逻辑一致。
测试目录结构为 spec/integrations/(auto_cd、bracketed_paste_magic、client_zpty、glob_subst、rebound_bracket、vi_mode、wrapped_widget、zle_input_stack 等场景)、spec/options/(buffer_max_size、highlight_style、original_widget_prefix、strategy、widget_lists)、spec/strategies/ 与 spec/widgets/。
7.2 CI 迁移
- v0.4.0:接入 Circle CI;
- v0.4.3:「We are now running CI against new 5.5.1 version」——持续跟进新 zsh 版本;
- v0.7.1:「Switch CI from Circle CI to GitHub Actions」——CI 平台迁移到 GitHub Actions,配合仓库 Dockerfile 与 ZSH_VERSIONS 实现多版本 zsh 测试矩阵。
八、版本速查表
以下为 CHANGELOG 全部版本的浓缩速查,便于定位历史变更与升级要点:
| 版本 | 关键变更 |
|---|---|
| v0.7.1 | 清空建议改用 POSTDISPLAY 重置;异步 fd 消费后强制重置;统一使用builtin exec;clear 列表新增history-beginning-search-*-end;CI 迁移至 GitHub Actions |
| v0.7.0 | 异步默认启用;不再包裹autosuggest-前缀用户 widget;修复修改 buffer 类 widget 的包裹 bug |
| v0.6.4 | 修复 vi-forward-char 接受建议时响铃;新增ZSH_AUTOSUGGEST_COMPLETION_IGNORE、ZSH_AUTOSUGGEST_HISTORY_IGNORE |
| v0.6.3 | 修复接受建议后光标未到缓冲区末尾 |
| v0.6.2 | 修复 vi 模式删除缓冲区最后一个字符;zsh/system模块缺失时优雅降级 |
| v0.6.1 | 修复_complete被 alias 时的 bug |
| v0.6.0 | 新增 completion 策略;BUFFER_MAX_SIZE允许空字符串;copy-earlier-word 后不再抓取;允许解除对 zle-* 的忽略 |
| v0.5.2 | 新增ZSH_AUTOSUGGEST_MANUAL_REBIND;修复 SH_WORD_SPLIT 下异步建议;异步改为进程替换实现 |
| v0.5.1 | 加速 widget 重绑;清理全局变量;调用原 widget 时尊重用户 setopt |
| v0.5.0 | 不覆盖用户配置;支持策略数组回退;默认策略改名 history;修复 GLOB_SUBST 影响;支持短横线开头 widget;跳过 <5.0.8 的异步测试 |
| v0.4.3 | 接受建议不响铃;up/down-line-or-beginning-search 后不抓取;CI 覆盖 zsh 5.5.1;修复 vi 部分接受、vicmd 快速移动、yank-pop、pty 清理 |
| v0.4.2 | 修复 <5.0.8 的 bug;正式支持 zsh v4.3.11 |
| v0.4.1 | 改用[[/((条件;typeset -g消除警告;YAML 格式;特殊字符转义;默认部分接受列表加入 emacs-forward-word |
| v0.4.0 | RSpec+tmux 集成测试与 Circle CI;实验性异步;多行建议修复;手动键入优化;不包裹 zle-*;移除废弃选项;处理 dash 开头历史;重复 source 幂等;新增 enable/disable/toggle |
| v0.3.3 | 改用 fc 内建;tilde 处理;新增BUFFER_MAX_SIZE与IGNORE_WIDGETS;仅当修改生效才抓取新建议 |
| v0.3.2 | 测试运行器增强;原 widget 返回值透传;部分接受列表加入 vi-add-eol;widget 名转义;补全菜单中清建议;Windows 符号链接修复 |
| v0.3.1 | 修复 vi-next-char 接受建议;WARN_CREATE_GLOBAL 警告;按 widget 拆分测试文件 |
| v0.3.0 | 新增 autosuggest-execute;引入策略概念;新增 match_prev_cmd;测试依赖改用 submodule;zsh 5.0.x 与 sh_word_split 修复 |
| v0.2.17 | 变更日志起始版本 |
结语
透过 CHANGELOG 的版本刻度,可以清晰看到 zsh-autosuggestions 的工程哲学:先以实验特性小步验证(异步、completion 策略),再逐步固化为默认行为;每一次配置项引入都配套对应的源码实现与集成测试。若你想深入源码继续阅读,推荐按以下路径跟进:配置默认值见 src/config.zsh,异步链路见 src/async.zsh 与 src/start.zsh,策略实现见 src/strategies/,widget 包裹与动作见 src/bind.zsh 与 src/widgets.zsh,集成测试示例见 spec/async_spec.rb 与 spec/integrations/vi_mode_spec.rb。将本文的配置示例写入~/.zshrc并重新加载(exec zsh),即可立即体验完整能力。
- CLI
- 开发工具
【免费下载链接】zsh-autosuggestions
Fish-like autosuggestions for zsh
相关推荐
tsParticles Slim 包版本演进与插件装配机制:从 CHANGELOG 看 @tsparticles/slim 的架构实践
tsParticles Slim 包版本演进与插件装配机制:从 CHANGELOG 看 @tsparticles/slim 的架构实践 本文以 bundles/
前端Aurelia 1 framework 版本演进全解读:从 CHANGELOG 看核心架构、配置体系与启动流程
Aurelia 1 framework 版本演进全解读:从 CHANGELOG 看核心架构、配置体系与启动流程 本指南以本仓库 doc/CHANGELOG.md
前端Web框架CommandoVM 版本演进与架构重构解读:从 Changelog 看安装器、配置体系与安装配置实践
CommandoVM 版本演进与架构重构解读:从 Changelog 看安装器、配置体系与安装配置实践 CommandoVM(Complete Mandiant
网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考