You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Evil模式下使用xref-js2跳转定义报错,寻求可行解决方法

哈哈,这个问题我刚转Evil的时候也踩过坑!核心原因是M-.默认绑定的xref-find-definitions并没有被Evil标记为「可重复命令」,而Evil的M-.在某些场景下会关联到它的重复机制,所以就弹出了那个恼人的提示。下面几个实用的解决办法,你可以挑一个适合自己的:

方案一:给xref跳转命令加上Evil重复支持

自己写一个简单的包装函数,让Evil识别这个命令是可以重复的,然后重新绑定快捷键:

(defun my/xref-find-definitions-with-repeat ()
  (interactive)
  (xref-find-definitions (xref-read-symbol "Find definition of: "))
  (evil-set-repeat 'my/xref-find-definitions-with-repeat))

;; 在js2-mode的Normal模式下绑定M-.到新函数
(evil-define-key 'normal js2-mode-map (kbd "M-.") 'my/xref-find-definitions-with-repeat)

这样之后,你不仅能用M-.正常跳转,还能按.重复之前的跳转操作(如果需要的话)。

方案二:临时切换到Emacs状态执行跳转

不想写新函数的话,可以直接让M-.在执行跳转时临时切到Emacs状态,执行完再切回Normal状态,绕开Evil的重复检查:

(evil-define-key 'normal js2-mode-map (kbd "M-.")
  (lambda ()
    (interactive)
    (evil-emacs-state)
    (call-interactively 'xref-find-definitions)
    (evil-normal-state)))

这个方案更轻量,适合不想额外定义函数的场景。

方案三:使用evil-collection适配

如果你的配置里还没装evil-collection,强烈建议装上!它是一个专门为Evil适配各种Emacs原生和第三方模式的工具包,已经处理了xref、js2-mode这类常见扩展的快捷键兼容问题。装上之后,只需要在配置里启用对应的模块,M-.的跳转就能正常工作,不用自己手动改绑定。

不管选哪个方案,修改完配置后记得重启Emacs或者用M-x eval-buffer重新加载配置文件,这样新的绑定才能生效哦~

内容的提问来源于stack exchange,提问作者gi4c0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:53:31