Space、Project 与 Thread
文档编写中
部分内容可能尚不完整。
ThinkTerm 把每个终端归在三个层级之下。Space 是一个工作情境,Project 是其中的一个文件夹,Thread 则是 Project 里一套保存下来的标签与分屏排布。侧边栏一次只显示一个 Space,下面是它的 Project,再下面是各自的 Thread。
三个层级
| 层级 | 是什么 | 一开始有的 |
|---|---|---|
| Space | 一个工作情境。它住在这台机器上,或者住在一台 ThinkTerm Connect 服务器上,连到那台服务器的每台设备都能看到它。一个 Space 可以绑定一个笔记库,由其中的 Project 共用。 | Default |
| Project | 一个文件夹。添加时以文件夹名命名,在它里面新开的终端都从那里起步。 | Home,位于 ~ |
| Thread | 一组标签和分屏,以一个名字保存下来。 | main |
Default 可以改名,但不能删除,这样窗口总有地方可落。每个新 Space 都以同样的方式开始:一个位于 ~ 的 Home Project,里面一个 main Thread。
新 Space 依次叫 Space 2、Space 3,新 Thread 依次叫 Thread 2、Thread 3,从已有的数量往后数。同一个 Project 里的两个 Thread 不能重名:把一个 Thread 改成同一 Project 里已有的名字,会在后面加一个数字,变成 review 2。
一个窗口一个 Space
一个窗口显示一个 Space,一个 Space 也只由一个窗口显示。已经在另一个窗口里打开的 Space,在 Space 菜单里显示为 my-space(已被占用),在那个窗口离开它或关闭之前无法选中。
新窗口会取你上次用过的本地 Space(只要没有别的窗口占着),否则取第一个空闲的本地 Space,再不行就新建一个。它从不在一个住在服务器上的 Space 上打开 —— 那些要从 Space 菜单或远程主机里有意打开。
侧边栏
侧边栏顶部是 Space 按钮:当前 Space 的名字,旁边的图标在它的服务器连接中时变成转圈,断开时变成警示标记。点它打开 Space 菜单。它下面是一个 新建会话 按钮,会在你当前所在的 Project 里加一个 Thread,旁边是通知铃铛。
再往下是 已置顶 一节(有置顶的东西时才出现),以及 工作区 标题,标题旁的 + 用来添加 Project。每个 Project 行有自己的 + 用来新建 Thread,还有一个折叠箭头可以把它的 Thread 收起来。
底部是 设置 和三个按钮:
| 按钮 | 打开什么 |
|---|---|
实时总览 | 把每个活着的 Thread 摆成卡片的 Live Overview —— 见窗口 |
远程主机 | 主机簿 —— 见远程 |
查找线程 | 命令面板里的 查找线程 列表 |
查找线程 列出所有 Space 里的所有 Thread,归在所属 Project 的名字和路径下,置顶的和最近用过的排在前面。侧边栏只显示一个 Space,也不显示已归档的 Project;这个列表两样都不限,所以它是去往任意 Thread 最快的路。已归档 Project 的 Thread 排在最后,标着 (已归档)。
Space 菜单

| 条目 | 作用 |
|---|---|
| 各个本地 Space | 把这个窗口切到那个 Space。当前的那个带勾。 |
| 服务器名,及其下的 Space | 每台 ThinkTerm Connect 服务器一个标题,注明它是否 (连接中…)、(重连中…) 或 (已断开),下面列出那台服务器上的 Space |
在此服务器新建空间 | 位于某台服务器的标题下:在那台服务器上新建一个 Space |
添加远程主机… | 打开主机编辑器,新建一台主机 |
新建空间 | 新建一个本地 Space 并切过去 |
重命名“my-space”… | 原地编辑当前 Space 的名字 |
删除“my-space” | 删除当前的本地 Space —— 见删除 |
移除“my-space” | 针对服务器上的 Space:摆脱它的三种方式 —— 见删除 |
移除其他空间 | 对其他任一 Space 做同样的事,只要它不是 Default、也没在别的窗口里打开 |
新建
Space。 新建空间 创建它、把窗口切过去,并把名字打开供编辑,让你当场命名。某台服务器标题下的 在此服务器新建空间 则把 Space 建在那台服务器上:连到那台服务器的每台设备都会看到它出现。它以一个以服务器命名的 Project 和一个 main Thread 开始。
Project。 工作区 旁边的 +。在本地 Space 里它打开系统的文件夹选择器。选中一个在本 Space 里已经是 Project 的文件夹,会打开那个 Project 而不是再加一个,如果它已归档,还会把它恢复回来。在服务器上的 Space 里没有本地文件夹可选,于是会列出 ThinkTerm 知道的那台服务器上的目录 —— 它的终端所在的位置、其他 Project 的路径,以及 ~ —— 可以输入文字筛选,也可以直接输入一个路径,比如 ~/my-project 或 /srv/app。
Thread。 侧边栏顶部的 新建会话、Project 行上的 +,或 Project 菜单里的 新建会话。它的终端在 Project 的文件夹里打开。
重命名
重命名项目…、重命名会话… 和 重命名“my-space”… 都在侧边栏里名字所在的位置原地编辑。回车保留新名字,Esc 放弃,点到别处也会保留。留空的名字不会改动任何东西。
给 Project 改名只改变侧边栏怎么称呼它,磁盘上的文件夹保持原名。
Project 菜单
右键点 Project 行:
| 条目 | 作用 |
|---|---|
重命名项目… | 原地编辑名字 |
在访达中显示 | 在文件管理器里打开这个文件夹 —— Windows 上是 在文件资源管理器中显示,Linux 上是 在文件夹中显示 |
授权文件夹访问… | 仅限 macOS。运行那个让 ThinkTerm 获得该文件夹访问权限的选择器 —— 见配置 |
新建会话 | 新建一个 Thread |
折叠 / 展开会话 | 收起或展开这个 Project 的 Thread;重启后仍然记得 |
归档项目 | 把 Project 收起来 —— 见归档 Project |
移除项目 | 删除这个 Project 及其 Thread —— 见删除 |
Thread 菜单
右键点 Thread 行。指针停在一行上时,行的右端还会出现一枚图钉和一个垃圾桶。
| 条目 | 作用 |
|---|---|
连接会话 / 断开会话 | 仅用于普通 SSH 或 Mosh 主机上的 Thread —— 见树里的 SSH 主机 |
置顶会话 / 取消置顶会话 | 把 Thread 移进或移出 已置顶 |
重命名会话… | 原地编辑名字 |
删除会话 | 删除这个 Thread,并结束其中运行的东西 —— 见删除 |
标记为未读 | 点亮这个 Thread 的圆点,直到你下次打开它 |
添加到空间 | 让这个 Thread 也出现在另一个 Space 里 —— 见Thread 引用 |
移动到空间 | 把这个 Thread 移到另一个本地 Space |
置顶
置顶的 Thread 会离开所属 Project 的列表,进入 Space 顶部的 已置顶 一节,那里汇集了这个 Space 里所有 Project 的置顶 Thread。取消置顶后,它回到自己的 Project 下面。
置顶的 Thread 不能拖动排序。已归档 Project 的置顶会保留但不显示,Project 恢复后重新出现。在服务器上的 Space 里,置顶记在服务器上,所以每台设备都看得到。
未读与状态
每个 Thread 行带着一个表示状态的标记:正在运行、需要你关注、已完成 —— 在你没看着的时候跑完了 —— 或者空闲时什么也没有。这个状态是怎么判定的,见 Agent 状态。
标记为未读 点亮一个 Thread 的圆点,提醒你回来看它。打开这个 Thread 会清掉它,同时清掉已完成标记。两者都会保存,所以重启之后还在。
侧边栏顶部的铃铛收集所有 Space 里已完成或需要关注的 Thread,每条写作 Thread — Project · Space。选中一条会切到它所在的 Space 并打开它,它也就从列表里消失。铃铛上的小圆点表示列表不为空,有新条目到来时它会闪动一下;ThinkTerm 启动时就已经在等着的条目不会闪。
Thread 引用
一个 Thread 属于一个 Space 里的一个 Project,但它也可以出现在别的 Space 里。添加到空间 列出还没有显示它的本地 Space,选一个就会在那里加一条引用。ThinkTerm Connect 服务器上的 Thread 也可以这样做,一个 Space 就是这样容纳来自几台机器的工作的。
在持有它的 Space 里,引用放在一个以该 Thread 所属 Project 命名的文件夹里。指针停在文件夹标题上会显示它来自哪台机器、哪个 Space,标题上的 + 会在那个原本的 Project 里新建一个 Thread。打开引用打开的就是那个 Thread 本身,而不是副本。
它的菜单短一些,因为引用代表那个 Thread,而不是 Thread 本身:
| 条目 | 作用 |
|---|---|
重命名会话…、标记为未读 | 作用在 Thread 本身上,无论它住在哪里 |
从此空间移除 | 移除这条引用,Thread 不受影响。行上的 × 作用相同。 |
移动到空间 | 把这条引用移到另一个 Space |
回到原空间 | 切到这个 Thread 自己的 Space,并在那里打开它 |
引用上不提供置顶和删除,因为它们会改动 Thread 本身,看上去却像只动了这一行。
引用的 Thread 所在的机器离线时,引用会留着,变暗,显示最后一次见到的名字。等那台机器重新可达、且已经没有这个 Thread 时,或者它的主机从远程主机里删除时,引用才会消失。
引用只属于这台设备。它们不会发给任何服务器,所以连到同一台服务器的另一台设备、浏览器或 TUI 都看不到。
Thread 自己那一行上的 移动到空间 是另一回事:它给 Thread 换个家。Thread 离开原来的 Project,加入目标 Space 当前所在的 Project,里面正在运行的终端随之过去,不会重启。只有本地 Thread 能移动,而且只能移到一个有本地 Project 的本地 Space;服务器上的 Thread 在那台机器上运行,只能被引用。
调整顺序
拖动 Project 行,可以在这个 Space 的 Project 之间移动它;引用文件夹也参与同一个顺序。拖动 Thread 可以在它自己的 Project 里移动 —— 不能拖进别的 Project。
在服务器上的 Space 里,Project 和 Thread 的顺序由服务器保存,每台设备共享。引用文件夹的位置和引用本身一样,只属于这台设备。
滑动切换 Space
在 macOS 上,在侧边栏上方用触控板双指横向轻扫,会切到上一个或下一个 Space,一页滑出、另一页滑入。它会跳过已在别的窗口里打开的 Space,以及服务器未连接的 Space;这些要从 Space 菜单进入。
归档 Project
归档是把一个 Project 收起来而不丢掉它。它的布局先被保存,终端随后关闭,它那一行离开侧边栏。它的 Thread、Thread 的布局和置顶都会保留。
Project 里没有东西在运行时,归档项目 立即生效。有东西在运行时,菜单项变成 归档项目…,展开后说明会关闭多少个运行中的面板(将关闭 3 个运行中的面板;布局会保留),并要求点 归档并关闭面板。关掉正在运行的程序,是归档里唯一无法撤回的部分。
一个 Space 至少保留一个未归档的 Project。归档最后一个会被拒绝,并提示 空间至少需要保留一个未归档的项目;请先恢复或新建一个。
服务器上的 Space 里的 Project 是在服务器上归档的:它在那里的会话会结束,每台设备都会看到它已归档。这需要服务器处于连接状态。
已归档的 Project 可以在三个地方找到:
设置 › 已归档列出所有 Space 里的已归档 Project,最新的在前,每条写作my-space · 3 个会话 · 今天归档。取消归档把它恢复回来。删除会变成确认删除,再点一次就永久删除这个 Project 及其 Thread。- 命令面板里的
Show Archived Workspaces会把当前 Space 的已归档 Project 变暗显示在侧边栏底部,直到你再运行一次或关闭窗口。点这样的行没有反应。右键可以选取消归档,或者永久删除…,后者说明会删掉多少个 Thread,并要求点删除项目及会话。 - 再次把同一个文件夹添加为 Project,也会把它恢复回来。
取消归档会把 Project 放回原来的位置。原先在运行的程序不会恢复:它的 Thread 按保存的布局重新打开,在保存的目录里起新的 shell。
命令面板里的 Archive Active Workspace 会立即归档你当前所在的 Project,不会先告诉你有多少个面板在运行。
删除
| 对象 | 怎么做 | 结束什么 |
|---|---|---|
| Thread | 删除会话,或行上的垃圾桶 | 其中运行的每个程序 |
| Project | 移除项目 | 它的所有 Thread,以及其中运行的一切。磁盘上的文件夹不受影响。 |
| 本地 Space | 删除“my-space” | 它的所有 Project 和 Thread,以及其中运行的一切。窗口会切到 Default;如果 Default 在别处打开着,就切到另一个空闲的 Space。 |
| 服务器上的 Space | 移除“my-space” | 取决于你的选择 —— 见下文 |
这些操作都不会请你确认。归档有运行中面板的 Project,以及删除已归档的 Project,是侧边栏里仅有的两个需要第二步操作的地方。如果你以后可能还想要回某个 Project,就归档它,而不是移除它。
有几种删除会被拒绝,而且不作提示:
- 一个 Project 的最后一个 Thread —— 请改为移除这个 Project。终端运行在另一台机器上的 Project 是例外:对于普通 SSH 或 Mosh 主机,或者服务器上的 Space 里的任何 Project,删除它的最后一个 Thread 会把这个 Project 一并移除;如果它是这个 Space 唯一的 Project,会有一个
HomeProject 顶上它的位置; - 一个 Space 里最后一个未归档的 Project;
Default,以及在别的窗口里打开着的 Space —— 菜单里根本不提供。
服务器上的 Space 有三种去掉的方式,值得分清:
| 选项 | 会发生什么 |
|---|---|
断开连接(服务器继续运行) | 这台设备不再显示这个 Space。服务器保留它,其中每个会话照常运行,其他设备也照常看到它。这台设备下次连到那台服务器时,它就回来了。 |
在服务器上删除(所有设备) | 这个 Space 从服务器上删除,从每台设备上消失。它不会结束其中正在运行的程序;下一个选项才会。 |
删除并结束远程会话 | 先结束这个 Space 在服务器上的每个会话,再在所有地方删除它。只在服务器连接着时提供。 |
对不是当前 Space 的服务器上的 Space,移除其他空间 只提供第一种,写作 断开“my-space”(服务器继续运行)。
在一个 Thread 唯一的面板里输入 exit,关掉的是它的终端,而不是这个 Thread。窗口会转到这个 Space 里你最近用过的那个 Thread,一个都不剩时则转到一个新的 Thread。
树里的 SSH 主机
从远程主机里打开一台主机会添加什么,取决于它的连接方式 —— 见远程。
普通 SSH 或 Mosh 主机会成为当前 Space 里的一个 Project,以主机命名。它的 Thread 打开时先显示一个带 连接 按钮的页面,而不是立刻连接;Mosh 主机则会马上开始连接。断开会话 结束会话但保留 Thread,连接会话 开一个新的会话。ThinkTerm 识别出这台主机运行的操作系统之后,Project 上会显示它的标志。
ThinkTerm Connect 主机会得到一个自己的 Space,第一次以主机命名,里面有一个同名的 Project 和一个 main Thread。一台服务器可以容纳多个 Space;再次连接时,会落在这台设备上次用的那个上。服务器断开期间,Space 按钮下面会出现一行 重新连接。
断开连接的远程 Space
服务器不可达时,它上面的 Space 可以看,但不能改。那些 Space、Project 和 Thread 属于服务器,这台设备上的副本不是一份可以先改、事后再合并的缓存。重命名、新建、置顶、标记未读、调整顺序、归档和删除都会被拒绝,并弹出通知:example-host 已断开。请重新连接后再试。 设置 › 已归档 也同样拒绝,提示 该工作区在已断开的服务器上,请先重新连接。
断开连接(服务器继续运行) 在断开状态下也能用,因为它只改动这台设备。
重启之后
这套结构保存在工作区数据目录里的 workspace_threads.json 中 —— 见配置。它记录了每个 Space、Project 和 Thread,以及它们的名字、顺序、置顶、未读和已完成标记,每个 Space 上次打开的是哪个 Thread,还有每个本地 Thread 的布局:标签和分屏,以及每个面板的目录、标题和字号。
能回来什么,取决于后台会话 server:
- 开着它时,本地终端从未结束。ThinkTerm 重新接上它们,程序、回滚内容,一切都和你离开时一样。
- 关着它时,退出就结束了它们。Thread 按保存的布局回来,每个面板在保存的目录里起一个新的 shell;程序和它们的回滚内容不会回来。窗口在启动时只重建它打开的那个 Thread,其余的在你打开时再重建。
服务器上的 Space 里的 Thread 不在这里保存布局。布局和会话都由服务器持有,重新连接时它们原样回来。
如果某个 Project 的文件夹打不开 —— 被移走、被删除,或者被系统拒绝访问 —— 它的 Thread 会显示一个页面说明情况,而不是悄悄把终端开在你的家目录里。
ThinkTerm 会在 workspace_threads.json 旁边保留几份副本:
- 每次启动、第一次保存之前,原来的文件变成
workspace_threads.json.bak1,更早的依次后移,直到.bak5; - 当一次保存会丢掉文件里相当大一部分内容时,以及每次启动时在会话 server 的第一次更新被应用之前,文件会被复制成一个带日期的名字,比如
workspace_threads.shrink-<日期>-<时间>.json,每种保留最新的十份; - 读不了的文件会被复制成
workspace_threads.unreadable-<时间>.json。ThinkTerm 随后在没有它的情况下启动,并且在这次会话剩下的时间里不往原文件上写任何东西,所以这次会话里做的改动不会被保存。
这些副本是用来从故障中恢复的。要把工作区搬到另一台机器,或者自己留一份,请用 设置 › 备份 —— 见配置。
