一个极简的 macOS 启动器:Option + 空格 呼出,搜索 App 和文件, 回车打开,搜索结果可以直接拖到 Finder / 其他 App。
只做了这一件事,没有别的功能。
到 Releases 下载打包好的 Launcher.app,
解压后拖进「应用程序」即可;也可以按下面的方式自己构建。
- 可自定义全局热键(设置界面):预设组合键(⌘+空格、⌥+空格、⌃+空格…)、 双击 ⇧ Shift / ⌘ Command / ⌥ Option / ⌃ Control、或录制任意自定义组合键, 修改即时生效、自动记住
- Option + 空格 全局呼出 / 收起(默认值,类似 Raycast / Hapigo)
- 搜索 App(/Applications、/System/Applications、~/Applications、正在运行的 App), 支持中文名:系统应用会显示并匹配本地化名称(如「备忘录」「计算器」「系统设置」), 英文名也能搜
- 搜索文件(走系统 Spotlight,
mdfind;索引未建好时自动回退扫描桌面/文稿/下载等常用目录) - 文件预览缩略图:搜索结果里的图片(png/jpg/gif/webp…)直接渲染图片缩略图, 视频(mp4/mov/mkv…)自动抽取画面帧做封面;其他类型保持默认图标。 异步生成 + 内存缓存,不影响搜索速度
- 剪贴板历史:后台自动记录复制的纯文本(图片/文件等不记录,只存文字不带格式), 去重置顶、上限 200 条、JSON 持久化。呼出后连续按两下空格切换剪贴板历史页, 输入框可过滤历史;单击任意一条即复制并关闭窗口;右上角「清空」按钮可手动清空
- ↑ / ↓ 选择,回车打开(App 启动,文件用默认程序打开)
- 直接拖拽结果行到 Finder、浏览器、邮件等任意地方(等价于拖文件)
- Spotlight 风格收起/展开:呼出时只显示单行搜索框;输入文字才展开结果列表, 清空输入立刻收起
- 窗口可拖动 + 位置记忆:按住窗口任意处(含搜索框)可自由拖动; 按显示器分别记忆位置,下次呼出原位出现;换到另一台显示器(或拔掉外接屏) 时按屏幕比例自动换算呼出位置,不会跑到屏幕角落
- 点击窗口外部自动收起;菜单栏有图标可退出(无 Dock 图标)
- 展开后窗口高度固定,不会因为搜索结果变少而缩小
open Package.swift在 Xcode 里选 Launcher scheme,⌘R 运行。
./build_app.sh
open Launcher.app也可以把 Launcher.app 拖进 /Applications,并到「系统设置 → 通用 → 登录项」
里添加它,开机自启。
swift run- 按 Option + 空格(或你设置的快捷键),出现一个单行搜索框(和 Spotlight 一样)
- 直接输入关键词(支持 App 名、文件名、中文名),下方展开结果列表,回车打开第一项
- 剪贴板历史:呼出后连续按两下空格 → 切换到剪贴板历史页; 单击条目复制并关闭窗口,输入框可过滤历史,右上角「清空」可清空; 按 Esc 返回搜索页
- 上下箭头切换,回车打开选中项;清空输入框,列表自动收起
- 按住窗口任意位置(包括搜索框)可拖动窗口;位置按显示器分别记忆, 换显示器时按比例换算到新屏幕的对应位置
- 把鼠标移到结果上按住拖动,拖到 Finder 窗口即可移动/复制文件
- Esc 或点击其他地方关闭
点菜单栏放大镜图标 → 设置…。
- 下拉选择预设热键,或选「自定义组合键…」后直接按下想用的组合键(Esc 取消)
- 选「双击 ⇧/⌘/⌥/⌃」需要先点按钮授予辅助功能权限(授权一次即可)
- 选 ⌘+空格 时,请到「系统设置 → 键盘 → 键盘快捷键 → 聚焦」关闭系统 Spotlight 的 ⌘+空格,本程序才能完全接管;⌃+空格 可能和输入法切换冲突,同样可在系统设置里调整
默认是 Option + 空格。如果不想用设置界面,也可以直接改
Sources/Launcher/HotkeySettings.swift / HotKeyManager.swift 里的默认值,然后重新编译。
- 按了没反应:热键被其他软件占用(终端里运行会打印
热键注册失败)。 用设置界面换一个即可。另外某些中文输入法可能占用 Option+空格,可在 「系统设置 → 键盘 → 输入法」里检查快捷键设置。 - 选了双击 ⇧/⌘ 没反应:需要先在设置界面点「打开辅助功能权限设置…」授权, 授权后立即生效。检查方法:设置界面会显示「✅ 辅助功能权限已授予」。
- 呼出后无法输入、打字一直嘟嘟响:这是无边框窗口没拿到键盘焦点导致的,
已通过重写
canBecomeKey修复。如果你用的是旧版本,重新./build_app.sh打包并重新打开Launcher.app即可。 - 文件搜不到:首次使用如果 Spotlight 索引还没建好,只会搜索 桌面/文稿/下载/图片/音乐/影片 顶层目录。过一会儿索引建好后就全盘可搜。
- 拖拽没反应:检查是否把结果拖到了窗口外并落到 Finder/桌面等可接收 文件拖放的地方。
- 全局热键用 Carbon
RegisterEventHotKey,组合键不需要任何权限; 「双击修饰键」需要辅助功能权限(设置界面可一键授权) - 设置用 UserDefaults 持久化(suite:
com.example.launcher.settings),修改即时生效 - 窗口位置按显示器以「屏幕内比例锚点」记忆:接拔显示器、全局坐标系重排后 仍能恢复到正确位置(换屏时按比例换算,不再依赖绝对坐标)
- 应用图标由
tools/make_icon.swift矢量绘制生成(Resources/AppIcon.icns) - 文件搜索用
mdfind(Spotlight),快且无需额外权限 - 拖拽通过 NSTableView 的
pasteboardWriterForRow实现,写.fileURL到剪贴板,Finder 等原生支持 - 窗口是 borderless +
NSVisualEffectView,悬浮在所有空间之上
Launcher/
├── Package.swift # SPM 包(可直接用 Xcode 打开)
├── build_app.sh # 打包成 Launcher.app 的脚本
├── Resources/AppIcon.icns # 应用图标(tools/make_icon.swift 生成)
├── tools/make_icon.swift # 图标生成脚本(CoreGraphics 矢量绘制)
└── Sources/Launcher/
├── main.swift # 程序入口(accessory 模式,无 Dock 图标)
├── AppDelegate.swift # 生命周期、状态栏菜单、打开设置
├── HotKeyManager.swift # 全局热键(组合键 + 双击修饰键检测)
├── HotkeySettings.swift # 热键设置的读写与显示
├── SettingsWindowController.swift # 设置窗口(自定义热键 GUI)
├── SearchEngine.swift # App 枚举 + mdfind 文件搜索(支持中文名)
├── SearchField.swift # 搜索框(拦截 ↑↓ / Esc)
├── LauncherWindow.swift # 无边框窗口(可接收键盘焦点)
├── ResultCellView.swift # 结果行视图(图标+名称+路径)
├── ThumbnailProvider.swift # 图片/视频预览缩略图(QuickLook + 缓存)
└── LauncherWindowController.swift # 主窗口、列表、拖拽、打开逻辑