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