如何从浏览器打开本地文件到Emacs?解决macOS URI跳转异常
解决macOS下Firefox无法通过emacs://链接打开文件的问题
1. 补全URI Scheme注册配置
Firefox对URI协议的校验比终端open命令更严格,得确保包装应用的Info.plist配置完全合规:
- 打开你制作的包装应用的
Contents/Info.plist,确认包含以下关键配置:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>Emacs URI Handler</string> <key>CFBundleURLSchemes</key> <array> <string>emacs</string> </array> </dict> </array> <key>CFBundleIdentifier</key> <string>com.yourid.emacshandler</string> <!-- 用唯一的标识符,别和其他应用重复 --> - 保存后重新注册应用:
open -a /Applications/你的Emacs包装应用名.app,然后重启Firefox。
2. 修复包装应用的执行脚本
Firefox传递URI参数的逻辑和终端open有差异,得确保脚本能正确解析路径并调用emacsclient:
- 打开包装应用
Contents/MacOS/下的执行脚本,替换成以下内容:#!/bin/bash # 剥离emacs://前缀,提取文件路径 RAW_PATH="${1#emacs://}" # 解码URL编码的特殊字符(比如空格会变成%20) FILE_PATH=$(echo "$RAW_PATH" | python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.stdin.read()))") # 检查是否有运行的Emacs实例 if emacsclient -e "(server-running-p)" > /dev/null 2>&1; then emacsclient -n "$FILE_PATH" # -n表示不等待Emacs关闭 else # 启动Emacs daemon并打开文件 open -a Emacs --args --daemon sleep 1 # 给daemon启动留时间 emacsclient -n "$FILE_PATH" fi - 给脚本加执行权限:
chmod +x /Applications/你的Emacs包装应用名.app/Contents/MacOS/脚本文件名
3. 重置Firefox的URI关联缓存
Firefox可能缓存了旧的协议关联设置,手动重置:
- 在Firefox地址栏输入
about:config,搜索network.protocol-handler.expose.emacs - 如果值是
true,双击改成false,之后再点emacs://链接时,Firefox会重新让你选择打开应用,选你的包装应用并勾选“始终使用此应用打开”。 - 或者直接去Firefox设置里搜“应用程序”,找到emacs协议,手动指定为你的包装应用。
4. 验证参数传递是否正常
不确定问题出在哪时,加日志排查:
- 在执行脚本开头加一行日志:
echo "收到的URI: $1" >> ~/emacs-handler.log - 点击Firefox里的emacs://链接,查看
~/emacs-handler.log的内容,确认文件路径是否被正确解析。
内容的提问来源于stack exchange,提问作者kjmh
相关产品推荐
相关产品推荐

