跳转到内容

交互编辑

  • 普通用户的提示符为 $ (),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 退出,否则删除光标后的字符。

原生终端和网页 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 按文本插入,不自动配对,因此可以粘贴不完整 或错误的源码后修复。未配对字符允许删除或补齐;无法可靠确定目标时,结构变换不修改内容。 历史搜索的查询继续按普通文本编辑。

原生终端和网页体验终端共用以下编辑命令。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。