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(已被占用),在那个窗口离开它或关闭之前无法选中。
Library 一次显示所有 Space,也遵守同一条规矩:别的窗口已经打开的 Space,它的卡片打不开,它的菜单里也只写着已被占用。
新窗口会取你上次用过的本地 Space(只要没有别的窗口占着),否则取第一个空闲的本地 Space,再不行就新建一个。它从不在一个住在服务器上的 Space 上打开 —— 那些要从 Space 菜单或远程主机里有意打开。
侧边栏
侧边栏顶部是 Space 按钮:当前 Space 的名字,旁边的图标在它的服务器连接中时变成转圈,断开时变成警示标记。这里的服务器,对住在 ThinkTerm Connect 服务器上的 Space 就是那台服务器;对本地 Space,则是开着时的后台会话 server。点它打开 Space 菜单。它下面是一个 新建会话 按钮,会在你当前所在的 Project 里加一个 Thread,旁边是通知铃铛。新建会话 和两个侧边栏的显示、隐藏按钮,也都是可以绑定到按键上的动作 —— 见键盘。
再往下是 已置顶 一节(有置顶的东西时才出现),以及 工作区 标题,标题旁的 + 用来添加 Project。每个 Project 行有自己的 + 用来新建 Thread,还有一个折叠箭头可以把它的 Thread 收起来。分享打开时,列表最后还有一节 分享给我,列出别的账户分享给你的终端。
底部是四个按钮。设置不在其中:它是 Library 里的一个按钮,设置… 也在命令面板里。
| 按钮 | 打开什么 |
|---|---|
ThinkTerm Library | 每个 Space 一张卡片、按机器分组,取代侧边栏 —— 见窗口 |
实时总览 | 把每个活着的 Thread 摆成卡片的 Live Overview —— 见窗口 |
远程主机 | 主机簿 —— 见远程 |
查找线程 | 命令面板里的 查找线程 列表;macOS 上是 ⌘P |
查找线程 列出所有 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 菜单 | 服务器的工作显示在哪里 |
|---|---|---|
全部展开(默认) | 每台服务器的 Space 全部列在服务器名下,如上表 | 服务器自己的 Space 里 |
每台一行 | 每台服务器一行。只有一个 Space 的服务器,从这一行直接切过去;有好几个的,在子菜单里列出,后面跟着 在此服务器新建空间。窗口所在的那台服务器保持展开,所以在它的 Space 之间移动只需点一下。在服务器上新建空间 一项把每台服务器各列一行,用来在其中任何一台上新建 Space。已连接的服务器排在前面,其次是正在连接或重连的,最后是其余的 | 服务器自己的 Space 里 |
文件夹 | 只列这台电脑的 Space。窗口所在的那个服务器 Space,在它打开期间仍然列着,带勾 | 作为这台电脑某个 Space 里的文件夹,就像 Thread 引用 |
选 文件夹 时,从某个 Space 连接服务器,会把这台服务器的 Project 作为文件夹显示在那个 Space 里;从别的 Space 再连一次,文件夹就搬到那边。它们跟着服务器走:这些行上没有 从此空间移除 或 移动到空间,服务器在那里显示多久,它们就留多久。服务器自己的 Space 不会出现在菜单里,也不会出现在 Library 里,滑动切换也会跳过它们。
菜单里服务器的各行,带着在远程主机的 图标 栏里给这台主机选的图标:服务器、云、地球、笔记本电脑、Mac mini、台式机、单板机 或 容器。
新建
Space。 新建空间 创建它、把窗口切过去,并把名字打开供编辑,让你当场命名。某台服务器标题下的 在此服务器新建空间 则把 Space 建在那台服务器上:连到那台服务器的每台设备都会看到它出现。它以一个以服务器命名的 Project 和一个 main Thread 开始。
Project。 工作区 旁边的 +。在本地 Space 里它打开系统的文件夹选择器。选中一个在本 Space 里已经是 Project 的文件夹,会打开那个 Project 而不是再加一个,如果它已归档,还会把它恢复回来。在服务器上的 Space 里没有本地文件夹可选,于是会列出 ThinkTerm 知道的那台服务器上的目录 —— 它的终端所在的位置、其他 Project 的路径,以及 ~ —— 可以输入文字筛选,也可以直接输入一个路径,比如 ~/my-project 或 /srv/app。
Thread。 侧边栏顶部的 新建会话、Project 行上的 +,或 Project 菜单里的 新建会话。它的终端在 Project 的文件夹里打开。
导入。 设置 › 导入 也可以替你填充 Space。导入的 Herdr 会话会成为一个新 Space;代码编辑器里打开过的文件夹,会成为你所选 Space 里的 Project,每个带一个 Thread。见配置。
重命名
重命名项目…、重命名会话… 和 重命名“my-space”… 都在侧边栏里名字所在的位置原地编辑。回车保留新名字,Esc 放弃,点到别处也会保留。留空的名字不会改动任何东西。
给 Project 改名只改变侧边栏怎么称呼它,磁盘上的文件夹保持原名。
Project 菜单
右键点 Project 行:
| 条目 | 作用 |
|---|---|
重命名项目… | 原地编辑名字 |
在访达中显示 | 在文件管理器里打开这个文件夹 —— Windows 上是 在文件资源管理器中显示,Linux 上是 在文件夹中显示 |
授权文件夹访问… | 仅限 macOS。运行那个让 ThinkTerm 获得该文件夹访问权限的选择器 —— 见配置 |
新建会话 | 新建一个 Thread |
折叠 / 展开会话 | 收起或展开这个 Project 的 Thread;重启后仍然记得 |
归档项目 | 把 Project 收起来 —— 见归档 Project |
移除项目 | 删除这个 Project 及其 Thread —— 见删除 |
Thread 菜单
右键点 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 启动时就已经在等着的条目不会闪。在 macOS 上,程序坞图标可以用一个数字显示这份列表里有几个 Thread。
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。被拖动的行会跟着指针走,保持你抓住它的位置,周围的行让开,显示它会落在哪里;松手时它落进位置。Thread 引用只能在它自己的文件夹里移动,拖到别的文件夹上会取消。把 Thread 整个拖出侧边栏,会在它自己的窗口里打开 —— 见独占一个窗口的 Thread。
在服务器上的 Space 里,Project 和 Thread 的顺序由服务器保存,每台设备共享。引用文件夹的位置和引用本身一样,只属于这台设备。
滑动切换 Space
在 macOS 上,在侧边栏上方用触控板双指横向轻扫,会切到上一个或下一个 Space,一页滑出、另一页滑入。它会跳过已在别的窗口里打开的 Space,以及服务器未连接的 Space;这些要从 Space 菜单进入。越过第一个 Space、朝本该有上一个 Space 的方向继续轻扫,会随着手指带出 Library,松手时按你滑了多远、多快,决定它是留开还是收回。Library 打开时,在卡片之外的面板上起手、朝终端方向轻扫,就把它收回去。
Previous Space 和 Next 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 在与后台会话 server 的连接丢失时,也会出现同样的一行。
给 ThinkTerm Connect 主机改名,或把它换到另一个网络,不会让它的 Space 落下。它们会转到主机的新名字下,下次连接就能在那里找到。旧连接如果还连着,它们就留在旧名字那边,直到它结束。
服务器上没有 ThinkTerm 的 Connect 主机,在你连接时会问要不要装上;见主机需要什么。如果你是从远程主机页面发起的连接并选了不装,这一次这台主机会作为普通 SSH 的 Thread 打开,和上面说的一样,只是立刻开始连接。
断开连接的远程 Space
服务器不可达时,它上面的 Space 可以看,但不能改。那些 Space、Project 和 Thread 属于服务器,这台设备上的副本不是一份可以先改、事后再合并的缓存。重命名、新建、置顶、标记未读、调整顺序、归档和删除都会被拒绝,并弹出通知:example-host 已断开。请重新连接后再试。 设置 › 已归档 也同样拒绝,提示 该工作区在已断开的服务器上,请先重新连接。
断开连接(服务器继续运行) 在断开状态下也能用,因为它只改动这台设备。
重启之后
这套结构保存在工作区数据目录里的 workspace_threads.json 中 —— 见配置。它记录了每个 Space、Project 和 Thread,以及它们的名字、顺序、置顶、未读和已完成标记,每个 Space 上次打开的是哪个 Thread,还有每个本地 Thread 的布局:标签和分屏,以及每个面板的目录、标题和字号。
能回来什么,取决于后台会话 server:
- 开着它时,本地终端从未结束。ThinkTerm 重新接上它们,程序、回滚内容,一切都和你离开时一样。每个 Thread 回来时停在它上次聚焦的标签上,而不是第一个。
- 关着它时,退出就结束了它们。Thread 按保存的布局回来,每个面板在保存的目录里起一个新的 shell;程序不会回来。窗口在启动时只重建它打开的那个 Thread,其余的在你打开时再重建。每个面板里显示过的内容仍然可能回来,见下文。
设置 › 通用 › 重新打开时恢复窗格内容 在桌面端默认开启。ThinkTerm 带着它的终端退出、电脑关机或注销、或者会话 server 被停止时,它会保存每个本地面板的屏幕和回滚内容,其中看起来像密码、令牌或私钥的部分在写入之前就已遮掉,并在恢复 Thread 的布局时,把它们放回新 shell 的上方。崩溃或断电来不及保存,全屏程序的画面和图片也不保存。没人重新打开的记录 15 天后清掉。远程主机在你于其上运行 thinkterm cli restore-output on 之前什么也不保存;关掉这个设置会删除已保存的内容。
服务器上的 Space 里的 Thread 不在这里保存布局。布局和会话都由服务器持有,重新连接时它们原样回来,每个 Thread 停在它上次聚焦的标签上。
如果某个 Project 的文件夹打不开 —— 被移走、被删除,或者被系统拒绝访问 —— 它的 Thread 会显示一个页面说明情况,而不是悄悄把终端开在你的家目录里。
ThinkTerm 会在 workspace_threads.json 旁边保留几份副本:
- 每次启动、第一次保存之前,原来的文件变成
workspace_threads.json.bak1,更早的依次后移,直到.bak5; - 当一次保存会丢掉文件里相当大一部分内容时,以及每次启动时在会话 server 的第一次更新被应用之前,文件会被复制成一个带日期的名字,比如
workspace_threads.shrink-<日期>-<时间>.json,每种保留最新的十份; - 读不了的文件会被复制成
workspace_threads.unreadable-<时间>.json。ThinkTerm 随后在没有它的情况下启动,并且在这次会话剩下的时间里不往原文件上写任何东西,所以这次会话里做的改动不会被保存。
这些副本是用来从故障中恢复的。要把工作区搬到另一台机器,或者自己留一份,请用 设置 › 备份 —— 见配置。
