TIL: flymake 错误跳转加入 Evil 跳转列表
Magnus Therning 在 博客 上提到一个技巧:用 flymake 跳到下一个错误,改完想按 C-o 跳回去,发现回不去。因为 flymake-goto-next-error 和 flymake-goto-prev-error 是普通函数调用,Evil 不认为它是"跳转",不会把当前位置记到跳转列表里。
Evil 的跳转列表只记录带 :jump t 标志的 motion(比如 G 跳到指定行、 gg 跳到文件开头)。所以我们用 evil-define-motion 包装一下就行:
(evil-define-motion mes/evil-goto-next-error (count) :jump t (unless (bound-and-true-p flymake-mode) (signal 'search-failed nil)) (flymake-goto-next-error count)) (evil-define-motion mes/evil-goto-prev-error (count) :jump t (unless (bound-and-true-p flymake-mode) (signal 'search-failed nil)) (flymake-goto-prev-error count))
:jump t 让 Evil 在执行这个 motion 之前先把当前位置存进跳转列表。 (unless (bound-and-true-p flymake-mode) (signal 'search-failed nil)) 保证在 flymake 没开的 buffer 里调用会报错。
绑定到按键上(用 Evil 内置的 evil-define-key ,选 C-j/C-k 是因为 evil-collection 的 flymake 模块也是这么绑的):
(evil-define-key 'normal flymake-mode-map "C-j" 'mes/evil-goto-next-error "C-k" 'mes/evil-goto-prev-error)
这样就能 C-j 跳到错误 → 修复 → C-o 跳回编辑位置。