目标与现状
在 Dolphin 工具栏上加两个按钮,都可自动装、自动卸,互不干扰:
- 按钮一「在此打开终端」:点击后在当前文件夹打开终端,并自动
activate py313。 - 按钮二「在此运行 Jupyter Lab」:点击后在当前文件夹用
ju314环境跑 Jupyter Lab(自动打开浏览器页签)。
现状:两个按钮已落地并实测通过(Dolphin 26.04.3 / Plasma 6.6.6 / KIO 6.26.0)。Jupyter 的结束方式已从「后台进程、要另外去杀」改成「在终端里前台跑、Ctrl+C 即结束」,与 Windows 下的习惯一致。
前置事实(实测)
| 项 | 实测值 |
|---|---|
| Dolphin / KDE 版本 | Dolphin 26.04.3;Plasma 6.6.6;KIO 6.26.0;KF 6.26 |
| 工具栏配置文件 | ~/.local/share/kxmlgui5/dolphin/dolphinui.rc,目标在 <ToolBar> 段;只在 Dolphin 启动时读取 |
| 内置动作 open_terminal 的实现 | KTerminalLauncherJob 读配置 [General] TerminalApplication(为空则回退 konsole),并把「当前文件夹」设为子进程的工作目录 |
| 内置动作 open_preferred_search_tool 的实现 | 写死按 desktop 名 org.kde.kfind 查服务,并把当前目录当 %f 传给它 |
| Dolphin 读的是哪个配置文件 | KSharedConfig::openConfig() 无参数时取 mainConfigName() = 应用自身配置,即 dolphinrc(不是 kdeglobals) |
| Jupyter 环境 | /s500data/envs/ju314/bin/jupyter(JupyterLab 4.5.11 / Python 3.14) |
| py313 环境与激活方式 | /s500data/envs/py313;激活靠 shell 函数 activate(/etc/nixos/scripts/activate.sh,由 ~/.bashrc 引入) |
| 脚本与运行体位置 | /s500data/softnixos/nixos/ |
实现过程
为什么不用右键菜单(service menu)挂工具栏
KIO 6.26.0 的 KFileItemActions::slotExecuteService 只在「右键菜单」触发时才写入 m_props(当前选中项);从工具栏或快捷键触发时 m_props 为空、直接 return,而且 %f 也被丢弃(实测日志里 argc=0)。所以 service menu 挂上工具栏后点了没反应。两个按钮因此都改用 Dolphin 的内置动作:它们一定能进「配置工具栏」,并且天然带当前目录。
终端按钮
运行体 dolphin_工具栏按钮_在此打开终端.sh:以 $PWD 为目录起 konsole --workdir,并用 --init-file 生成一个启动脚本,交互式 shell 起来时先 source ~/.bashrc 与 /etc/nixos/scripts/activate.sh,再执行 activate py313。
接线:把 dolphinrc 的 [General] TerminalApplication 指向该运行体(作用域仅 Dolphin)。Dolphin 触发 open_terminal 时不给参数,而是把当前文件夹设成运行体的工作目录,所以运行体用 $PWD 即可拿到目录。
Jupyter 按钮
运行体 dolphin_工具栏按钮_在此打开jupyter.sh:在一个 konsole 窗口里跑 /s500data/envs/ju314/bin/jupyter lab --notebook-dir=$PWD。接线借内置动作 open_preferred_search_tool:它按 org.kde.kfind 查服务并把当前目录传进去;本机没装真 kfind,于是放一个同名钩子 ~/.local/share/applications/org.kde.kfind.desktop,其 Exec 指向运行体 %f。
结束方式:在那个终端窗口里按 Ctrl+C,或直接关掉该窗口;只关浏览器页签不会停服务。启动失败时窗口会留着显示原因,按回车关闭。
装 / 卸脚本
两个 installer 各管各的按钮,互不触碰:
dolphin_工具栏按钮_再次打开终端.sh:把运行体路径写进dolphinrc,并往工具栏<ToolBar>段加<Action name="open_terminal"/>;remove时还原(旧值先存terminal-application.prev)。dolphin_工具栏按钮_再次打开jupyter.sh:确保钩子 + 图标 + 工具栏条目<Action name="open_preferred_search_tool"/>;remove时只删自己造的钩子和这一条。
共同点:幂等(已到位就什么都不做);改配置前先把 Dolphin 停掉(否则它退出时会把配置写回去、覆盖改动),停过就一定再把它拉起来;--dry-run 只看不动。
实测证据
| 验证项 | 结果 |
|---|---|
D-Bus 触发 open_terminal(等于点按钮) | launch.log 记录 2026-10-13 15:23:16 | terminal | argc=0 arg1=[] cwd=[/etc/nixos/modules/system/mount] -> dir=[/etc/nixos/modules/system/mount] → 当前目录确实传到运行体 |
| py313 是否真的激活 | 用 pty 跑运行体生成的 init 文件:VIRTUAL_ENV=[/s500data/envs/py313]、python3=/s500data/envs/py313/bin/python3 |
| 终端脚本 status | 工具栏:已在 ✅;dolphinrc TerminalApplication = /s500data/softnixos/nixos/dolphin_工具栏按钮_在此打开终端.sh |
| Jupyter 脚本 status | 工具栏:已在 ✅;钩子在;/s500data/envs/ju314/bin/jupyter 在 |
| install 幂等 | 输出「已是最新(工具栏条目 + dolphinrc 都在),不折腾 Dolphin」 |
| remove --dry-run | 打印「会还原 dolphinrc TerminalApplication / 会删 <Action …>」,未动文件、未动 Dolphin |
管理命令
| 用途 | 命令 |
|---|---|
| 看状态 | bash /s500data/softnixos/nixos/dolphin_工具栏按钮_再次打开终端.sh status(Jupyter 同理换文件名) |
| 装(幂等) | bash …/dolphin_工具栏按钮_再次打开终端.sh |
| 卸(只卸自己那条 + 自己造的钩子) | bash …/dolphin_工具栏按钮_再次打开终端.sh remove |
| 先看要改什么 | 上面任一条后面加 --dry-run |
| 结束一个 Jupyter | 在它那个终端窗口按 Ctrl+C;或 /s500data/envs/ju314/bin/jupyter server list 看端口后 … jupyter server stop <端口> |
| 换终端里激活的环境 | 改运行体顶部的 ENV_NAME=py313 |
| 让改动生效 | 两个 installer 会自动停/起 Dolphin;手动改配置后必须重启 Dolphin(工具栏配置与 TerminalApplication 都只在启动时读) |
踩坑记录
| 现象 | 成因 | 怎么改 |
|---|---|---|
| 按钮点了没反应(service menu 版本) | 工具栏触发时 m_props 为空、%f 被丢弃 | 改用内置动作 open_terminal / open_preferred_search_tool |
| 把 TerminalApplication 写进 kdeglobals 无效 | openConfig() 无参数读的是应用自身配置 dolphinrc | 写 dolphinrc [General] |
| 改完 dolphinrc 没效果、或被改回去 | Dolphin 只在启动时读该键,且它运行时退出会把配置写回 | 先停 Dolphin 再改、改完再启动(installer 已内置这个顺序) |
| 点「配置工具栏」像没反应 | 对话框可能开在别的显示器或被窗口挡住(实测用 D-Bus 调 configureToolbars 确实弹出) | 看窗口列表 / 换显示器找它 |
边界
- Jupyter 按钮的钩子占用了
org.kde.kfind这个名字(本机无真 kfind);日后要装真 kfind,先跑一次remove。 - 配置改动只在 Dolphin 重启后生效(installer 会自己停/起 Dolphin)。
- 本笔记只记 max2-nixos 这台机器上的落地情况;实际点击两个按钮仍需人工验收。