Clink 版本演进全解:从 v0.1 到 v1.4.28 的功能演进、Lua API 与实战配置指南
Clink 版本演进全解:从 v0.1 到 v1.4.28 的功能演进、Lua API 与实战配置指南
本篇技术指南以 Clink 官方版本变更记录 CHANGES.older.md 为主线,系统梳理 Clink(在 cmd.exe 中提供类 Bash 强大命令行编辑能力的工具)从 v0.1 初始发布到 v1.4.28 期间的核心功能演进、新增设置、Lua API、按键绑定与关键缺陷修复,并结合当前仓库源码(如 clink/lua/src/console_api.cpp、clink/lua/src/os_api.cpp、clink/lua/src/path_api.cpp、clink/lua/scripts/core.lua)佐证实现细节。读完本文,你将能:理解 Clink 各版本引入的关键能力与设计取舍;掌握 clink set、Lua 脚本事件、匹配生成器、argmatcher、终端仿真等核心机制的配置与使用;并能借助 clink-diagnostics(Ctrl-x Ctrl-z)等诊断工具排查常见显示与性能问题。
一、文档定位与阅读方法
CHANGES.older.md 是 Clink 的完整历史版本记录,按版本号倒序排列,涵盖 chrisant996/clink 分支的 v1.4.28 至 v1.2,以及更早的 v1.1.x 系列与 mridgers/clink 原始仓库的 v1.0.0a1、v0.4.9 及更早版本。每个版本条目按 新增功能(Added)、设置变更(Changed)、缺陷修复(Fixed)、潜在破坏性变更(Potential/Breaking Change) 分类记录。它与当前仓库根目录的 CHANGES 文件首尾衔接(后者记录 v1.9.35 起的更新),两者共同构成 Clink 完整演进史。
阅读建议:若你想了解某个具体功能(如自动建议、弹窗列表、终端仿真、历史扩展)是哪一版本引入的,可按版本号顺藤摸瓜;若想确认某个设置或 Lua API 的当前用法,建议配合 clink.md 主文档与 api_v049.md 一起阅读,并以最新版本行为为准。
二、v1.4.x:终端体验、提示符与显示精度的大版本
v1.4.x 系列集中在终端字符宽度计算、提示符过滤、历史扩展预览、路径缩写等"显示精度"问题上做了大量打磨,同时引入了若干重要 Lua API。
2.1 光标与屏幕信息(v1.4.28)
v1.4.28 新增了 console.getcursorpos() 用于获取光标位置,并让 os.getscreeninfo() 一并返回光标位置。其源码实现位于 console_api.cpp:函数返回两个整数 x, y(列与行,均从 1 开始计数),行号取值范围为 1 到 console.getnumlines(),列号取值范围为 1 到 console.getwidth()。底层通过 GetConsoleScreenBufferInfo 读取 dwCursorPosition,或在测试环境/仿真终端中从 g_printer->get_cursor_pos() 获取。典型用法:
local x, y = console.getcursorpos()
print("当前光标位于第 " .. y .. " 行,第 " .. x .. " 列")
2.2 彩色 Emoji 与字符宽度测量(v1.4.7 / v1.4.8 / v1.4.28)
- v1.4.7:Clink 支持 ARM64,并能识别 WezTerm 终端宿主;同时按 Unicode v15.0 标准支持 Windows Terminal 与 WezTerm 中的彩色 Emoji。新增设置
terminal.color_emoji,控制 Clink 何时假定终端支持彩色 Emoji。原因在于:彩色 Emoji 以双倍宽度字符渲染,会干扰光标定位计算,因此 Clink 必须知道终端是否支持。 - v1.4.8:
terminal.color_emoji的auto模式被扩展,可以更广泛地支持彩色 Emoji 的精确宽度测量(无论终端程序是否真的能绘制彩色 Emoji)。其底层逻辑可在 wcwidth.cpp 与 wcwidth.h 中的g_color_emoji全局标志中看到。 - v1.4.28:针对 Windows Terminal 中某些完全合格的颜色 Emoji 变体(如
"✔️"与"✔",前者是 U+2714 U+FE0F,绘制为双宽度彩色 Emoji;后者是 U+2714,按当前字体绘制为单宽度字符)调整了字符宽度测量。注意:实际绘制由 Windows Terminal 完成,Clink 只是尽可能预测 Windows Terminal 的绘制结果。
2.3 终端仿真与 ANSI 宿主检测(v1.4.26)
- 新增对 Windows Terminal v1.18 及以上版本的内置 shell 集成支持。注意:启用瞬时提示符(transient prompt)时,Windows Terminal 会对命令行文本产生困惑。
clink.getansihost()改为返回两个字符串:第一个是当前使用的模式,第二个是 Clink 检测到的模式(当terminal.emulation设置为auto时使用)。- 当
terminal.emulate设置为auto且系统存在 ANSICON 时,Clink 的输出不再能被 ANSICON 拦截,改为绕过 ANSICON 使用自己的终端仿真。同时修复了 ANSI32.DLL / ANSI64.DLL(ANSICON)中无效 RVA 导致的崩溃(issue #461)。
2.4 提示符前缀/后缀与环境变量(v1.4.24)
新增对 %CLINK_PROMPT_PREFIX%、%CLINK_PROMPT_SUFFIX%、%CLINK_RPROMPT_PREFIX%、%CLINK_RPROMPT_SUFFIX% 的支持,用于为提示符字符串提供前缀/后缀;提示符过滤器也可以定义 :surround() 函数来添加自己的前缀/后缀字符串。这为 shell 集成转义码的正确工作提供了基础(v1.4.25 还修复了 v1.4.24 引入的提示符前缀插入位置问题)。
2.5 路径相关新 API 与缩写路径(v1.4.1 / v1.4.24)
- v1.4.24:新增
path.fnmatch()(行为类似 Linuxfnmatch(3))与os.globmatch()(递归文件模式通配,规则与 git 的.gitignore模式一致)。 path.fnmatch()源码位于 path_api.cpp,签名是path.fnmatch(pattern, string[, flags]),flags 字符串可包含:e(NoEscape,反斜杠按普通字符处理)、p(PathName,路径分隔符只能被/匹配)、.(Period,前导点必须由模式中的点匹配)、l(LeadingDir,匹配到路径分隔符即可)、c(NoCaseFold,区分大小写;默认因 Windows 不区分大小写而忽略大小写)、*(WildStar,**可匹配路径分隔符,隐含p)、s(NoSlashFold,模式中的/只匹配字符串中的/;默认/与\互为匹配)。模式支持?、*、[...]字符类、范围、取反以及[[:alnum:]]等 POSIX 字符类。os.globmatch(pattern<a href="https://link.gitcode.com/i/fbed36c8aced51ac098526fcb4617ec8" target="_blank">, extrainfo[, flags]])的完整实现位于 [core.lua:模式以/结尾时收集目录,否则收集文件;模式中的引号会被剥离;在协程中使用时自动周期性让出(yield)。extrainfo为 true 或 ≥1 时,返回的表格每项包含name、type("file"/"dir",可附加,hidden、,readonly、,link、,orphaned,可直接作为builder:addmatch()的匹配类型);extrainfo为 2 时额外包含size、atime、mtime、ctime。可选flags表支持hidden(默认 true,包含隐藏文件)、system(默认 false,省略系统文件)、period(默认 false)、nocasefold(默认 false,即默认忽略大小写)。返回表采用前序遍历构建(先列出目录内文件,再递归进入子目录)。- v1.4.1:新增
os.abbreviatepath()与os.expandabbreviatedpath();启用新的match.expand_abbrev设置后,调用补全时会展开缩写路径。相关测试见 abbrev.cpp。
2.6 历史扩展预览与显示(v1.3.43 引入、v1.4.16 完善)
- v1.3.43 新增
clink.max_input_rows设置(限制输入行占用的屏幕行数,超出则滚动显示)、color.histexpand设置(配置颜色后,Clink 在输入行中高亮历史扩展,并在光标附近显示即将应用的扩展预览)、history.auto_expand设置(设为 false 时,按 Enter 不再自动执行历史扩展,但仍可通过clink-expand-historyAlt-^ 或clink-expand-lineAlt-Ctrl-E 手动执行)。 - v1.4.16 新增
history.show_preview设置,明确控制是否显示历史扩展预览(此前由是否设置color.histexpand推断)。
2.7 文件枚举的隐藏/系统文件语义修复(v1.4.16,潜在破坏性变更)
v1.4.16 修复了 os.globdirs() 与 os.globfiles() 对隐藏/系统文件的处理(此前从未真正正确工作)。当传入非零的 extrainfo 参数或新的可选 flags 表时,现在默认包含隐藏文件、省略系统文件,且 flags 表可覆盖该默认;向后兼容模式下仍由 files.hidden、files.system 设置与 match-hidden-files 配置变量控制。此变更源于:某些脚本在 files.hidden 为 false 时无法检测 git 仓库。同一版本还修复了 match-hidden-files 配置变量(v1.0.0 引入回归),关闭时现在也会隐藏以 . 开头的文件与目录。
2.8 其他值得关注的 v1.4.x 修复与增强
- v1.4.25:
os.issignaled()现在在onendedit与onfilterinput事件期间可用;瞬时提示符过滤器可通过返回nil, false逐案抑制瞬时提示符。 - v1.4.23:
clink update --check仅检查更新而不安装;clink-select-complete在描述显示于匹配下方时提示 F1 可切换为内联显示描述。 - v1.4.22:
clink-select-complete尊重每条匹配的appendchar;修复completion自动建议策略遇到 argmatcher 中fromhistory参数槽时的后台重复工作。 - v1.4.21:
clink-diagnostics可报告合并的 argmatcher(数值参数 ≥2 时,如 Alt-2 Ctrl-x Ctrl-z);修复clink update与 winget 的更新状态混淆问题。 - v1.4.20:
os.isfile()/os.isdir()处理名称中含<、>、"的情况(MS-DOS 兼容的特殊通配字符);rl.expandtilde()展开独立~时省略尾部反斜杠,避免违反CommandLineToArgvW的\"解析规则。 - v1.4.19:新增
builder:setforcequoting(),强制对非文件名匹配也应用引用规则(取代 v1.4.13 的自动推断,因为不存在安全且向后兼容的自动推断方式)。 - v1.4.18:新增
clink.oninputlinechanged(),注册每当输入行变化时调用的函数(源码见 events.lua)。 - v1.4.17:新增
os.isuseradmin()(判断 CMD 是否以管理员身份运行,源码见 os_api.cpp,底层调用os::is_elevated())与os.getfileversion()(读取 Windows 版本信息资源,返回表格;优先使用与当前用户语言最接近的翻译字符串,见 os_api.cpp)。 - v1.4.15:新增
log.getfile()获取当前日志文件路径;修复多列布局中参数颜色未重置等显示问题。 - v1.4.14:修复自动建议在匹配被标记为 volatile 且输入行在后台生成匹配期间变化时未更新的问题。
- v1.4.12:
clink inject不再清空日志文件,避免 AutoRun 反复清空日志妨碍诊断。 - v1.4.10:
log.info()支持可选level参数以更准确报告调用代码;修复 vi 搜索异常(v1.4.7 引入回归)。 - v1.4.9:重写东亚模糊宽度字符的测量(解决 Cmder 中 lambda 提示符显示问题);
clink-diagnostics自动分析提示符文本中的问题字符并给出建议。 - v1.4.8:新增
rl.needquotes()判断文本在命令行中是否需要引号;completion自动建议策略在输入未加引号时不提供需要引号的建议。 - v1.4.6:
clink inject返回更有信息的退出码:0 成功、2 致命错误、1 非致命错误(如 Clink 已存在);修复%CLINK_PROFILE%未能覆盖--profile的回归(v1.0.0 引入)。 - v1.4.4:修复帮助/补全命令的屏幕宽度(v1.3.43 引入回归);修复
clink-diagnostics报告的架构(v1.3.49 引入回归)。 - v1.4.3:为过时的
clink.quote_split()、clink.split()、clink.get_screen_info()提供向后兼容。 - v1.4.0:新增
clink.getpopuplistcolors()、clink.refilterafterterminalresize();clink.popuplist()的items表可包含字段覆盖列表的高度、宽度、颜色与方向;clink_settings文件格式放宽(允许布尔值后跟尾随空白),但官方明确说明:手动修改clink_settings不受支持,应始终使用clink set查询或修改设置。
三、v1.3.x:补全体验、弹窗交互与诊断体系
v1.3.x 是 Clink 功能密度最高的系列之一,引入了弹窗式补全、匹配描述、自动建议、诊断命令与协程体系等关键能力。
3.1 交互式补全与弹窗列表
- v1.2.19 引入
clink-select-complete:交互式列出可能的补全项。v1.3.3 中 F1 可在"描述显示在底部"与"描述内联显示"之间切换;v1.3.10 修复鼠标点击时除了高亮还能插入点击的匹配;v1.3.31 增加鼠标水平滚轮支持;v1.3.8 中 Ctrl-Home/Ctrl-End 选择第一个/最后一个匹配。 - 弹窗列表命令家族:
clink-popup-completions(补全弹窗)、clink-popup-directories(最近目录弹窗,v1.3.19 起支持 Del 删除条目,v1.3.19 新增directories.dupe_mode设置控制目录历史去重)、clink-popup-history(命令历史弹窗,支持增量搜索)、clink-popup-show-help(可搜索的按键绑定弹窗)。 - v1.2.36 重大变更:所有弹窗列表命令从 GUI 窗口改为控制台文本显示,新增
color.popup、color.popup_desc设置,并保留clink.gui_popups设置可切回 GUI 弹窗(该设置在 v1.3.41 被移除)。 - 匹配描述体系(v1.2.38):argmatcher 可为 flag/参数提供描述字符串与参数信息字符串(如
--line linenum显示时含提示、插入时只插入--line);匹配生成器可用match_builder:addmatch()/addmatches()直接提供display与description;新增color.arginfo、color.description设置;匹配超过 9 个时描述显示在底部单行。 - 列宽拟合(v1.3.3):补全显示按列宽计算以容纳最多列,由
match.fit_columns、match.limit_fitted_columns控制;多列时描述右对齐,并加括号包裹。新增match.substring设置:前缀搜索无结果时改用子串搜索;match.max_rows限制clink-select-complete最多占用的行数;match.preview_rows让clink-select-complete先预览若干行匹配,选区移过预览区后再展开全部(类似 fish shell);color.comment_row设置注释行的颜色("and N more matches" / "rows X to Y of Z" 消息)。v1.3.1 起箭头键在水平与垂直边缘环绕(受menu-complete-wraparound配置变量控制)。
3.2 自动建议(Autosuggest)
- v1.2.47 引入 Fish 式自动建议:通过
clink set autosuggest.enable true开启;autosuggest.strategy设置选择策略;clink.suggester()创建自定义建议生成器。clink set autosuggest.strategy的匹配生成器会列出可用建议生成器(v1.2.49)。 - v1.3.1 新增
autosuggest.async(默认开启):异步生成建议匹配,保证输入响应性。 - v1.3 新增
autosuggest.original_case(默认开启):控制采纳建议时使用建议的原始大小写还是保持输入的大小写。 - 建议操作命令(v1.3.18):新增
clink-insert-suggested-line、clink-insert-suggested-word、clink-insert-suggested-full-word、clink-accept-suggested-line(见 issue #280)。 - 行为细节:v1.3.29 修复完全采纳建议后 Right 等键的行为(不应立即显示新建议,
win-cursor-forward不应追加上一命令的字符);v1.3.2 修复win-cursor-forward在无建议时不再触发生成新建议;v1.3.2 还允许异步匹配生成器完成而非每次击键取消。
3.3 输入行着色与命令字识别
- v1.3.3:新增
color.executable与color.unrecognized设置——设置后,首个词若被识别为可执行文件则着色,若既不是命令、doskey 宏、目录、argmatcher 也不是可执行文件则按未识别着色;查找异步进行以保持输入响应性。 - v1.3.38:新增
clink.recognizecommand(),供输入行着色分类器判断是否将某词着为可执行;与 Clink 内部机制相同,分析为异步。同版本起clink.argmatcher(command)可接受完全限定路径名,使同名程序可拥有不同 argmatcher;argmatcher 查找优先 doskey 别名。 - v1.3.43:修复命令字为别名+目录且带 argmatcher 时的输入行颜色;修复
clink set的部分着色与补全错误。clink-diagnostics可报告提示符过滤器与输入行着色分类器的开销(数值参数时)。 - v1.3.40:避免将目录名误着色为 argmatcher(使用后台线程保持响应);修复
cmd /c&Tab 的补全。 - v1.3.37:新增
clink.parseline()将字符串解析为一个或多个line_state对象;新增os.getdrivetype()获取路径的驱动器类型(跳过网络路径时很有用);新增match_builder:setvolatile()强制匹配仅使用一次(如邮箱匹配生成器可在输入@前列出用户名、之后列出域名)。 - v1.2.36:新增
win-history-list命令(默认绑定 F7),显示历史列表并执行选中条目。
3.4 Argmatcher 高级能力
- 响应式 argmatcher(v1.3.13):argmatcher 可用
:chaincommand()将命令行其余部分视为另一命令(内置cmdargmatcher 即如此,使cmd program之后的补全由program的 argmatcher 解析)。:addarg()表中可包含onarg=your_callback_function,回调与匹配函数额外接收user_data参数(解析开始时为空表;每次 flag/参数链接到另一 argmatcher 时新 argmatcher 得到新的空表)。内置cd/pushdargmatcher 借此影响后续输入行的匹配补全(如pushd \foo & programTab 以\foo为当前目录生成补全)。 - 自适应 argmatcher(v1.3.10):argmatcher 可按需自我扩展,例如从
--help文本解析参数与 flag,或依据当前目录改变可用命令参数。 - fromhistory 参数槽(v1.3.9):
:addarg()表中含fromhistory=true时,通过解析历史文件为该参数槽生成额外匹配。 - nosort 与排序控制(v1.3.8 / v1.3.3):
:addarg()表含nosort=true时匹配不排序;另有argmatcher:addargunsorted()、argmatcher:addflagsunsorted()、match_builder:setnosort()。 - flag 处理(v1.3.12):
argmatcher:setflagsanywhere()与argmatcher:setendofflags()控制 flag 的识别位置;:setendofflags()在 v1.3.51 修复了生成匹配补全时的行为。 - 隐藏 flag(v1.3.3):
argmatcher:hideflags()可隐藏某些 flag(如同义词)。 - 延迟初始化(v1.3.12):
delayinit函数支持第二个参数。 - v1.3.37:
:addarg()表含loopchars="chars"时,这些字符被当作单个参数的定界符,不推进到下一个参数槽。
3.5 历史扩展、展开命令与输入限制
- v1.3.43:新增
clink.max_input_rows、color.histexpand、history.auto_expand(见上文 2.6);移除 4096 字节输入限制的版本是 v1.1.1-alpha。 - v1.2.25 引入的展开/补全命令:
clink-expand-history(历史扩展,Alt-^)、clink-expand-history-and-alias(历史+doskey 别名扩展)、clink-expand-line(历史+别名+环境变量扩展,Ctrl-Alt-E);glob-complete-word(通配补全,Alt-G)、glob-expand-word(插入全部通配补全,Ctrl-x *)、glob-list-expansions(列出通配补全,Ctrl-x g);- 为增强与 bash 的 .inputrc 可移植性,新增别名
alias-expand-line、history-expand-line、history-and-alias-expand-line、insert-last-argument、shell-expand-line。
- v1.2.46:新增
magic-space命令(对光标前文本做历史扩展后插入空格,与 bash 略不同——bash 对整行做扩展,可能把空格插到错误位置)。 - v1.2.42:
history.max_lines恢复支持 0 表示不限(历史文件越大加载越慢,可用clink history compact <n>精简到 N 条);修复独立~补全(现在插入 %USERPROFILE% 目录);cd -支持cd /d -,且存在cd的 doskey 宏时也支持。 - v1.2.3:新增
history.sticky_search设置(复用历史行时不把复用行追加到历史末尾,并把搜索位置留在复用行上,便于 Up 数次后 Enter、Down、Enter 的连续回放);clink history compact --unique去除重复条目;恢复 Ctrl-Alt-U 键绑定(上移一级目录)。 - v1.1.1-alpha:
clink history输出到控制台时转 UTF16、重定向时写 UTF8;新增add-history、remove-history命令(类似 4Dos/4NT/TakeCommand)。
3.6 诊断、协程与事件体系
- 诊断命令:
clink-diagnostics(Ctrl-x Ctrl-z)随版本持续增强——v1.3.1 可列出提示符过滤器、生成器、分类器、建议器(数值参数时);v1.3.6 数值参数时始终包含 Lua 匹配生成器等(即使lua.debug关闭);v1.3.9 列表项含onbeginedit等事件;v1.3.43 报告提示符过滤器与分类器开销;v1.4.8 自动分析提示符文本问题字符;v1.4.17 报告 Lua 事件回调开销;v1.4.21 报告 argmatcher 合并。 - 协程体系:v1.2.10 引入异步提示符过滤(
clink.promptcoroutine()、io.popenyield()、prompt.async设置);v1.3.1 起os.globdirs()/os.globfiles()在协程内周期性 yield,io.popen()在协程内读模式自动 yield,io.popenyield()在协程外回退到io.popen();v1.3.2 起os.execute()在协程中自动 yield 至完成;v1.3.5 新增clink.runcoroutineuntilcomplete()允许协程跨越编辑行边界继续运行;v1.3.14 新增os.issignaled()让 Lua 脚本协作式自我中断(源码见 os_api.cpp,返回是否收到 Ctrl-Break);v1.3.22 起lua.debug开启时未捕获的协程错误会被报告并记入日志;v1.3.43 协程错误时向日志写入 Lua traceback。 - 事件注册:
clink.onbeginedit(v1.1.11)、clink.onendedit(v1.1.20;v1.2.16 拆分为clink.onendedit与clink.onfilterinput,后者可在编辑结束后替换输入文本)、clink.oninject(v1.1.21)、clink.onfiltermatches(v1.1.41)、clink.oncommand(v1.3.12)、clink.onprovideline(v1.3.18,返回字符串时直接作为命令行执行)、clink.onaftercommand(v1.2.50,每次按键绑定命令执行后调用)、clink.oninputlinechanged(v1.4.18)、clink.onhistory(后续版本支持返回字符串覆盖保存内容)。事件回调统一通过 _add_event_callback 注册,优先级体系见 events.lua。
四、v1.2.x 及更早:终端仿真、键绑定与基础能力奠基
4.1 终端仿真演进
- v1.1.1-alpha 引入
terminal.emulate设置(后改名terminal.emulation):控制 Clink 是做 VT 仿真还是将 ANSI 转义码直接传给控制台宿主,以支持 XTerm 256 色、16 位色等。 - v1.1.15:检测 Windows Terminal 并使用原生终端支持;支持 Xterm 256/24 位色转义码仿真(通过 CIELAB 色彩空间映射到最接近的 16 色)。要获得完整 24 位色支持,需使用 ConEmu、Windows Terminal 等宿主,或将
terminal.emulation设为native(部分旧 Windows 版本不支持)。 - v1.1.24:
terminal.emulation的auto在 Windows 10 build 15063 及以上使用原生 VT 支持(除非 HKCU\Console\ForceV2 注册表键为 0)。 - v1.1.32:支持非标准转义码设置窗口标题或打印环境变量;
emulate模式下 Clink 处理转义码,native+ ConEmu 时转义码传给 ConEmu(提示符中的环境变量码仍由 Clink 处理)。 - v1.1.4:自动检测 ConEmu 并禁用 Clink 的 VT 仿真。
- v1.1.37:支持 CJK 代码页(修复
#69中回车 echo 后提示符空格消失问题)。 - v1.3.4:修复终端仿真的反显(reverse video)转义码(同时修复弹窗列表选中项的右边框颜色);修复 8 位与 24 位颜色转换。
- v1.3.6:新增
terminal.mouse_input设置(默认auto),让鼠标输入在 ConEmu、或 Quick Edit 未勾选的默认 Conhost 终端中工作;新增cua-select-word命令。 - v1.3.7:鼠标点击+拖拽可用;点击
clink-select-complete列表下方展开列表。 - v1.3.8:新增
terminal.mouse_modifier设置与%CLINK_MOUSE_MODIFIER%环境变量(覆盖激活 Clink 鼠标输入的修饰键);新增%CLINK_SETTINGS%环境变量(覆盖clink_settings文件所在目录,可用于放到多机同步目录)。 - v1.3.2:新增
CLINK_TERM_VE、CLINK_TERM_VS环境变量覆盖普通(插入模式)与增强(覆盖模式)光标样式;可见铃铛在 Windows Terminal 中可用。 - v1.3.9:
terminal.raw_esc设置同样处理 Alt-[ 与 Alt-Shift-O 的问题。 - v1.2.11:新增
terminal.raw_esc设置控制 Esc 输入,迁移旧esc_clears_line设置;clink.print()支持 ANSI 转义码与NONL特殊参数。 - v1.2.23:按
terminal.differentiate_keys设置区分 Enter 与 Ctrl-m、Alt-Bkspc 与 Alt-Ctrl-h 的键名显示。 - v1.1.39:支持更多键绑定(如 Ctrl-Shift+字母);
terminal.differentiate_keys设置允许单独绑定 Ctrl-H/I/M/[ 与 Backspace/Tab/Return/Escape;移除terminal.modify_other_keys并恒为启用;terminal.use_altgr_substitute默认关闭以让 Ctrl-Alt 键绑定在带 AltGr 的键盘上默认可用。
4.2 键绑定与输入处理
- v1.2.33:重写 CMD.EXE 的 API 挂钩方式,弃用 IAT 挂钩、完全改用 Detours(detours 源码位于仓库根目录 detours);新增
clink.default_bindings设置选择bash或windows默认键绑定(仍默认bash以兼容既有安装);新增exec.aliases、exec.commands、exec.files设置细化exec.enable开启时首词的匹配生成;新增 F1-F9 默认键绑定以模拟 Windows 控制台函数键输入;新增clink-selectall-conhost命令模拟控制台"全选"。 - v1.1.20:支持通过 "luafunc:" 宏将 Lua 函数绑定到按键!新增
rl_buffer类型传给 Lua 函数;新增一组consoleLua API(如console.scroll())。 - v1.1.26:
rl.invokecommand()可在 "luafunc:" 键绑定内调用 Readline 命令;rl.setmatches()可覆盖补全匹配。 - v1.1.1-alpha:键绑定彻底改为 Readline 实现,统一通过 inputrc 设置,
clink-show-help可列出全部键绑定;Esc 成为可绑定键(\e[27;27~);Ctrl-@(NUL)可用;未绑定键被忽略而不是插入乱码。 - v1.2.36:键绑定支持 Enter 加 Ctrl/Shift/Alt 修饰键组合。
- v1.2.2:新增
%CLINK_HISTORY_LABEL%环境变量使用不同的主历史文件。 - v1.1.44:新增
%CLINK_NOAUTORUN%覆盖自动注入(Clink 安装为 autorun 时)。 - v1.2.29:新增
clink.reload()(下个提示符时重载 Lua 脚本与 Readline 配置文件)、console.readinput()(等待一个键输入并返回键序列字符串);新增prompt.transient设置(将先前的提示符折叠为精简形式),配套%CLINK_TRANSIENT_PROMPT%、%CLINK_TRANSIENT_RPROMPT%环境变量与:transientfilter()、:transientrightfilter()过滤函数;新增clink.logo设置控制启动 logo(完整版权 logo/短 logo/无 logo)。 - v1.2.25:
edit-and-execute-command(Ctrl-x Ctrl-e)按%VISUAL%、%EDITOR%、notepad.exe顺序调用编辑器编辑当前输入行并执行结果;新增cua-select-all。 - v1.2.32:
rl_buffer:setargument()让 "luafunc:" 宏设置 Readline 数值参数;os.getclipboardtext()/os.setclipboardtext()剪贴板读写;修复rl_buffer:getcursor()与rl_buffer:setcursor()返回值差 1 的问题。 - v1.2.35:
rl_buffer:getanchor()获取文本选区锚点(无 set 函数,需用rl.invokecommand())。 - v1.2.4:支持 Shift-方向键 选择文本、输入替换选中文本。
- v1.2.24:
%CLINK_RPROMPT%显示右侧提示符,提示符过滤器可定义:rightfilter()。 - v1.2.5:
os.expandenv()、console.cellcount()、console.plaintext();Clink 设置%=clink.bin%指向 Clink 二进制目录(便携安装时脚本可据此构造相对路径)。 - v1.2.20:
os.debugprint()通过OutputDebugString()打印调试文本。 - v1.1.43:
clink history --diag打印诊断信息。 - v1.1.42:
clink history --bare省略历史条目编号;新增io.popenrw()、os.createtmpfile()、os.getfullpathname()、os.getlongpathname()、os.getshortpathname();新增lua.strict设置(可关闭以回退到宽松参数校验)。 - v1.1.36:修复含超过 8192 字符历史行的崩溃(v1.1.2-alpha 引入回归)。
4.3 目录导航与路径处理
- v1.1.1-alpha:直接输入目录自行
cd /d进入;..\进入父目录;...、....等每多一个点向上多移一级(2 个点上一级、3 个点上两级,超过 2 个点时尾部路径分隔符可选);-、cd -、chdir -切换到上一目录。 - v1.3.37:重写路径解析以正确尊重 UNC 路径、
\\?\语法与\\?\UNC\语法。 - v1.1.15:doskey 宏可命名为
..或-,解析为..、-或目录名的宏也能工作;未设置 %HOME% 时由 %HOMEDRIVE%+%HOMEPATH% 或 %USERPROFILE% 合成。 - v1.1.24:
os:globdirs()与os:globfile()会剥离通配模式中的引号以更贴近 CMD 行为;line:getword()与line:getendword()现在剥离词中的引号(破坏性变更,但通常能让既有匹配生成器自动兼容嵌入式引号)。
4.4 设置体系与默认文件
- v1.3.5:
history.max_lines默认值提升至 10000;引入可选default_inputrc文件(从 profile 目录或二进制目录加载,格式与.inputrc相同,在.inputrc文件之前加载,.inputrc优先);安装器新增"Use enhanced default settings"选项,安装default_settings与default_inputrc文件以开箱启用更多增强(仓库根目录的 _default_settings 即此类文件示例,包含clink.default_bindings = windows、history.time_stamp = show、match.substring = True等增强默认值);安装器默认不再安装 AutoRun。 - v1.3.4:新增可选
default_settings文件(从 profile 目录或二进制目录加载,值覆盖内置默认值);设置只要被设置过就保存(即使值与默认相同,clink set setting.name clear可清除)。 - v1.3.8:
.zip发布包内含_default_settings与_default_inputrc,除非手动重命名去掉_前缀否则不生效,避免意外改变默认行为。 - v1.2.1:
clink set对 v0.4.9 提供向后兼容——旧设置名与值自动映射到新设置,使旧网站与帖子的建议通常仍可用。 - v1.1.14:从旧版 Clink 迁移设置与历史(仅当新版设置/历史文件不存在时)。
- v1.1.15:保存颜色设置时仅写入与默认值不同的项。
4.5 v1.0 时代与更早的奠基性变更
- v1.0.0a0(mridgers 原始仓库):大规模重构;移除 XP 支持与 Powershell 支持;
--cfgdir改为--profile且不再必填;新增clink info、clink echo、clink history命令;移除--scripts参数;新参数补全 API、新提示符过滤 API、新匹配生成 API;移除 git/go/hg/p4 内置补全脚本;核心 Lua 脚本改为内嵌而非从文件加载;新增clink_path、match.ignore_case、files.unc_paths等设置。 - v1.1.1-alpha:独占使用 Readline 的补全与键绑定实现;Readline 库从 v6.2 升级到 v8.0;将内部按键行为全部实现为可在 inputrc 中绑定的命令;新增
completion-auto-query-items、history-point-at-end-of-anchored-search配置变量;~映射到 %USERPROFILE% 而非 %APPDATA%;移除输入 4096 字节限制;修复 v1.0.x 中严重的随机内存损坏 bug。 - v0.4.x 时代:v0.4 引入更好用的
clink.argAPI、set动词、别名/doskey 补全、可选的命令历史持久化;v0.3 引入自动回答"Terminate batch script?"提示、彩色提示符(需 ANSICON 或 ConEmu)、Vi-mode 支持、可调整控制台大小、设置文件;v0.2 引入 git/hg/svn/p4 基本参数补全、doskey 支持、文件名自动加引号、可脚本化自定义提示符、每用户历史与日志文件;v0.1 为初始发布。
五、实用速查:从历史版本中提炼的日常配置
结合 CHANGES.older.md 与 CHANGES 的演进脉络,以下配置组合能覆盖多数日常场景:
:: 启用 Fish 式自动建议(v1.2.47+)
clink set autosuggest.enable true
clink set autosuggest.async true
:: 历史扩展预览与手动扩展(v1.3.43+)
clink set color.histexpand "sgr 97;48;5;55"
clink set history.show_preview true
:: 子串补全与列宽拟合(v1.3.1+)
clink set match.substring true
clink set match.fit_columns true
:: 交互式补全选择与弹窗(v1.2.19+ / v1.2.36+)
clink set match.max_rows 12
clink set match.preview_rows 5
:: 历史行为(v1.3.5+ / v1.2.3+)
clink set history.max_lines 10000
clink set history.sticky_search true
clink set history.time_stamp show
:: 终端仿真与鼠标(v1.1.1-alpha+ / v1.3.6+)
clink set terminal.emulation auto
clink set terminal.mouse_input auto
诊断锦囊:遇到提示符显示错乱、补全异常、性能卡顿等问题时,优先使用 clink-diagnostics(Ctrl-x Ctrl-z)检查问题字符、开销成本与已注册组件;结合 clink set debug.log_terminal true(由 v1.1.28 从 log.rl_terminal 更名)记录 Readline 的终端输入输出,可将问题定位到具体转义码。排查 Lua 脚本问题时开启 lua.debug 设置,可获得协程错误的 traceback 日志。
六、结论
从 v0.1 的初始发布到 v1.4.28,Clink 逐步构建起一套完整的 cmd.exe 命令行编辑增强体系:以 Readline 为内核(v1.1.1-alpha 完成整合),以 Detours 挂钩实现进程注入(v1.2.33),以 Lua 脚本提供可编程的提示符过滤、匹配生成、输入着色与事件回调,以终端仿真桥接现代终端(Windows Terminal、ConEmu、WezTerm)的 ANSI 能力,并以 clink-diagnostics 等工具支撑可诊断性。理解这些版本演进,不仅有助于配置当前版本的 Clink,也能在遇到异常行为时快速回溯其引入版本与设计初衷,从而更精准地定位与解决问题。