Repository navigation
Usage zh CN
从 GitHub Releases 下载当前平台的安装包:
- macOS Apple Silicon:
SonicTerm-<tag>-mac-aarch64.dmg - macOS Intel:
SonicTerm-<tag>-mac-x86_64.dmg - Windows x64:
SonicTerm-<tag>-windows-x86_64.msi - Linux x86_64:
SonicTerm-<tag>-linux-x86_64.deb或SonicTerm-<tag>-linux-x86_64.tar.gz
macOS 上打开 DMG,把 SonicTerm.app 移到 Applications。发布构建使用 ad-hoc
签名,但没有 Apple Developer ID 签名,也没有 notarize。如果首次启动被 macOS
阻止,请在 Finder 右键菜单中选择 Open。Apple Silicon 安装包要求 macOS 14.0+,
Intel 安装包要求 macOS 15.0+。Cairo 及其原生依赖已随包提供,用户无需安装 Homebrew。
Windows 上运行 MSI。它会按机器安装到 Program Files,并添加开始菜单快捷方式。 安装程序还会把 SonicTerm 注册为支持脚本文件的可选 handler,但不会修改当前默认应用。
用以下命令安装 Debian package:
sudo apt install ./SonicTerm-<tag>-linux-x86_64.debLinux package 面向 x86_64,并保证最多需要 glibc 2.35 ABI。.deb 会安装已链接的
依赖和桌面 metadata。使用便携归档时,请先解压,再从 payload 目录运行
sonicterm,确保相邻的 assets/ 目录仍可读取。主机需要自行提供运行库;X11
需要 libxkbcommon-x11.so.0。X11 与 Wayland 都受支持。
首次正常启动会创建 ~/.sonicterm/、写入 sonicterm.toml,并生成可编辑的主题
和 keymap 示例。本地打包与发布资产的详细说明见 打包。
命令面板是查找 action 最快的方法:
- macOS:
Cmd+Shift+P - Windows 和 Linux:
Alt+Shift+P
搜索 关于 SonicTerm 或 版本,选择 关于 SonicTerm 结果后按 Enter,
会关闭面板并在该窗口已有的绿色通知中显示 SonicTerm <version>。版本号来自当前运行的构建。通知会替换当前气泡,并在五秒后
自动关闭,也可点击其关闭按钮。READONLY 模式下也可使用;不会在线查询发布版本,
也不会向 shell 发送输入。
常用默认快捷键如下:
| 功能 | macOS | Windows 和 Linux |
|---|---|---|
| 新建标签页 | Cmd+T |
Alt+T 或 Ctrl+T
|
| 关闭当前 pane 或标签页 | Cmd+W |
Alt+W |
| 向右 / 向下分屏 |
Cmd+D / Cmd+Shift+D
|
Alt+D / Alt+Shift+D
|
| 切换 pane 焦点 | Cmd+Shift+H/J/K/L |
Alt+Shift+H/J/K/L |
| 搜索 | Cmd+F |
Alt+F |
| READONLY 模式 | Cmd+[ |
Alt+[ |
| 快速选择 URL | Cmd+Shift+Space |
Alt+Shift+Space |
| 广播到当前标签页 | Cmd+Shift+B |
Alt+Shift+B |
| 重载配置 | Cmd+R |
Alt+R |
每个 pane 都有独立的子 PTY。一个标签页可以包含分屏树。标签页可以排序、在 SonicTerm 窗口之间拖动,也可以拖出成为新窗口。现有 pane 与 PTY 会一起移动, shell 不会重启。关闭分屏会关闭对应 PTY;关闭最后一个 pane 会关闭标签页。 对已放大的 pane 分屏会退出放大状态、恢复分屏布局并聚焦新 pane;主窗口与拖出的窗口行为一致。 分屏被拒绝时,放大状态和焦点保持不变;存活子窗口中的拒绝不会把分屏操作转移到主窗口。
广播模式会把源 pane 的输入复制到当前标签页或所有标签页中的其它 pane。所有参与 pane (固定的源 pane 与每个符合条件的接收 pane)在主窗口和拖出窗口中都有四边细红框。 顶部边线与其它边线一样为 2 个物理像素;不使用遮挡终端的横幅或警告文本。 即使只有源 pane,广播启用时也会标记;关闭广播或关闭源 pane 会清除高亮。 源 pane 不参与镜像投递,因此不会收到两份输入。READONLY 窗口不会接收广播输入。 请谨慎使用:输入会发送到每个接收 pane,按键编码遵循各 pane 协商的终端模式。
完整默认快捷键、action 名称和自定义格式见 快捷键。
使用鼠标滚轮、滚动条、滚动操作、提示符导航、搜索或复制模式回看历史时,视图顶部那一行会被
固定。命令持续输出时,即使历史已满、每行新输出都会淘汰最旧的一行,顶部仍显示同一段文字。
重新加载配置并调低 terminal.scrollback 时,固定的文字同样保持不变。若被固定的行本身已被
丢弃,视图移到仍保留的最旧一行;若已没有历史(例如历史被 CSI 3 J 清除,许多 clear 命令
会发送它),视图恢复跟随实时输出。
备用屏幕上的全屏程序显示它自己的屏幕。程序退出后,视图回到被固定的行,并按期间丢弃的历史 行数平移。固定的行随窗格一起移动到其它标签页和窗口。滚动到底部,或按 Enter 提交输入,会 恢复跟随实时输出。
搜索覆盖活动窗格保留的回滚历史与当前屏幕,不只覆盖可见行。修改查询后优先选中当前视口中
的第一个匹配;若没有,则选中视口下方的下一个匹配,或上方最后一个匹配。计数使用完整匹配
列表:上方四个、当前一个、下方两个时显示 5/7。
搜索读取每个单元格保存的完整文本,包括组合符号和其它零宽字符。子串模式先把查询和每个单元格的
文本转换为 NFC,再在不区分大小写时转为小写,因此预组合的 é 与 e 后接 U+0301 可以互相
找到。规范化按单元格进行,匹配基于规范化后的文本:保存 e 后接 U+0301 的单元格经 NFC 后是
单个 é,因此单独的 e 或 U+0301 都找不到它。正则模式直接匹配原始字符,不规范化模式或文本;
包含组合符号的匹配会高亮承载该符号的单元格,从同一单元格开始的多个匹配只计一次。
键入、输入法提交和粘贴只更新选中结果,不自动滚动。Enter 或下箭头向后查找,Shift+Enter 或上箭头向前查找,首尾循环。选中结果在屏外时,第一次导航先显示它,不跳过它;结果已可见 时不重新居中视口。搜索粘贴只进入查询,不发送给 shell 或广播窗格,并去除控制字符。 可用 Shift+方向键或鼠标拖动选择查询文本,再使用已配置的复制/粘贴 action;Windows 的 Ctrl+A 全选查询内容。移动文本选区不会改变当前搜索结果。这些文本框控制同样适用于命令 面板及标签页/窗口重命名编辑器,详见快捷键。已经因保留上限被淘汰 的历史和其它窗格不在搜索范围内。
长查询文本框在光标完整可见时保留当前显示的水平位置,反向拖选时也一样。边缘字符只显示 一部分时,鼠标选区会吸附到附近能完整显示光标的查询边界;拖到任一边缘外都不会自动滚动。 文字或布局变化会重置该位置,搜索匹配计数变化也会重置。提示符和计数从不属于可选择的查询内容。
终端窗口在进程内从 1 开始编号,例如 #1 SonicTerm。在命令面板中选择
重命名窗口,可设置为 #2 Work。只需编辑自定义名称:Enter 去除
首尾空白并保存,留空恢复默认编号标题,Escape 取消。支持 Unicode 和输入法;去除
首尾空白后最多 128 个 Unicode 标量值。控制字符、换行及超长输入会被拒绝并显示原因。
已配置的粘贴快捷键替换选中的名称文本,或在光标处插入文字,不会发送给 shell。
复制只读取此文本框的选区;替换内容无效时,原有名称文本和选区保持不变。
在 macOS 上,接收操作的窗口拥有重命名编辑器时,编辑 > 粘贴和 Cmd+V 也遵循此规则。
名称输入框优先于下层搜索框及 READONLY 拒绝逻辑。被拒绝、为空或不可读取的剪贴板内容
不会转交搜索框、shell 或广播窗格;输入法正在组合文字时忽略粘贴。
在另一个窗口粘贴时,仍按该窗口自身的输入路径处理,不会修改留在原窗口的名称输入框。
同一进程内编号永不复用或重新分配。新建窗口与拆出的标签页获得新编号和空名称; 把标签页移入现有窗口,或隐藏后恢复保留的窗口,都不会改变窗口身份。预热辅助窗口 在被采用前不编号。名称与编号不跨重启保存;不同进程都可能从 1 开始。标签页名称、 shell 命令、OSC 标题、工作目录、焦点变化及配置重载均不会重命名窗口。编辑器始终 针对打开它的窗口,窗口关闭时取消。READONLY 模式下仍可使用命令面板和重命名窗口, 终端输入及不安全操作仍被阻止。
原生标题用于适用的系统窗口列表、预览及切换器。Windows 包括任务栏预览和 Alt+Tab; macOS 包括窗口列表、Dock 窗口菜单及 Mission Control,不包括应用级 Cmd+Tab。 Linux 取决于 X11/Wayland 桌面。系统可能隐藏或截断标题;应用分组、图标、应用 ID 及 Dock 应用名称保持不变。
拖动可以按 cell 选择。双击选择单词,三击选择整行。双击或三击后继续拖动时,会按 完整单词或整行扩展。松开鼠标不会自动复制。
拖动属于开始拖动的窗格。指针移到其它窗格、窗格间隙或窗口外时,选区只扩展到该窗格最近的 cell。如果 SonicTerm 为这次按下捕获选区快照时解析器正忙,或按在窗口重绘前已因调整大小而 移除的 cell 上,就不会开始新的选区,当前选区和窗格焦点保持不变。选区快照不会等待解析器; 此前读取终端鼠标模式时仍可能等待。切换标签页、关闭该窗格或标签页,或调整大小改变了该窗格的 行数或列数,都会结束这次拖动。
支持鼠标的终端程序可以请求左键和 drag motion。在这类 TUI 中,请从 Shift-drag 开始,以绕过 mouse reporting,让 SonicTerm 在本地选择文字。 Gesture owner 在第一次按下鼠标时确定,并保持到松开。
选好后使用当前平台的复制快捷键。在 alternate screen 中,显式复制成功后会清除
该选区并移除高亮。剪贴板写入失败时,只要选区仍有效,它就会保留,方便重试。
Primary screen 中复制成功后,选区仍保留。若选中 cell 只是按完全相同的字符、style、
hyperlink、宽字符结构和组合字符重新绘制,选区会保留;实际 cell identity 改变时,
SonicTerm 会在复制前清除它;自动换行连接所选各行的位置发生变化时也会清除。
终端程序也可通过 OSC 52 的 c target 写入最多 512 KiB
的 UTF-8 文字。剪贴板读取/查询、格式错误的 Base64、其它 selection target 和超限写入
都会被忽略。
复制遵循终端记录的换行。因输出到达右边缘而接续上一行的行,会与上一行直接相连, 不插入换行符,换行处的空格也会保留,因此长命令、路径或 URL 会粘贴为一行。真正的 换行复制为换行符,该处以及选区末尾的行尾空格会被去除。若某次编辑改变了上一行的最后一列, 或换行控制符、滚动、插入或删除行、屏幕擦除或尺寸变化到达该行,它就不再算作自动换行, 而作为独立的一行复制。从首列改写或擦除续行本身会保留换行,与 xterm 和 WezTerm 一致, 因此重绘自动换行命令行的 shell(例如启用语法高亮的 zsh)仍会把它复制为一行。 放不进最后一列的宽字符会提前换行,并在该列留下空白;这个空白复制为一个空格。
READONLY 模式会在查看历史记录时阻止终端输入。方向键或 h/j/k/l 移动阅读光标;
w/b、0/$、g / G 分别按单词、行和 buffer 移动。按 Escape
退出。READONLY 不创建文字选区。搜索、切换标签页、切换 pane 焦点、检查更新和保存
当前字体设置、命令面板及重命名窗口仍可使用。完整控制与允许列表见 快捷键。
粘贴会进入活动窗格。若该窗格是广播源,粘贴也会进入每个广播接收窗格。拖入的文件进入 所落窗口的活动窗格,而不是指针下方的窗格;若该窗格是广播源,也会进入它的广播接收窗格。 SonicTerm 为每个接收窗格分别编码粘贴内容。
粘贴的文字原样发送。若窗格中的程序开启了括号粘贴(bracketed paste),该窗格收到的文字 带括号粘贴标记;其它窗格收到普通文字。
同时拖入的多个文件会变成一行带引号、以空格分隔的路径。SonicTerm 不会添加 Enter,你可以 先检查这一行再运行。每个窗格按其启动 shell 为路径加引号:
| 窗格的启动 shell | 路径引号 |
|---|---|
sh、bash、zsh、dash、ksh
|
POSIX shell 引号规则 |
pwsh、powershell
|
PowerShell 单引号;路径中的单引号(包括弯引号)加倍 |
cmd |
双引号 |
其它 shell,例如 fish
|
POSIX shell 引号规则 |
名称带不带 .exe、大小写如何都能识别。引号规则只看窗格的启动 shell:在其中再启动的
shell,或经 SSH 进入的 shell,都不会改变它。
为避免发送会被误读或被截断的输入,窗格会拒绝以下粘贴:
- 拖入的路径不是有效的 Unicode,或含控制字符;
- 对
cmd,拖入的路径含"、%或!; - 编码后超过 16 MiB 的粘贴,引号、空格和括号粘贴标记都计入。
只要有一个路径被拒绝,该窗格就拒绝整个拖放;一个窗格拒绝不影响其它窗格。粘贴或拖放 所在的窗口会显示一条警告:说明有多少个接收窗格拒绝了这次粘贴,列出每种原因及其影响的 窗格数;对超大粘贴,还会给出所需的大小和上限。警告从不显示路径或粘贴的文字。
READONLY 窗口中的粘贴和拖放不会向终端发送任何内容。无论窗口可写还是处于 READONLY,搜索打开时, 剪贴板粘贴都只由该窗口的搜索查询接收,绝不会发送给 shell 或广播窗格。如果活动窗格暂时不可用, 查询保持不变,粘贴被消耗;见上文“搜索保留的输出”。 在 Linux X11 上,只要有一个拖入的文件名不是有效的 UTF-8,这次拖放就不会送达任何文件。
tmux、rmux、GNU screen 与 Zellij 决定哪些链接、工作目录、按键和剪贴板写入能到达 SonicTerm。各复用器转发的内容、tmux 与 rmux 推荐配置,以及链接、路径、鼠标和剪贴板在 窗格中的行为,见终端复用器。
鼠标指向目标时,macOS 按住 Cmd,Windows 和 Linux 按住 Ctrl。有效目标会显示
下划线;点击即可打开。OSC 8 link 和普通文字中的 http://、https://、
mailto:、file:// URI 优先于原始文件系统检测。无关终端输出和同值重绘不会让
未变化的目标闪烁;pointed row、target、CWD、viewport 或可打开 identity 改变时,
授权会被撤销并重新 probe。
普通悬停会以主题黄色提示为检测到的 URL 和 OSC 8 标签添加下划线;按住打开修饰键后改用
操作强调色。普通悬停不改变字形前景色;解析器暂时繁忙时不会移除未变化的提示。
悬停检测遇到锁忙会请求稍后的完整快照重绘,避免移动指针或改变 Cmd/Ctrl 后的反馈等待无关
终端输出。此规则适用于主窗口、子窗口以及 GPU 和软件渲染;点击仍须通过新的目标验证。
OSC 8 覆盖范围沿连续标签跨越已记录的自动换行,包括宽字符。在备用屏幕上,若在同一窗格内,
上方片段之后到窗格右边缘最多只有 2 个空白单元格,且下方片段之前从窗格左边缘起只有最多
8 个单元格的空白缩进(框线或规则字符不算空白),覆盖范围也会延续到下一行中同一链接的片段。这适用于复用器的窗格边缘,
以及 Claude Code 等用悬挂缩进和较小右边距自行折行长链接的应用。连续几行上重复出现的短链接
在上方片段后留有更多空白单元格,因此各自保持独立的下划线。在主屏幕上,只有已记录的自动
换行会延续下划线。覆盖范围不会跨其它硬换行或间隔连接另一次出现的链接,单击始终打开存储的
目标。最多绘制 32 个可见片段;标签过长时仍保留指针所在片段。
正文圆括号或方括号中的 URL 也会被检测到,外层括号不会进入目标地址或下划线范围。
纯文本 URL 同样会跨已记录的终端右边界自动换行连接:指向任意片段都解析完整目标,并高亮
所有片段。重建要求完整逻辑行仍可见,且不超过 32 行和 16 KiB;不完整或超限的链保持不可操作,
不会打开截断的前缀。
应用插入硬换行的 HTTP(S) URL 也可连接,但协议前必须紧邻 ( 或 [,且匹配的闭括号仍可见。
闭括号后直到下一个空白或行尾只能有普通句末标点;紧邻的 URL 文字会使边界有歧义并阻止重建。
完整 authority 与第一个路径斜杠必须出现在首次换行前;所有非末尾片段必须到达右边界,
续行必须使用一致且不超过 8 个 ASCII 空格的缩进。同样受 32 行限制,连接后的 URL 上限为
4 KiB。只移除缩进
与行边界,查询文字、百分号转义和连字符均原样保留。片段内空白、嵌套括号、不安全 cell、
混合换行类型及多个协议会阻止重建。已识别但不完整的片段不会回退到截断 URL。
没有外层括号的硬换行及本地路径不会连接;任意标签布局可通过 OSC 8 保留完整目标。
在备用屏幕上,复用器等全屏程序可以用不记录换行的光标移动在下一行继续一行文字。因此在
备用屏幕上,若某个窗格段的最后一列是文字,而下一可见行中左右窗格边缘相同的段以文字开头,
该段也会延续到下一行,除非终端在这两行之间记录的自动换行连接的是不同窗格。这样的链最多 32 行,
并在视图顶部和底部停止。这类连接同时承载路径和纯文本 URL。tmux 重绘窗格时(刷新、调整尺寸
或切换窗口)用 CR LF 分隔各行,因此 tmux 中的长 URL 依赖这类连接。跨越连接的路径只有在
连接后的文件存在时才提供。恰好填满窗格边缘的无关行可能连接成更长的 URL;按住修饰键悬停时
的预览会在打开任何内容之前显示完整目标。到达链停止处窗格边缘的候选会被拒绝,因为
其文字可能在视图之外继续;若指针下不含空格的文字到达这样的边缘,该处不添加任何链接。
括号内的 URL 在全宽窗格中仍按上文方式连接,在分屏窗格中则不会,因为下一行以另一个窗格的
文字开头。主屏幕只连接已记录的换行,因此全宽的 ls 列永远不会连接;见
终端复用器。
按住修饰键悬停时,本地目标只有通过当前文件系统探测验证后才显示预览。只有选中的现有路径 会添加下划线和预览。待验证、不存在、被阻止或被拒绝的本地目标不显示预览,避免把目录列表 字段显示为未经验证的路径。 预览不添加操作标签或错误信息,不更改剪贴板,也不授予打开权限。位置、转义、换行和隐藏 规则与 URL 预览相同。
在任意 URL 上按住同一修饰键,都会在指针旁预览目标,包括带标签的 OSC 8 链接、
标签与目标完全相同的链接,以及自动检测的纯文本 URL。按住修饰键并单击即可打开。
& 等查询分隔符原样保留,因此含多个查询参数的链接(包括仓库文件和行号链接)
可以打开。协议、长度、控制字符以及其他禁用字符的检查仍然有效。
终端下划线会跨越显式输出且具有相同下划线样式与颜色的空格。未设置下划线的单元格 仍会形成间隔;即使下划线模式处于开启状态,清除单元格也不会产生新的下划线。
预览不会访问网站,也不会授予打开权限。本地 file URI 同样需要路径验证;控制字符和方向格式字符 会转义后显示。失败原因在单击后的错误通知中说明,不会添加到预览。长目标自动换行,无法完整 容纳时明确显示省略号。松开修饰键或离开链接即隐藏;焦点、模态界面、pane、viewport 和内容变化会刷新或清除预览。GPU 与 Windows 软件渲染使用相同的预览覆盖层。
原始本地目标包括:
-
/usr/local/etc、C:/Users/name、C:\\Users\\name等原生绝对路径; -
~/notes和 Windows~\\notes等当前用户 home 路径; -
src/main.rs和 Windowssrc\\main.rs等带分隔符的相对路径; -
./file、../file、../../file等显式相对路径; -
sonicterm、.DS_Store、My Folder等上下文名称。
这些形式可以包含普通空格。相对形式和上下文名称要求准确 pane 通过 OSC 7 报告可信 本机绝对工作目录。OSC 7 缺失、格式错误或来自远端 host 时会 fail closed。 SonicTerm 不会改用进程工作目录、其它 pane 的目录或命名用户的 home。
在备用屏幕上,相对形式和上下文名称不会添加链接:复用器等全屏程序可以显示多个窗格,却只报告一个 目录,而屏幕无法表明文字属于哪个窗格。此规则适用于所有全屏程序;见 终端复用器。
后台 probe 最多检查 37 个候选,每个候选最多跨 8 个非空格部分。按显示文字的 Unicode 字符数
计算,长于 terminal.clickable_path_max_chars(默认 1024)的候选会被忽略。逻辑显示行重建
上限为 16 KiB 和连续 32 行,因此在常见宽度下(80 列时约 13 行)可以检测并标出最长 1024 个
字符的路径或 URL;扫描器仍把每个目标限制在 4 KiB。在主屏幕上,SonicTerm 只跨已记录的终端右边界自动换行连接
路径片段,硬换行绝不会连接;备用屏幕还会连接上文所述的窗格边缘续行。完整链必须仍在可见
viewport 内;所有片段共享同一授权与下划线。已记录换行的第 33 行、不可见边界或前驱已从
scrollback 淘汰时,整条链保持不可操作。
候选必须包含鼠标指向的 cell。候选在空白或被修剪的标点处结束,包括全角 ,。;:,绝不会
在词语中间结束。SonicTerm 按显示候选的 Unicode 字符数从短到长探测候选;长度相同的候选从
起点较早者开始尝试。某一长度的候选全部不存在时跳过该长度。在第一个存在任一候选的长度中,
被阻止的候选会以“被阻止”拒绝结束探测;否则最早的可操作候选胜出。目录同样计入。若
/usr/A 与 /usr/A B 都存在,指向 /usr/A 内部会打开 /usr/A。对于 src/main.rs, 这类
以正文标点结尾的路径,去掉末尾逗号、分号、句点、冒号、感叹号或问号的候选更短,因此存在时
即胜出;此时下划线不包含正文标点。一个以原生绝对路径、当前用户 home 路径或点相对路径开头、
内部不含空格的词,也允许首个符合条件的 Unicode Other Punctuation 字符分隔前面的路径和后面
的正文。例如,~/.claude/settings.json,将 会打开 ~/.claude/settings.json。可操作范围不含
分隔符和正文,但这些单元格仍参与安全验证。Unicode 文件名字符保持原样,路径语法字符不作为
分隔符。这不会增加带空格路径的正文切分规则,也不改变 ./、../ 对 OSC 7 的要求;当前用户
home 路径不要求 OSC 7。
从短到长的规则可能选中更短的现有前缀:在 OneDrive - Microsoft 中指向 OneDrive 时,
若存在同名文件夹,会打开 OneDrive。要打开更长的名称,请指向后面的词,或使用显式路径或
OSC 8 链接。
单击时,打开 worker 会对所选长度及更短长度的每个候选重复这次选择;只有仍得到相同路径和 操作时才打开。因此,悬停后新出现或变为被阻止的更短或更早文件会阻止这次打开,并在窗口中 报告失败。所选长度及更短长度出现新候选时,也会丢弃缓存的授权。
ll 输出的完整独立单引号上下文名称,例如 'My Folder',会按 My Folder 处理。显式路径也支持一对完整的单引号、双引号
或反引号,包括 'C:\work\My Folder' 这样的带空格路径。引号不属于可操作范围,但仍参与
cell 安全检查。引号内容按字面处理,不执行 shell 反转义或变量展开。不配对或混合引号、
拼接文字、首尾填充空格、$/% 展开语法、其它带引号的裸名称、ls -F 后缀
(*、@、=、|),以及含破损宽字符配对、组合附加字符、控制字符或已属于 OSC 8 的 cell
的原始路径都保持不可操作。有效宽字符配对保留准确文件名和单元格范围。
终端消息中的文件引用可以直接操作,包括 Update(src/main.rs) 或 Read(./notes.txt)
这类括号完整、名称为标识符的工具标题。内部路径不包含工具名称和外层圆括号。
带括号的路径与源文件位置引用也允许后接句末标点,例如 (src/main.rs:97).、
[src/main.rs:97:4],、{src/main.rs}; 或 Read(src/main.rs:97–100)!。
可操作范围不包含外层括号和标点;括号内部的标点仍遵循从短到长的探测规则。
成对结构先于外围正文识别:(reports/flight.html),内容 和
【reports/flight.html】,内容 保留同一个内部目标。支持 ()/[]/{}、ASCII
引号/反引号、()/【】/《》/「」/『』、“”/‘’/«» 及标识符式工具调用。
外围分隔采用 Unicode 的 Other Punctuation 和 Dash Punctuation 类别,不维护逐语言的标点清单。
路径分隔符、错配闭括号、直接拼接,以及 (src/main.rs).bak 这类点号/冒号后缀续接,
仍因有歧义而不可操作。这不会解释原始 Markdown 或删除不可见字符。有效宽字符的两格都参与
安全验证,包括文件名内容。边界缺失或不安全时,不能回退到较短的内部片段。
path=C:\work\file.exe 和 file="C:\My Folder\report.md" 这类绝对路径字段的可操作范围
不含字段名和配对引号。相对赋值、拼接或未闭合引号不适用该规则。文件名内部的 = 保持字面含义。
src/a.rs、b.rs 这类无括号文件列表同时提供指针所在的文件成员和完整字面文件名。成员更短,
因此只要存在就胜出,即使字面文件也存在;只有成员不存在时字面文件才会胜出。第二个名称只在
该 pane 的 CWD 中解析,不会推测它属于 src。连字符不是列表分隔符。
在 src/main.rs and focused tests/main.rs. Require stable 这类正文中,分别指向两个
文件名即可独立解析。and 不是保留词:真实文件名中的空格与圆括号仍通过探测文件系统找到。
待验证或被阻止的上下文路径使用指向的文件名反馈,不使用未经验证的多词正文猜测。
未经验证的带根路径仅在最后一个组成部分具有扩展名、且前面的类文件名词不会使范围
产生歧义时保留空格;其它多词猜测需要验证。验证通过的文件始终保留完整路径。
install.sh:889–919、src/main.rs:12 和 src/main.rs:12:4 等源文件引用保留完整下划线,
但只解析文件名。行号与列号必须为正数;范围接受 - 或 –,且终点不能早于起点。
相对源文件名仍要求准确 pane 的可信 CWD。Windows、macOS 和 Linux 都在所在文件夹中
选中引用的文件。行号不启动编辑器,也不限制文件类型或内容。
(src/main.rs:924, :934, :375). 这样的分组引用共用一个显式路径,最多包含八个有效位置。
指向某个位置时选择对应元数据,指向文件名时选择第一个位置。整个分组统一显示下划线并
参与验证;分隔符和外围标点不触发导航。任何无效成员都会使整个分组失效。分组锚点使用
不带引号和空格的路径;单独的带引号引用支持空格。带空格锚点的分组位置引用整体不可操作,
包括锚点本身,不会回退到较短文件名。不加括号的分组必须位于片段开头或紧随另一个完整分组;
正文之后请用 ()/[]/{} 明确锚点边界。普通文字之后的括号会按正文分隔处理,
不会作为带空格相对文件名的延续。
由 SonicTerm 启动的交互式 PowerShell 7.2 及以上版本,会给默认目录显示附上完整本地文件 URI。
名称折到多行时,每段保留相同目标;缩进和后面的目录项不带该链接。保留模式、日期、长度及名称
颜色。ls 仍是 Get-ChildItem,对象流水线不变;显式 Format-Table 使用原生视图。
纯文本和重定向输出不带终端装饰。
集成只在当前进程生效,嵌入 SonicTerm,不写 profile 或格式文件。自定义文件名 getter 或非标准 文件视图不会被覆盖;旧版 PowerShell 与受限语言环境保留原格式。已有输出不会重写。 本地目标仍需验证;点击可执行文件只在文件夹中选中,不执行它。
在 Windows 的 SonicTerm 中,从仓库根目录运行 ./scripts/test-local-link-actions.ps1。
它打印带编号、预期预览与点击结果的例子,并在独立临时目录创建无害文件;不会自动打开目标、
修改配置或写入剪贴板。测试后删除输出中注明的夹具目录。
用 -Group Web、Osc8、Paths、Wrappers、Source、Negative、Wrapping
或 KnownGaps 可逐组检查,默认是 All。已知缺口单独标注,不冒充已支持的行为。
检查换行时调整窗口宽度,并保持完整目标可见。反馈时提供分组、例子编号、预览和实际点击结果。
这份手工矩阵补充 scanner/app 回归测试,不代表对任意文本的穷尽证明。
Windows/Linux 使用 Ctrl+单击,macOS 使用 Cmd+单击。
| 目标或状态 | 预期行为 |
|---|---|
| 存在的普通目录 | 在文件管理器中进入该目录。 |
| 存在的普通文件,包括脚本、可执行文件、安装包和快捷方式文件 | 打开所在文件夹并选中文件本身;不执行、不跟随快捷方式、不调用关联应用。 |
| macOS 应用或软件包目录 | 在 Finder 中选中软件包,不启动它。 |
| 列表或文字中存在的裸文件名 | 根据准确窗格的可信本地工作目录解析;仅给验证后的文件名加下划线并选择,保留文件名中的空格。 |
| 未验证的裸名称或普通文字 | 无预览、文件操作、错误通知或剪贴板写入;列表元数据不是文件路径。 |
| 所有候选都不对应文件的检测路径文字 | 无下划线或预览。按修饰键单击按普通终端单击处理:无通知,也不写入剪贴板。仍会写入一条 debug 日志。 |
| 验证完成前单击的显式文件路径 | 按修饰键单击后显示路径及正在验证的原因;第一次不导航、不复制。 |
| 不对应文件的本地 file URI 或 OSC 8 链接 | 按修饰键单击后显示路径及不存在的原因;第一次不导航、不复制。 |
| 被阻止或被拒绝的显式路径 | 显示路径和拒绝原因,不绕过身份或本地性检查。 |
| 文件管理器操作第一次失败 | 显示尝试的路径、原因和再次单击复制的提示,保留剪贴板。 |
| 错误仍显示时再次按修饰键单击同一失败路径 | 复制该路径而非重试,并报告复制成功或失败。 |
| 错误已关闭、过期或被替换 | 后续单击开始新尝试,而非确认之前的错误。 |
| HTTP/HTTPS 或邮件 URL | 保持 URL 预览和浏览器或邮件导航行为。 |
显式路径包括本机绝对路径、./、../、~/ 路径、带分隔符的相对路径、源位置引用,
以及本地 file URI 或本机路径 OSC 8 目标。显式路径保留文件名中的空格。对于未经验证、
以裸文件名为基础的源位置引用,失败提示排除周围正文;含空格裸文件名需要文件系统验证,
或通过显式路径/OSC 8 目标指定。裸名称只有通过文件系统验证后才成为文件路径目标。
文件扩展名、执行权限和文件内容不会阻止选中文件。在 Windows 上,SonicTerm 需要能读取路径的
每一部分;读取被拒绝时需要能执行该部分(文件夹为遍历)。两者都不允许的部分,或被其他程序以
不共享读取的方式占用的部分,都会被拒绝;检查进行期间,其他程序无法重命名或删除已持有的部分。
路径中任意位置的符号链接都会被解析,由解析后的目标决定是选中文件还是进入目录;悬空或循环的
链接会被拒绝。在 Windows 上,解析指向网络共享的链接会连接该服务器,因此只有当盘符恰好映射到
根目录报告为本地磁盘的 \Device\HarddiskVolume<N> 卷时,路径才会从该盘符开始逐部分检查,
并保持每个已检查部分处于打开状态;符号链接或目录联接只在本地固定磁盘之间跟随,也不会打开
任何远端卷。映射网络驱动器、subst 驱动器、光驱和 RAM 盘、挂载到盘符的动态磁盘卷或卷影副本
上的路径,以及经过以 GUID 挂载卷的文件夹的路径,都不会成为链接;未指向任何驱动器的盘符上的
路径会被拒绝,而不是报告为不存在。指向 UNC 路径或设备路径的链接、位于可移动驱动器上的链接,
以及云文件占位符等其他重解析点,会在打开其所指的任何内容之前被拒绝。调用时,Windows 会再次
遍历路径,并在持有每一部分期间把遍历得到的无链接路径交给 shell,因此最终文件或文件夹之上的
任何文件夹都无法被重命名、删除或改成链接,经由链接到达的文件会在其真实文件夹中被选中。之后
由 shell、资源管理器和文件的处理程序自行打开该路径:最后一部分仍可能被原地更改,shell 调用
返回后不再持有任何句柄。你自己登录会话中的进程可以重新定义盘符并直接访问网络,因此不在保护
范围内。特殊设备和不支持的远端或网络路径仍受保护。
各平台在调用前都会重新沿整条链接链验证目标身份和类型。
所有平台都进入目录,或打开文件所在文件夹并选中文件,
不调用文件关联的应用。Windows 使用 SHOpenFolderAndSelectItems,Finder 使用
/usr/bin/open -R -- <target>,Linux 使用 org.freedesktop.FileManager1.ShowItems。
选择功能不可用或被拒绝时会在发起请求的窗口报告失败,不会回退到打开文件或仅打开父目录。
只有已验证的本地目标才调用原生文件操作。待验证、被阻止或被拒绝的显式路径,以及不对应文件的
本地链接,会显示单击触发的反馈;不对应文件的检测文字和裸名称猜测不会。
操作第一次失败时,通知显示尝试的文件路径、原因,以及再次单击同一链接以复制的提示,
不会更改剪贴板。错误仍显示时,再次按住修饰键单击同一失败路径才复制,不重试打开,
随后报告复制成功或失败。通知关闭、过期、被替换或单击其他目标后,不确认之前的失败。
短通知按实际整形后的最长行收缩,保留换行并按 Unicode 字素换行;超过窗口空间的内容
明确以省略号标记。悬停不复制。原生错误只返回原始窗格仍属于的发起窗口。
不按修饰键的单击保留正常选择行为。目录仍使用各平台
现有的目录打开方式。基于路径的文件管理器请求在重新验证后仍存在通常的 pathname race。
OSC 8 中的本机绝对路径(包括 Windows C://…)、Windows 驱动器绝对路径 file:c://…
和本地 file:// URI 使用相同的文件系统授权流程。本地 #3、#L3 和升序 #L3-L7
片段属于源文件行号信息,不属于文件名;选择操作仅使用文件路径。本机绝对路径 OSC 8
目标也遵循此约定。若文件名确实以 #3 或 #L3 结尾,请使用以 %23 表示井号的 file URI。
纯文本本机路径扫描仍保留原有的字面井号行为。file URI 转义只解码一次;本机路径中的百分号保持字面含义。远端 authority、
UNC/设备路径以及格式错误的目标会被拒绝,不会以显示标签替代。HTTP/HTTPS 和邮件链接
保持原有行为。URI 打开器本身只接受 http、https 和 mailto,并拒绝所有 file: URI,
因此 file 链接只能经由这一授权流程访问文件系统。
Windows 上打开 URI 与打开已验证本地目标使用同一条不经过 shell 的边界:ShellExecuteExW
以单个 NUL 结尾的 UTF-16 字符串接收 URI,不会有任何命令解释器解析它。环境变量替换保持关闭,因此
https://example.com/%20space 这类以百分号分隔的 URI,或包含 %USERNAME% 的 URI,会按
屏幕上显示的原样交给浏览器或邮件客户端,不会展开成环境变量的值。
设置 terminal.clickable_bare_names = false 可以关闭上下文名称。设置
terminal.clickable_local_targets = false 可以关闭所有原始本地目标,也包括本地 file URI
和本机路径 OSC 8 链接;网页和邮件 URI 链接不受影响。设置 terminal.clickable_path_max_chars
可以修改检测候选的最大长度。准确默认值和重载行为见 配置。
安装后的 macOS build 可以出现在 Finder 为 .sh、.command、.tool 提供的
Open With 菜单中。Windows MSI 会把 SonicTerm 注册为 .ps1、.cmd、.bat、
.sh 的可选 handler。安装不会替换当前默认 handler。
打开受支持文件时,SonicTerm 会在文件父目录创建标签页,安全引用绝对路径,并把命令 放到提示符中,不会发送 Enter 或其它 control byte:
- POSIX
sh、bash、zsh、dash、ksh:.sh、.command、.tool; - PowerShell 或
pwsh:.ps1、.cmd、.bat; - Command Prompt:
.cmd、.bat,且路径不能包含%、!、"。
请自行检查、修改、提交或清空草稿。未知 shell、不支持的 shell/script 组合、相对路径、 非 Unicode 路径、control character 或不安全的 Command Prompt 路径,仍会打开标签页, 但只显示 warning,不插入命令。
这是输入草稿功能,不是 sandbox。Shell startup file 会先运行,也可以读取 PTY 输入。 如果启动配置会读取并执行输入,即使没有 Enter,也可能执行或吞掉草稿。使用这类配置时, 不要把 SonicTerm 设为脚本 handler。对于这个 open action,SonicTerm 自身不会运行脚本 或解释器。
Windows 中,每次文件关联调用都会启动新的 SonicTerm 进程。macOS 会把后续 open request 发送到当前运行的应用,并添加标签页。
详细规则由以下页面维护,这里不重复: