Skip to content

Repository files navigation

Taxis

中文 | English

Taxis 是 Ptyxis 的一个分支,把终端的组织方式从「一堆标签页」改成 项目 → 标签页 的两级结构。

每个项目拥有自己独立的一整套标签页。切换项目就是整套换掉,而后台项目里的终端继续运行 —— 进程、滚动缓冲、选中内容、光标位置全部原样保留。

名字取自希腊语 τάξις("排列、秩序"),呼应上游的 πτύξις("折叠")。

Taxis 截图


为什么做这个

原版 Ptyxis 的标签页是扁平的。同时开几个项目时,十几个标签页挤在一条标签栏里,只能靠标题勉强分辨。

Taxis 在左侧加了一栏项目列表。每个项目是一个互相隔离的工作区,切换是瞬时的 —— 因为后台项目的标签页视图从未被销毁,只是没有显示而已。

本文只介绍这个分支新增的部分。 终端本体的能力(容器集成、配置文件、调色板、快捷键等)请看上游文档。

新增功能

项目侧边栏

  • 左侧栏列出所有项目,每行显示项目名和标签页数量徽章
  • 项目行下方还会显示该项目的默认命令与工作目录(只显示最后一层目录名,悬停看完整值);没配的那条不占位
  • 当前项目所在的那一行有背景高亮
  • F9 开关侧边栏,标题栏也有按钮;快捷键可在 首选项 → 快捷键 → 应用程序 中修改
  • 窗口变窄时侧边栏自动变为浮层,进入全屏时自动隐藏、退出时恢复
  • 右键项目:编辑、上移、下移、删除
  • 双击项目名直接打开编辑对话框
  • 顶部 + 新建项目

侧边栏跟随终端配色

侧边栏不再使用系统 Adwaita 色,而是跟着当前标签页的调色板走:背景、分隔线、行悬停 / 选中、标题与徽章的主次文字色,都从终端的前景 / 背景色推导(公式同 Mux0 的 AppTheme.derive)。配置文件里的窗口不透明度同样作用在侧边栏上;窄窗口下的浮层侧边栏也走同一套色。

切换标签页或换调色板时侧边栏会一起更新,和右边终端区视觉上连成一体。

浅色模式同样适用:

浅色模式下 Solarized 配色的侧边栏

每个项目独占一套标签页

切换项目会整体替换标签页视图。这是本分支的核心:项目持有自己的标签页视图,即使没有窗口在显示它,里面的终端也照常运行。

一个项目同一时刻只能显示在一个窗口里。如果在第二个窗口点击一个已在别处打开的项目,Taxis 会把那个窗口提到前面,而不是把标签页抢过来 —— 因为标签页视图是个 widget,只能有一个父节点。侧边栏会用一个图标标出这类项目。

项目级默认命令

每个项目可配置一条默认命令,新建标签页时自动执行。右键项目 → 编辑(或双击项目名)打开这个对话框,默认命令和工作目录都在这里填:

在编辑项目对话框里填默认命令

填好之后,这个项目里每次新建标签页都会自动执行:

新建标签页自动执行默认命令连上远程服务器

它是输入到 shell 里的,不是 exec 替换 —— 所以命令退出后会回到正常的 shell 提示符,标签页不会关闭。适合 htop、npm run dev、claude 这类。

一次性生效,tab.respawn 不会重放。留空或纯空格视为未设置。

在 bash 5.3、zsh 5.9、fish 4.6 下都能正常注入,不会被 shell 启动时的 tcflush() 吞掉。

应用启动时的第一个标签页不会执行默认命令,之后新建的才会 —— 首个窗口走的是「显式命令优先」的构造路径。

项目级工作目录

每个项目可配置一个默认工作目录。新建标签页时,若没有可从当前标签页继承的目录,就会用它作为进程的初始 cwd —— 走 agent 的 spawn 路径,不是往 shell 里注入 cd。

同一个对话框里的第二个字段就是它,填绝对路径:

在编辑项目对话框里填工作目录

优先级(高 → 低):

  1. 外部显式指定(例如命令行带上的工作目录)
  2. 当前标签页的目录(受配置文件「保留工作目录」策略约束)
  3. 项目的默认工作目录
  4. 系统默认(一般是 home)

只影响之后新建的标签页;已经在跑的 shell 不会被改掉。留空表示未设置。

配好之后,侧边栏会在项目名下显示它的最后一层目录名:

侧边栏显示项目的默认工作目录

项目级撤销关闭标签

「撤销关闭标签」按项目分开记录。关掉一个标签、切到别的项目、再撤销,不会把它恢复到错误的项目里。

会话保存与恢复

会话格式升级到 v2,保存项目列表、每个项目的标签页,以及「哪个窗口显示哪个项目」的绑定关系。

旧的 v1 会话会自动迁移,每个旧窗口变成一个项目(不能合并成一个 —— 一个项目只能被一个窗口显示,N 个窗口指向同一个项目是无法满足的)。

迁移产生的会话带一个标记,只有它才允许创建 GSettings 里不存在的项目。普通 v2 会话不会复活你已经删除的项目。

禁用标签页拖出窗口

标签页属于项目,项目只能在一个窗口显示,所以「拖出来变成新窗口」没有一致的语义。菜单项已隐藏,拖拽也不再生效。

安装

发布版本以 Flatpak bundle 的形式发在 Releases 页,提供 x86_64 和 aarch64 两个架构。

# 只需一次:加上 Flathub 源,用来拉取 GNOME 50 运行时
flatpak remote-add --if-not-exists --user flathub \
  https://dl.flathub.org/repo/flathub.flatpakrepo

flatpak install --user ./moe.flinty.Taxis-50.2+taxis1-x86_64.flatpak
flatpak run moe.flinty.Taxis

Flatpak 容器自带 GNOME 50 运行时,宿主机的 libadwaita 有多老都不影响,所以不挑发行版。

升级需要手动下载新 bundle 再执行一次 flatpak install——本仓库没有架设 Flatpak 源, flatpak update 拿不到新版本。

为什么没有 deb / rpm / AppImage:上游在 50 周期把 libadwaita 门槛抬到了 1.8 (GNOME 49),Debian 13 和 Ubuntu 24.04 LTS 都够不着。AppImage 也解决不了这个问题—— 它的可移植下限等于构建机的 glibc 版本,为了拿到 libadwaita 1.8 就必须在很新的发行版上 构建,结果覆盖范围和原生 rpm 一样。想在这些发行版上用,只能自己按下面的步骤构建。

构建

依赖(Fedora):

sudo dnf install meson gcc gtk4-devel libadwaita-devel vte291-gtk4-devel \
  json-glib-devel glib2-devel libportal-gtk4-devel gettext desktop-file-utils \
  libappstream-glib itstool

版本下限与上游一致:glib ≥ 2.80、gtk4 ≥ 4.14、libadwaita ≥ 1.8、vte ≥ 0.79、meson ≥ 1.0。

应用标识由 meson_options.txt 里的默认值给出(app-id、gschema-id、 gschema-path),默认名称是 Taxis,所以直接构建就能和系统里已有的 Ptyxis 并存,不需要额外传参:

meson setup _build --wipe --buildtype=release --prefix=/usr/local
meson configure _build | grep -E 'app-id|gschema-(id|path)'
meson compile -C _build
sudo meson install -C _build

安装前确认配置输出中的 App ID、GSchema ID 和 GSchema path 都是 Taxis 的值。

这几个选项的默认值不要改回空值。可执行文件已经叫 taxis,一旦标识退回上游的 org.gnome.Ptyxis,装进 /usr/local 的 desktop、图标、gschema 和 D-Bus 文件就会 盖住发行版的 Ptyxis(XDG_DATA_DIRS 里 /usr/local/share 排在 /usr/share 前面), 系统的「终端」会被静默替换成本 fork。

装好后可执行文件是 taxis(不是 ptyxis),应用列表里显示为 Taxis,和系统自带的 Ptyxis 互不干扰 —— 两者可以同时安装、同时运行。

侧边的辅助进程也安装为 taxis-agent,不会覆盖同一前缀下的 ptyxis-agent。

卸载:sudo ninja -C _build uninstall

首次安装后如果点图标没反应:桌面项走 D-Bus 激活,而 /usr/local/share/dbus-1/ 这个目录在首次安装前并不存在,会话里的 dbus-broker 无从监视一个不存在的路径, 因此扫不到新装的服务文件。执行一次 dbus-send --session --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig 即可,或者直接注销重新登录。目录存在之后就不会再有这个问题。

另外,注销重登也是让 GNOME Shell 刷新应用列表名称和图标缓存的唯一可靠方式。

运行测试:

meson test -C _build

与上游的关系

Taxis 定期挑选上游的功能、错误修复和安全修复手工移植,不做整树 merge;翻译更新则 按需要重新生成。

这些改动没有也不打算向上游提 PR —— 它改变了 Ptyxis 的核心组织模型,不符合上游的设计方向。这个分支是自用的,公开出来只是方便有同样需求的人。

不在范围内、也不打算做:分屏、项目级配置文件 / 容器、标签页跨窗口拖拽、侧边栏拖拽排序、项目自定义图标或独立配色(侧边栏跟随终端调色板已做,这里指的是「每个项目自选一套颜色」)。

已知问题

  • 图标暂时沿用上游。data/icons/meson.build 会把上游的 ptyxis.svg 重命名成 <app-id>.svg 安装,内容逐字节未改。启动台里 Taxis 和系统终端的图案因此完全一样, 只能靠文字区分。正式推广前应该换成自己的图标: 在 data/icons/ 放入新的 svg,改一行 icon_prefix 即可。
  • 开发构建(-Ddevelopment=true)下,开两个以上标签页时,侧边栏和主区域顶栏的斜纹背景会出现高度差。原因是 libadwaita 按「顶栏整块」绘制斜纹:主区域的顶栏包含标题栏 + 标签栏,而侧边栏只有标题栏。正式构建没有斜纹,不受影响。

许可与致谢

GPL-3.0-or-later,与上游一致。完整条款见 COPYING。

Taxis 基于 Ptyxis,原作者 Christian Hergert。终端本体、容器集成、配置文件系统、调色板等一切核心功能都来自上游,本分支只增加了项目组织这一层。

About

A fork of Ptyxis with a projects sidebar

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages