doom emacs 怎么模拟C语言里针对条件编译宏的跳转?

在 vim 下,如下代码,当光标位于 #ifdef 这行的时候,可以通过 ]# 跳转到 #else 上。当光标位于 #else 时,可以通过 [# 跳转到 #ifdef 这行。通过 ]# 跳转到 #endif 这行。我觉得这个功能非常棒。我现在用的是 doom emacs,号称任何和 vim 不兼容的都是 BUG,但这个功能并没有实现。是我的配置不正确吗?

#ifdef X
xxx
#else
yyy
#endif

doom emacs 中有这个功能

谢谢,看描述确实是我想要的功能。但实际操作下来,并不成功。举个例子,我看 linux/mm/mmzone.c 里的这几行代码:

  46 static inline int zref_in_nodemask(struct zoneref *zref, nodemask_t *nodes) 2 refs|0 ref|0 ref                                                                                          
  47 {                                                                                                                                                                                       
  48 #ifdef CONFIG_NUMA                                                                                                                                                                      
  49         return node_isset(zonelist_node_idx(zref), *nodes);                                                                                                                             
  50 #else                                                                                                                                                                                   
  51         return 1;                                                                                                                                                                       
  52 #endif /* CONFIG_NUMA */                                                                                                                                                                
  53 }  

当光标停在 #else 上按 [ # 出现的是 Symbol’s function definition is void: +evil/next-preproc-statement

按 ] # 没有任何效果。

因为我是新手,基本是 doom emacs 原生配置。看起来是这个实现有一些 bug ?

是个实用的功能,借楼问下spacemacs中如何配置这个功能。

他的实现就是正则查找

可以 M-x 手动调用这个命令,看一下行不行

我记得 evil 本身就可以通过 % 来跳转吧。

% 也挺方便,就是无法选择向上还是向下跳转。我在 doom emacs 里面测试了,% 的功能是符合预期的。挺好

这个实现肯定是有问题的。正则表达式无法处理嵌套的宏定义。例如下面的例子。等后面有时间的时候再研究研究。。

#ifdef A
#ifdef B
#endif
#endif

[# 还有一个好处,光标不必位于 #else 的位置也可以使用。就是在 #else#endif 中间任意位置往上搜索都可以。形成肌肉记忆了,没有实际打开 vim 用一下,都想不到它的好处了

看描述应该是要用+evil/next-preproc-directive,而且+evil/next-preproc-statement 没有找到定义。修改后能正常工作,不过直接调用+evil/next-preproc-directive好像不正常工作

;;;###autoload
(defun +evil/previous-preproc-directive (count)
  "Jump to the COUNT-th preprocessor directive before point.
See `+evil/next-preproc-directive' for details."
  (interactive "p")
  (+evil/next-preproc-statement (- count)))

修改

;;;###autoload
(defun +evil/previous-preproc-directive (count)
  "Jump to the COUNT-th preprocessor directive before point.
See `+evil/next-preproc-directive' for details."
  (interactive "p")
  (+evil/next-preproc-directive (- count)))

提交补丁,doom接受了。

可以使用evil-matchit, 按%跳转,比evil默认的功能强大,且用户可以添加自己的规则. spacemacs一开始就使用evil-matchit了.

Evil 的特殊命令我不清楚,但是 CC Mode 自带有 c-forward-conditional、 c-backward-conditional、c-up-conditional 和 c-down-conditional(C-c C-n,C-c C-p,C-c C-u)。