封装 webjump,搜索 symbol-at-point 的内容

写配置看到了 webjump,可以定义一些搜索链接,选择预置的链接,输入关键字进行搜索(利用 brower-url)。

我觉得用来搜索 point 下的内容也挺好的,就糊了个简单函数,用来搜索 symbol-at-point 的内容,例如用 Kagi 搜索、Kagi 翻译、搜索 GitHub、MDN 等常用文档。

不知道有没有已经存在的包实现了类似功能,没怎么找,有的话也欢迎分享。


效果:

Kapture 2026-01-25 at 21.46.39


更新:

  1. 因为是获取 point 下的内容进行操作,很适合结合 embark 一起完成,例如我将 embark-act 绑定到了 C-.,那么我的操作就是:
  • 找到想要操作的内容(region/symbol)
  • C-. 调用 embark-act
  • W(我将函数绑定到了 embark-general-map 中的 W,就可以调用函数搜索了
  1. 增加了 Kagi Assistant 的 URL,调用的时候需要简单输入一些 prompt,然后会去到 Kagi Assistant 页面调用 LLM 回答问题

Kapture 2026-02-01 at 10.13.57

代码:

webjump
(use-package webjump
  :after embark
  :defer nil
  :config
  (setq webjump-sites '(("Kagi" . [simple-query "kagi.com" "kagi.com/search?q=" ""])
                        ("Kagi Translate Text" . [simple-query "translate.kagi.com" "translate.kagi.com/?from=auto&to=zh_cn&text=" ""])
                        ("Kagi Translate Page" . [simple-query "translate.kagi.com" "translate.kagi.com/zh_cn/" "?kt_view=both_vertical?kt_view=both_vertical"])
                        ("Kagi LLM" . [simple-query "kagi.com" "kagi.com/assistant?q=" "&profile=kimi-k2.5-reasoning&internet=on"])
                        ("Wikipedia" . [simple-query "wikipedia.org" "wikipedia.org/wiki/" ""])
                        ("Kagi(site:github.com)" . [simple-query "kagi.com" "kagi.com/search?q=site:github.com+" ""])
                        ("Album" . [simple-query "kagi.com" "kagi.com/images?q=" "&size=large"])
                        ("MDN" . [simple-query "developer.mozilla.org" "developer.mozilla.org/en-US/search?q=" ""])
                        ("Haici" . [simple-query "dict.cn" "dict.cn/search?q=" ""])))

  (defun spike-leung/webjump-symbol-at-point (target)
    "获取光标下的 symbol 并通过 webjump 搜索。TARGET 是 `embark-act' 的对象。"
    (let* ((completion-ignore-case t)
           ;; 从 WebJump 列表选项
           (item (assoc-string
                  (completing-read "WebJump to site: " webjump-sites nil t)
                  webjump-sites t))
           ;; 选项名称
           (name (car item))
           ;; 选项配置
           (expr (cdr item))
           ;; 选项的第 3 个参数,获取查询前缀
           (query-prefix (aref expr 2))
           ;; 选项的第 4 个参数,获取查询后缀
           (query-suffix (aref expr 3))
           (fun (if webjump-use-internal-browser
                    (apply-partially #'browse-url-with-browser-kind 'internal)
                  #'browse-url))
           ;; 如果选择的是 LLM 相关的 URL,则需要输入 Prompt
           (prompt (and (string-match-p "LLM" name) (read-string "Prompt: " "解释" t)))
           ;; 如果存在 prompt 则拼接 prompt
           (query (or (and prompt (concat target "\n" prompt)) target)))
      (funcall fun (webjump-url-fix
                    (cond ((concat query-prefix (webjump-url-encode query) query-suffix))
                          (t (error "WebJump URL expression for \"%s\" invalid"
                                    name))))))))
embark
(use-package embark
  :bind
  (("C-." . embark-act)
   ("M-." . embark-dwim)
   ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings'
  :init
  ;; Optionally replace the key help with a completing-read interface
  (setq prefix-help-command #'embark-prefix-help-command)
  :config
  (keymap-set embark-general-map "W" #'spike-leung/webjump-symbol-at-point)
  (keymap-set embark-region-map "W" #'spike-leung/webjump-symbol-at-point))

还有一些杂七杂八的记录在了博客里:Emacs: 封装 webjump 搜索 symbol-at-point


关于 Kagi,我认为它的搜索是有一定优势的,集成到 Emacs 里方便触发也挺好。 关于 Kagi:也许你想试试 Kagi?

1 个赞

很多包都有在线搜文档的功能,比如haskell-hoogle可以自动搜hoogle,slime-documentation-lookup可以自动搜hyperspec,也是可以自己配置上游链接的。但是这方面没有统一接口,因为它们可能会自己处理返回页面里的链接,实现文档buffer内部的链接跳转,这个是需要Emacs里面集成的东西。

你这种聚合搜索的模式我更倾向于做成一个独立的网络聚合搜索服务,因为这个功能完全不用集成到Emacs里面去。比如说,一个简单的实现:在Emacs里面调LLM。

顺带一提,如果你经常使用操作系统API编程,你更常用的可能是man和info,而不是web文档。Emacs里面搜这些东西的工作流有很多集成(比如ace-jump)。

谢谢分享 :slight_smile:

这个函数主要是看到了 webjump,加上我平时用搜索引擎比较多,所以就顺便封装一下。

我经常需要查询一下 Web 相关的语法,在 Emacs 里可以快速获取 point 下的相关语法直接查询就会方便一点。(这方面 Emacs 好像也可以集成 dash 查询文档,不过网站信息可能更新一些)

原来可能在 Emacs 里碰到一些东西想了解一下,可能需要复制,再搜索 (针对那些 Emacs 里面可能没有的文档或内容)。

糊个函数,就可以直接获取相关内容,调用对应的网站搜索,方便一下这个场景而已。

我觉得之前yibie分享的一篇关于基于超链接的桌面系统(好像不是这个名字,差不多这个意思)的文章说的挺好。

dash和devdocs都可以直接用

是这两个吧:

用来查 API 的话确实可以

更新一下,结合了 embark,添加了 Kagi Assistant 链接,现在我可以更方便地调用这个函数了,随时可以从 Emacs 里获取上下文去到 Kagi Assistant 进行对话了。

结合 embark,这样不用记忆一个特殊的快捷键,用起来可能会更方便,更频繁。 而 Kagi Assistant 拥有网络搜索能力,回答质量可能会更好一些。

虽然 gptel 可以写 tools 增加 web-search 的能力,但 Kagi 本身是做搜索的,也许 Kagi 会做的更好一些,而且订阅了有一定的使用额度,不用白不用 :nerd_face: