交互编辑
- 普通用户的提示符为
$ (),root 为# (),光标位于右括号前。 原生终端按有效用户 ID 判断,网页使用$ ()。空输入时括号为灰色;开始输入后, 隐含左括号恢复原色。前缀和灰色右括号提示只参与显示,不写入源码或历史。 - 编辑区首个非空白字符为
#时,立即按字面值源码编辑并隐藏隐式灰色括号;删除前缀后恢复命令输入。字面值历史保持原样,光标位于末尾。Tab 提供#true、#false、#nil;补全以#开头的路径时自动加引号。 - Enter 检查整个编辑区,与光标位置无关。源码已完整时直接执行;否则尝试在末尾
补一个
),能使整份源码完整才执行。仍未完成时,在光标处插入换行。 Ctrl+J 始终换行。空白输入不执行、不写历史,也不改变退出状态。 - 输入左括号会自动配对。新输入以
(、[或{开头时切换到显式源码模式, 表达式自身的括号只显示和读取一次。输入右括号会越过匹配的闭合符,不执行命令; 隐式外层的)继续只作为显示提示。 - 粘贴只插入文本,其中的换行与制表符保持原样,不会执行命令。按 Enter 提交时, 所有顶层表达式先通过语法检查,再按顺序执行。语法错误会报告位置,保留草稿和 撤销记录供修改;源码未完成时继续编辑,不会先执行前面的完整表达式。
- 运行失败会停止本次提交的后续表达式,已经产生的效果保留。Ctrl+C 取消当前任务 和该批次剩余命令。队列源码保留在 parsh 中;交互式子进程读取后续终端输入, 不会读取队列中的命令。
- 方向键、Home/End、Backspace/Delete、Ctrl+A/E 和 Ctrl+U/K 用于编辑文本。 编辑与显示会考虑 Unicode 字素簇及字符宽度。 Up/Down 在行间移动,并在编辑区边界调取会话历史;Ctrl+P/N 始终用于浏览历史。
- Tab 补全内置命令、已定义函数、可执行程序、文件路径和
$变量名。 唯一匹配直接补全,目录以/结尾;多个匹配先补公共前缀,再按 Tab 显示候选。 补全作用于光标所在词,支持带引号的路径,不会执行命令。cd只补目录,隐藏文件需要输入.前缀;字符串内不展开变量,结构化注释中不补全。 粘贴中的制表符保持原样。 - 历史记录保存每条已执行顶层表达式的完整源码。调取时完整显示括号,光标停在 最外层右括号前。可直接追加参数,或按 Enter 重新执行; 向下浏览回到原草稿时,草稿原样恢复。
- Ctrl+C 清空输入或中断前台任务。编辑区为空时 Ctrl+D 退出,否则删除光标后的字符。
Paredit 结构编辑
Section titled “Paredit 结构编辑”原生终端和网页 REPL 始终启用 paredit。键入 ()、[]、{}、单引号或双引号的
开头字符时,自动补齐另一端,光标停在中间。连续输入三个同类引号,会将刚建立的
空引号对升级为 '''…''' 或 """…"""。自动补齐的闭合符属于真实源码,因此尚未
手动键入闭合符时,Enter 也能执行已经完整的表达式;需要继续换行编辑时使用 Ctrl+J。
Backspace/Delete 同时删除空配对的两端,遇到非空配对边界时只移动光标。
字符串转义和三引号界符作为完整单元处理。按行和按词剪切会在可能拆散配对的边界前
停止;Ctrl+T 只交换同一词或字符串文本中的普通字素,保留界符和转义。
双引号字符串中键入内部 " 会自动转义;原始单引号字符串中键入 ' 会移到现有闭合符之后。
| 按键 | 操作 |
|---|---|
| Ctrl+Alt+F/B | 前进/后退一个表达式 |
| Ctrl+Alt+U/D | 移到外围结构的开头/进入后续集合 |
| Ctrl+Alt+K | 向前剪切表达式,使用共享剪切记录 |
| Alt+( | 用 () 包住当前或后续表达式;无目标时插入空配对 |
| Alt+S | splice:去掉最内层集合的两端界符 |
| Ctrl+Right/Left | 向后 slurp/barf:移动右界符,吸入/吐出一个表达式 |
| Ctrl+Alt+Left/Right | 向前 slurp/barf:移动左界符,吸入/吐出一个表达式 |
例如,向后 slurp 将 (a) b 变为 (a b),对应 barf 将其还原;向前 slurp 将
a (b) 变为 (a b)。三种集合括号都支持这些变换;保留原有格式,仅在避免词合并时
补充分隔空白。每次变换独立撤销。字符串作为完整表达式,$(...) 内部使用独立编辑上下文;
隐式外层和插值边界不能被 splice 或改变层级。
Alt 组合也可先按 Esc:Esc Ctrl+F 移过表达式,Esc ( 包裹表达式,
Esc Ctrl+Left 向前 slurp。粘贴和 yank 按文本插入,不自动配对,因此可以粘贴不完整
或错误的源码后修复。未配对字符允许删除或补齐;无法可靠确定目标时,结构变换不修改内容。
历史搜索的查询继续按普通文本编辑。
Emacs 风格快捷键
Section titled “Emacs 风格快捷键”原生终端和网页体验终端共用以下编辑命令。Alt 组合键也可以先按 Esc,再按对应键。 字符编辑以 Unicode 字素簇为单位;Home/End、Ctrl+A/E 和 Ctrl+U/K 作用于当前逻辑行。
| 按键 | 操作 |
|---|---|
| Ctrl+J | 强制插入换行,不执行 |
| Ctrl+B/F、Ctrl+H | 向左/右移动;向前删除 |
| Alt+B/F | 移到上一个词的开头/下一个词的末尾 |
| Ctrl+W | 向后剪切,空白分隔词 |
| Alt+Backspace、Alt+D | 向后/向前剪切,字母数字组成词,路径标点和下划线是分隔符 |
| Ctrl+U/K | 剪切到行首/行尾;行尾处 Ctrl+K 剪切换行符 |
| Ctrl+Y、Alt+Y | 粘回剪切内容;紧接着轮换此前剪切的内容 |
| Ctrl+T | 在普通文本内交换相邻字素簇;行尾交换最后两个 |
| Ctrl+L | 清屏并重绘,保留草稿和会话 |
| Ctrl+R/S | 向后/向前增量搜索会话历史 |
| Ctrl+_、Ctrl+X Ctrl+U | 撤销一组编辑 |
连续剪切会按方向合并到同一条剪切记录,移动或其他编辑命令结束合并。
剪切记录跨命令保留,重置会话时清空;Alt+Y 仅紧接 Ctrl+Y 或 Alt+Y 时有效。
粘回、交换和撤销只编辑文本,其中的 ) 不会自动执行命令。
搜索区分大小写,按完整历史源码匹配子串,不循环;输入或粘贴更新查询,Backspace 删除一个字素簇。 再次按 Ctrl+R/S 查找上一个/下一个匹配项;空查询时再次按下会复用上次查询。 未匹配时显示失败提示并保留上次预览。Enter 或 Esc 接受结果并回到编辑,不执行也不插入换行; 之后再按 Enter 执行。Ctrl+G 恢复搜索前的草稿和光标;其他编辑命令接受结果后继续操作, Ctrl+L 保留搜索,Ctrl+C 取消输入。
连续打字按组撤销;删除、剪切、粘回、交换、补全和未提交的粘贴各自是一组。 移动光标结束打字分组;历史切换、搜索确认和提交建立新基线,中断或清空输入也会清空撤销记录。 撤销不会恢复已经执行的命令或其副作用。
网页快捷键只在终端聚焦时生效。浏览器或操作系统保留的组合键可能无法交给页面; Alt 键冲突时可使用 Esc 前缀。复制和粘贴继续使用浏览器的快捷键。
错误信息包含来源、行号和列号。脚本执行时会恢复多余顶层 ) 的错误,并继续执行后续表达式。
这类错误会使脚本以状态码 2 退出,除非后续的运行失败或显式 exit 指定了其他退出状态。
命令失败保留其退出状态;程序不存在时使用 127,没有执行权限时使用 126,其他语言错误使用 2。
首版面向 Linux 前台任务,包括交互式外部程序和前台管道。
暂不支持后台作业表、bg、fg 或挂起与恢复;子进程忽略 Ctrl+Z。
历史记录仅在当前会话中保留。宏和持久化配置留待后续实现。
浏览器终端共享输入、补全、历史、粘贴和布局模型;补全仅使用隔离环境中的命令与临时文件,提供语言求值与 coreutils 命令组合;运行期间 Ctrl+C 会重置浏览器会话。原生前台程序与终端交接仅适用于 Linux。