PAYATHON 2026

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 使用说明

备注:内容仅供参考。