[AI Development Lab] 存到哪—— Linux 保存对话框"自动跳转"小工具
Tofloor
poster avatar
Deepin-12356
deepin
2026-10-19 23:39
Author

存到哪 —— Linux 保存对话框"自动跳转"小工具(仿 Listary 交互,软件纯豆包生成)

在 WPS、浏览器下载、微信等应用的"保存/另存为"对话框里,按快捷键呼出一个搜索框,输入文件夹或文件名的关键字,回车后自动把目标路径填入对话框的地址栏并跳转过去——不用再一层层点目录树。(需其对话框可以直接输入路径跳转才支持,deepin25 x86支持的较多;银河麒麟LoongArch的WPS365、360安全浏览器支持,设备种类和常用软件较少,难以测试更多)

  • 实测环境:deepin 25(X11 会话)、银河麒麟 V10 SP1(X11 会话);其它 Linux X11 桌面原理相同,欢迎反馈(统信 UOS 同为国产商用发行版、有同类安全中心,未实测,预期需与麒麟类似的执行控制白名单配置)
  • 特性:全局快捷键呼出 / 文件夹+文件搜索 / 多关键字 / 移动盘自动索引 / 可视化设置
  • 纯本地运行,不联网、不上传任何数据;deepin 安装无需 root,国产商用发行版(银河麒麟/统信等)仅安装时需一次 sudo(.desktop写系统目录供控制中心设置快捷键选择)

它解决什么问题

Linux 的保存对话框(GTK 文件选择器)在路径很深、目录很多时,要靠鼠标一层层点进去。存到哪 让保存文件回到"键盘流":

按快捷键 → 输入关键字(如"毕业论文")→ 回车
保存对话框自动跳转到 /home/xxx/Documents/毕业论文/

找到的是文件夹就直接跳文件夹;找到的是文件就跳它所在的文件夹(方便把新文件存到老文件旁边)。

它不能代替搜索,仅在保存文件时跳转到保存目录使用。

特性

  • 全局呼出:任意应用里按快捷键弹出搜索框,回车后自动把焦点还给保存对话框
  • 同时搜文件夹和文件,文件落位到其所在目录
  • 主目录全可见:索引根为用户主目录,home 下所有可见文件夹(Downloads、文档、自建目录等)都能搜到;隐藏目录/隐藏文件(.开头的)不索引、不显示
  • 多关键字搜索:空格分隔多个词,全部命中才显示(如"论文 2025")
  • SQLite 增量索引:只写增删差集,无变化不写盘;索引默认在启动时和每次呼出时刷新(不再后台定时扫盘,省资源;想要定时重扫可在设置里改间隔)
  • 可选仅索引文件夹(默认开启):默认只搜文件夹(同时「文件索引深度」自动置灰),文件夹层级远比文件稳定,索引增删写盘大幅减少,保存定位场景通常够用;需要搜文件时在设置里取消勾选即可
  • 移动盘/挂载盘自动索引:插入/挂载移动硬盘自动建索引,拔出/卸载自动删除该盘索引(可单独开关);持久挂载白名单可把挂载点声明为「常驻数据盘」(如第二硬盘/长期外置盘,区别于临时 U 盘):始终索引、拔走/关机卸载不删索引,且不受「启用挂载索引」「自动跟随挂载/卸载」两个开关影响(关闭全量挂载索引时,白名单盘是唯一仍被索引的挂载点)
  • 自动跳转:选中结果回车后,程序自动把路径写入剪贴板 → 模拟 Ctrl+L 调出地址栏 → Ctrl+A 全选 → Ctrl+V 粘贴 → 回车,一气呵成(无需手动操作地址栏);对不响应 Ctrl+L 的对话框(如 WPS)自动补发 Alt+N 兼容,全程自动
  • 剪贴板智能恢复:跳转前复制过的文本或文件(uri-list),跳转后约 1 秒自动恢复,不覆盖跳转后你新复制的内容
  • 托盘常驻:呼出搜索 / 重建索引 / 设置 / 退出;托盘图标为自绘"红色弧线箭头+文件夹"标识,区别于系统文件夹图标,不易误点
  • 无日志、无联网、纯本地:索引只记录文件名/路径字符串,不读文件内容
  • 安装规范:程序本体全部装在用户目录(~/.local/share/savejump/),不污染系统目录;仅在国产商用发行版(麒麟/统信等)上为控制中心快捷键额外写一个系统目录 .desktop(安装脚本自动完成,需一次 sudo 密码)

环境要求

项目 要求
系统 已实测:deepin 25、银河麒麟 V10 SP1;其它 Linux X11 桌面原理相同
会话 仅支持 X11。deepin 25 登录界面请选 X11,不要选 Treeland/Wayland;银河麒麟/统信 UOS 请确认使用 X11 会话
依赖(安装脚本自动装) python3-pyqt6(或 pyqt5)、xdotool、xclip、python3-pyperclip

关于国产商用发行版(银河麒麟 / 统信 UOS 等)

不是只有银河麒麟 V10 SP1 适用。 安装脚本通过检测 /etc/kylin-release、/etc/os-release(含 kylin / uos / uniontech)或 /etc/os-version 来判断国产商用发行版(银河麒麟、统信 UOS 等)——这类系统的控制中心/安全中心对第三方程序管控更严,检测到后自动走商用适配流程(快捷键项写入系统目录、Name 显示文件名、无中文名,适配控制中心按文件名选择)。deepin 及普通发行版则走用户目录流程,无需任何系统目录写入。

但请注意(麒麟/统信均为 X11 已实测或预期,具体如下):

  1. 本工具仅支持 X11 会话。若麒麟 V11、统信 UOS 新版默认或改用 Wayland 会话,则不可用,请先切换为 X11 会话再安装;
  2. 银河麒麟 V10 SP1 已实测(安全中心 KYSEC 执行控制白名单流程见下文);统信 UOS 未实测——UOS 同为国产商用发行版、有同类安全中心(应用执行控制类模块),预期需做与麒麟相同的白名单配置,具体入口名称以对应版本实际界面为准,欢迎实测反馈。

安装

解压后,在目录里右键打开终端执行(二选一):

chmod +x install.sh    # 先赋予执行权限(.sh 脚本需先赋予执行权限)
./install.sh

或

bash install.sh        # bash 方式运行无需执行权限

脚本自动完成:清理旧版本 → 检查/安装依赖 → 安装程序文件 → 设置开机自启 → 后台启动。程序全部装在用户目录(~/.local/share/savejump/),不污染系统目录;仅在国产商用发行版(麒麟/统信等)上为控制中心快捷键额外写一个系统目录 desktop(脚本自动完成,需一次 sudo 密码)。

安装后启动器里只有一个图标 「存到哪 快速呼出」(主程序静默自启,不占图标、桌面无图标)。

使用

  1. 设置全局快捷键(不同发行版入口不同):
    • deepin(X11):系统设置 → 蓝牙和设备→键盘→快捷键 → 添加快捷键→名称随意,命令点右侧三个点选择「存到哪 快速呼出」(~/.local/share/applications/savejump-toggle.desktop,可能显示的是中文名“存到哪 快速呼出”),快捷键根据自己习惯设置,只要系统支持且不冲突就行,例如设为 Super+Z 或 Alt+G。
    • 银河麒麟(V10 SP1 已实测,V11、统信 UOS 等流程应该类似):
      1. 安装时若安全中心拦截,可先到 安全中心→应用保护 临时关闭「应用来源检查」「应用访问权限控制」再装,装完可恢复;
      2. 安装后必须:安全中心→应用保护→应用程序执行控制→高级设置,右上角"加号"把 ~/.local/share/savejump/savejump.py 和 ~/.local/share/savejump/savejump-toggle.sh 加入白名单——否则即使弹窗点"始终允许"也不持久(KYSEC 按程序签名判断,本程序无签名,主程序开机自启后是新进程会被再次拦截,导致无法常驻、快捷键呼不出)。加入执行控制白名单是按路径持久放行,属商用发行版对未签名第三方程序的常规管控,不是程序本身的问题(统信 UOS 预期同类操作,具体入口名称以实际界面为准);
      3. 注销重登 → 设置 → 快捷键 → + ,程序选择 savejump-toggle.desktop(install.sh 已自动将该.desktop写入系统目录file:///usr/share/applications并清理用户目录同名项),名称随意,设置按键即可。
  2. 打开任意应用的"保存/另存为"对话框。
  3. 按快捷键呼出搜索框,输入关键字。
  4. 鼠标或方向键选择结果,回车自动跳转;Esc 关闭搜索框不跳转。

技巧:

  • 多关键字用空格分隔(AND 关系);
  • 搜文件时跳转的是文件所在文件夹;
  • 移动盘插入后,盘内文件自动可搜,搜盘名可直接跳盘根。

国产商用发行版(银河麒麟/统信 UOS 等)系统使用指引(重要)

  • 安装前建议:安全中心 → 应用保护 → 暂时关闭「应用来源检查」与「应用访问权限控制」,安装完成后再恢复开启(避免安装/自启阶段被安全中心拦截)。
  • 恢复防护后快捷键呼出被拦的解决(按路径持久信任,无需关闭防护,重装后要搜索到原来的删掉重新添加):
    安全中心 → 应用保护 → 应用程序执行控制 → 高级设置 → 右上角加号,添加:
    • ~/.local/share/savejump/savejump.py
    • ~/.local/share/savejump/savejump-toggle.sh
      添加后注销重登生效。
  • 原因说明(避免误解):这是银河麒麟安全中心(KYSEC,统信 UOS 同类)对未签名第三方程序的常规管控,不是本软件缺陷;「始终允许」只放行当次执行,主程序开机自启后是新进程会被重新拦截,所以表现为"允许了还是呼不出";添加白名单 = 按路径持久信任,重启后依然有效,系统其它防护不受影响。deepin 无需任何安全中心操作。
  • 其它麒麟版本 / 统信 UOS:同一套流程,仅安全中心入口名称可能不同(见上文"关于国产商用发行版")。

设置(托盘 → 设置)

设置项 说明
排除目录 每行一个完整路径,这些目录不被索引
文件索引上限 100~500000,默认 60000
文件索引深度 1~30 层,默认 6
目录索引深度 1~50 层,默认 8
索引范围 「仅索引文件夹」默认开启(只搜文件夹,索引增删大幅减少;勾选后文件索引深度自动置灰);取消勾选可恢复搜索文件
移动盘/挂载盘索引 三个开关:启用 /media 与 /mnt 全量索引、临时盘自动挂载建/卸载删(联动置灰)、持久挂载白名单(把挂载点声明为「常驻数据盘」:始终索引、拔走/关机卸载不删索引,不受两个挂载开关影响;关闭全量挂载索引时仅白名单盘被索引)
后台重扫间隔 0=仅启动和呼出时扫描(默认,最省资源);>0 最小 5 秒(低于 5 秒会自动提到 5 秒,避免持续扫描占 CPU/频繁写盘),最大 86400 秒

为什么不直接复用系统全局搜索的索引

有人会问:deepin/麒麟自带的全局搜索(dde-grand-search)已有索引,为什么不直接读它?

  • 系统全局搜索不维护可直接读取的索引库:它按需调用后台服务(dde-daemon 的 SearchService),用户目录里只有搜索结果缓存(~/.cache/dde-grand-search/last-results.json),没有可供第三方读取的索引文件;索引格式是内部私有实现,无公开读取接口。
  • 覆盖范围对不上:官方明确全局搜索仅支持搜索 /home 目录下的文件,不覆盖 /media、/mnt(自动挂载的第二硬盘、U 盘)——而这恰是本工具要支持的移动盘/挂载盘场景。
  • 双发行版实现不同:deepin 25 与麒麟 V10 SP1 的全局搜索实现不同,逐一适配维护成本高、兼容风险大。

因此本工具使用自建 SQLite 增量索引,并通过「仅索引文件夹」选项大幅减少索引增删写盘,兼顾资源占用与可靠性。

已知问题 / 限制(重要)

  1. 部分对话框不支持(无法自动定位地址栏,属对话框自身限制)——例如银河麒麟微信另存为等多个软件对话框地址栏不支持输入路径,所以不支持。实测deepin25系统X11模式下 WPS/微信/notepad--/deepin 编辑器/龙芯浏览器均正常,银河麒麟V10SP1系统X11下WPS365保存、另存为,360安全浏览器正常。
  2. 仅支持 X11 会话。Wayland/Treeland 下窗口无法强制置顶,属于合成器限制,本工具不做适配。
  3. 索引有深度和条数上限(可调);挂载点自动识别 /media、/mnt、/run/media 下的真实挂载(含 /media/用户名/卷标 这类二级挂载)。
  4. 自动跳转依赖 xdotool 模拟按键,个别反作弊类窗口可能拦截。

尝试过但最终未实现的方案

以下方案在开发中尝试过、评估过,最终确认不可行或代价过高而放弃,特此说明,避免大家再走弯路:

  1. 保存对话框"自动出现"(无需快捷键,像 Listary 原生那样检测到保存窗口就自动弹出):Linux 下没有统一、可靠的"当前是否打开保存对话框"识别机制——GTK/Qt 对话框窗口属性各异、不同桌面实现不同,误判率太高(无法区分普通窗口与保存框)。最终采用全局快捷键呼出方案,稳定可靠。
  2. Wayland / Treeland 支持:曾尝试用 ydotool / wl-clipboard / layer-shell 等方案适配 Wayland,但合成器限制窗口强制置顶,deepin 25 的 Treeland 下测试出现闪退、窗口闪到最底层等问题,无法稳定工作。最终回归纯 X11 方案,这也是本工具只支持 X11 的原因。
  3. 复用系统全局搜索(dde-grand-search)的索引:调研确认系统不维护可被第三方读取的索引库(详见上文专节),放弃复用,改为自建 SQLite 增量索引。
  4. 跳转后立即恢复剪贴板:曾在跳转完成后立即把用户原剪贴板写回,但 deepin 的 X11 剪贴板跨进程响应窗口较长,立即恢复会让保存对话框读到的还是旧内容(表现为"粘贴的是上次复制的东西")。最终改为延迟约 1 秒恢复 + 智能判断(剪贴板仍是路径才恢复、用户新复制内容不被覆盖),实测 WPS / notepad-- / 龙芯浏览器等全部正常。

隐私与合规说明

  • 完全本地运行,不联网、不上传任何文件、路径或统计信息;
  • 写盘操作仅三类:程序文件(安装时)、索引数据库(~/.config/savejump/index.db,只存路径字符串)、配置文件;
  • 本地通信仅用 /tmp/savejump.sock(同机单用户);首次运行若缺 python3-pyperclip 会尝试静默自动安装(无 sudo 权限则跳过,自动回退 xclip)。

许可与合规(豆包自查后生成)

  • 代码原创:本工具代码从零编写,无第三方代码片段;图标为自绘(托盘/启动器为"红色弧线箭头+文件夹",文件类型图标为自绘 PNG),不涉及侵权;交互概念借鉴 Listary(Windows 商业软件)的"保存对话框快捷定位"思路,无任何代码来自它。
  • 许可:GPLv3。本程序依赖 PyQt6/PyQt5(GPLv3 许可),按 GPL 传染性,本程序以 GNU General Public License v3.0 或更新版本发布(详见包内 LICENSE 文件)。可自由使用、修改、分发,衍生作品须同样以 GPLv3 发布并保留许可声明。
  • 运行时依赖(均为系统开源库/工具,按常规方式调用,不嵌入其代码):
    • PyQt6 / PyQt5:GPLv3(GUI 框架,本程序的许可由此决定);
    • xdotool / xclip:GPL,作为独立进程通过命令行调用,不构成链接,GPL 不传染到本程序代码;
    • pyperclip:BSD 许可。
  • 完全本地运行,不联网、不上传任何数据

卸载 / 清理

bash uninstall.sh      # 标准卸载(含旧版目录、图标与系统目录 desktop 项)

卸载不删 ~/.config/savejump(索引/配置),重装后索引仍在。

截图
截图_savejump.py_20261019233558.png

截图_savejump.py_20261019233752.png

(上图仅截取了呼出的搜索框)

下载链接:存到哪v1.5.zip

Reply Favorite View the author
All Replies
avatar
Deepin-12356
deepin
3 hours ago
#1

V1.6更新:

  • 设置界面底部确认、取消按钮汉化,左侧新增版本号;
  • 去除托盘图标Tooltip版本号。

用户级安装版(就是V1.5的时候那种):存到哪_v1.6_用户级安装版.zip

补个可编译源码(里面有打包说明):存到哪_v1.6可编译源码.zip

已编译的.deb包:savejump_1.6_all.zip

重要提示:安装了用户级安装版的用户改安装.deb版要先进入解压缩后的用户级安装版目录右键打开终端再通过 bash uninstall.sh命令卸载再安装,安装了.deb版本的如想改安装用户级安装版也要先卸载 .deb版本。

项目 用户安装版(install.sh) .deb 安装包
安装位置 ~/.local/share/savejump/(用户目录) /usr/share/savejump/+/usr/bin/savejump(系统目录)
安装权限 无需 root(deepin);仅麒麟写系统 desktop 时提示一次 sudo 必须 root(sudo dpkg -i或双击)
安装方式 ./install.sh sudo dpkg -i/ 软件中心双击
依赖处理 脚本自动检查 / 补装 dpkg 按 control 依赖管理,缺依赖 sudo apt -f install -y
卸载 bash uninstall.sh(先进入用户安装版目录) sudo dpkg -r savejump(dpkg 统一管理)
更新 覆盖 savejump.py 或重跑 install.sh 装新版 deb 直接覆盖
开机自启 当前用户 ~/.config/autostart/ postinst 遍历所有普通用户写自启
快捷键项 deepin 用户目录 / 麒麟系统目录(sudo 写) 统一 /usr/share/applications/,麒麟 postinst 自动改 Name
麒麟安全中心 白名单路径指向 ~/.local/share/savejump/… 白名单路径指向 /usr/share/savejump/…
系统集成 不入 dpkg 数据库,纯用户级 入 dpkg 数据库,软件中心可见、可统一管理
适合场景 个人单机、不想动系统目录 批量部署、离线安装包、公司统一分发
Reply View the author