Emacs 的 skewer-mode 为何仍打开 Chrome,而不使用 luakit?
结论:原配置方向正确,先检查运行时是否生效
你设置的这两项配置用于指定外部浏览器:
(setq browse-url-generic-program "luakit")
(setq browse-url-browser-function 'browse-url-generic)
run-skewer 通过 browse-url 打开页面,没有固定使用 Chrome。上游实现会启动 HTTP 服务,再打开 http://127.0.0.1:端口/skewer/demo。Skewer 源码
仅凭提供的 init.el 还无法确定原因。需要检查这两行是否执行、是否被后续配置覆盖,以及 URL 是否被其他处理规则接管。
1. 让配置在当前 Emacs 会话中生效
可以将浏览器配置写成下面这样,选中代码后执行 M-x eval-region RET:
(require 'browse-url)
(setq browse-url-generic-program "luakit"
browse-url-browser-function #'browse-url-generic)
保存 init.el 不会自动执行新增配置。也可以重启 Emacs;如果启动时报错,先检查是否因此导致后面的浏览器配置没有执行。
#'browse-url-generic 和原来的 'browse-url-generic 都可以引用该函数,更换写法本身不会解决浏览器选择问题。
在准备运行 run-skewer 的缓冲区中,分别执行:
C-h v browse-url-browser-function RET
C-h v browse-url-generic-program RET
应分别看到 browse-url-generic 和 "luakit"。如果值不同,检查 init.el 后续内容、加载的其他配置文件以及 Customize 保存的设置。
2. 分别测试程序启动和 URL 分派
先通过 M-: 执行:
(executable-find "luakit")
如果返回 nil,说明当前 Emacs 的程序搜索路径中找不到 luakit。终端能找到 luakit,不代表从桌面启动的 Emacs 也能找到。此时可以把 browse-url-generic-program 改为可执行文件的绝对路径,具体路径以本机安装位置为准。
接着执行下面的表达式,直接测试指定程序:
(browse-url-generic "https://example.org/")
然后测试经过浏览器分派的调用:
(browse-url "https://example.org/")
browse-url-generic 会调用 browse-url-generic-program 指定的程序,并将 URL 作为参数传入;browse-url 还会考虑 URL 处理规则。Emacs browse-url 实现
根据结果继续定位:
- 直接调用就启动失败:先处理程序路径、启动错误或 luakit 自身配置。
- 直接调用打开 luakit,经过
browse-url却打开 Chrome:检查 URL 分派规则。 - 两种调用都打开 luakit,但
run-skewer仍打开 Chrome:在同一缓冲区重新检查变量,并通过M-x find-function RET run-skewer RET查看本机实际加载的实现。
如果 Emacs 提供 browse-url-handlers,可以用 C-h v 查看是否存在匹配 HTTP URL 的规则。匹配规则可能优先于 browse-url-browser-function;必要时也检查 browse-url-default-handlers。这些都是需要核对的可能原因,现有材料不能说明它们已经配置错误。
3. 只为 Skewer 指定 luakit
如果希望其他链接继续使用原来的浏览器,可以增加一个专用命令,直接调用 browse-url-generic:
(defun my-skewer-luakit ()
"Open the Skewer demo page in luakit."
(interactive)
(require 'skewer-mode)
(require 'browse-url)
(let ((browse-url-generic-program "luakit")
(browse-url-generic-args nil))
(httpd-start)
(browse-url-generic
(format "http://127.0.0.1:%d/skewer/demo" httpd-port))))
执行 M-x my-skewer-luakit RET。这个命令沿用 Skewer 的服务和演示页面地址,绕过 browse-url 的浏览器选择过程,只在本次调用中指定 luakit。它打开默认演示页面,不包含 run-skewer 通过前缀参数选择其他文档的功能。
4. 确认浏览器已经连接 REPL
浏览器成功启动后,还要确认页面中的 JavaScript 能连接到 Skewer。执行 M-x list-skewer-clients RET 查看客户端,再运行 M-x skewer-repl RET,输入:
1 + 1
正常连接时应返回 2。这是验证方法,现有材料没有提供实际测试结果。
如果页面已经在 luakit 中打开,但没有客户端连接,应继续检查页面脚本、浏览器控制台和本地 HTTP 请求。更换启动程序只能解决浏览器选择问题,不能保证 luakit 与当前 Skewer 环境完全兼容。Skewer 的项目说明介绍了客户端列表和 REPL 的使用方式,但不能据此确认本例中的 luakit 已通过兼容性验证。Skewer 使用说明
备注:内容仅供参考。
