Clink 版本演进全解:从 v0.1 到 v1.4.28 的功能演进、Lua API 与实战配置指南

原创2026-10-11 22:55:55542 阅读
文章标签:开发工具

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()(行为类似 Linux fnmatch(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-history Alt-^ 或 clink-expand-line Alt-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() 将命令行其余部分视为另一命令(内置 cmd argmatcher 即如此,使 cmd program 之后的补全由 program 的 argmatcher 解析)。:addarg() 表中可包含 onarg=your_callback_function,回调与匹配函数额外接收 user_data 参数(解析开始时为空表;每次 flag/参数链接到另一 argmatcher 时新 argmatcher 得到新的空表)。内置 cd/pushd argmatcher 借此影响后续输入行的匹配补全(如 pushd \foo & program Tab 以 \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 函数;新增一组 console Lua 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.arg API、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,也能在遇到异常行为时快速回溯其引入版本与设计初衷,从而更精准地定位与解决问题。

登录后查看全文
clink