函数参数快速跳转与选择

spacemacs

#1

不知道各位在用emacs写代码的时候是如何在函数的参数间进行跳转的,参数选择的,一个字符一个字符的移动好慢啊。vim下好歹有textobj args的插件,emacs下有类似的吗,难不成得自己写一个


#2

我用forward-sexpbackward-sexp 默认绑定到C-M-fC-M-b

就算是原生vim用户也知道BE


#3

这个跳转不准确.

int function(int arg1, char *arg2, exp(a,b,c), int arg4);

当光标在arg1下,此时,想选中arg2,也就是第一个’,‘和第二个’,'之间的内容.或者跳转,或者选中,或者编辑. B 仅仅是单词的跳转,会跳过头.


#4

「这个」是指哪个?

forward-sexp 还是很准确的,自己再包装一下完全符合需求:

int function(int arg1, char *arg2, exp(a,b,c), int arg4);
//              |    |     |     |    |      |    |    |
//              1    2     3     4    5      6    7    8
//
//              ---- forward-sexp / c-forward-sexp ---->

#5

多谢,一会儿试试,看看咋样用着


#7

其实无论 forward-sexpc-forward-sexp 还是 paredit-forward 都足够用了,除非是以下这种情况,会让人有点不爽:

(arguments_type    arguments_name,   ...)
 ~~~*~~~~~~~~~~    ~~~~~~~~~~~~~~
    |          ^         ^
    |          |         |
    |---->-----'         |
    | actual             |
    |                    |
    '---------->---------'
           expected

但是只要配置合理,比如我用 hydra + (paredit-forward),只要按 <leader-key> f 再加按一次 f 就到了,远比按两次 C-M-f 轻松。

也比专门写一个 forward-arg 代价要小,因为 f 键使用频率极高,不能浪费在绑定这么冷门的函数上,但如果绑定到比较偏的快捷键,那么使用前还得查一查小抄。

如果坚持要实现一个 forward-arg,我认为不应该跳过参数类型:

int function(int arg1, char *arg2, exp(a,b,c), int arg4);
                  *           ^
                  |           |
                  '----->-----'

不应该跳过中间的 char,因为这种情况下,类型也是可能需要修改的。否则你可能需要两个函数+两个快捷键了:forward-arg-variable & forward-arg-type。这只会使得事情变得更复杂。

我个人是比较推荐善用现成的函数。好的设计是尽量让使用的时候无感。