Vim:转到下一个方法的开始/结束

时间:2012-08-26 08:25:11

标签: java c++ vim methods

Vim中是否有本机功能允许用户将光标移动到下一个方法的开头/结尾?我已经了解[[]][]][,但这些并没有削减工作,因为它们只适用于第0列的大括号。因此,它们在导航C ++代码方面几乎没有用处。是否有这样的命令已经内置到Vim中?如果没有,你会推荐一个实现它的插件吗?

感谢您的帮助!

修改:[{}]将无法一直运行,因为您必须位于具有{}的块内(并且不在该块内更深的范围内)最后在{}之后结束。

编辑2:这是[m和朋友无法工作的代码清单。

namespace foo {

#define define_foo         \
    template <class T>     \
    struct foo_traits<X>   \
    {                      \
        using foo = X;     \
    };

template <class T>
struct foo_traits;

define_bar(T*, T*, T*);

template <class T>
struct baz;

template <class T>
struct baz<T&>
{
    static T* apply(T& t) { return &t; }
};

template <class T>
inline T a(T t) { return t; }

}

4 个答案:

答案 0 :(得分:45)

Vim内置了[m / ]m“for Java或类似的结构化语言”。

我编写了处理Vim functionsVBScriptbatch files等自定义版本。这些都由我的CountJump plugin提供,可用于根据正则表达式编写自定义跳转函数。

答案 1 :(得分:3)

看起来像是Vim [m motion with c#

的副本 例如,你可以试试这个肮脏的伎俩:9]}。 这只是从当前位置跳到第9 }(如果你没有太嵌套,应该工作......)

答案 2 :(得分:1)

我花了好几个小时来制作这种模式: /^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{ ,它对我有用。

编辑:更好的模式(版本2): /\(\(if\|for\|while\|switch\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{

在此处查看效果: enter image description here enter image description here

您可以在.vimrc中映射一些方便的绑定,例如:

" jump to the previous function
nnoremap <silent> [f :call search('^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{', "bw")<CR>
" jump to the next function
nnoremap <silent> ]f :call search('^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{', "w")<CR>

编辑:更好的模式(版本2):

" jump to the previous function
nnoremap <silent> [f :call
\ search('\(\(if\\|for\\|while\\|switch\\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{', "bw")<CR>
" jump to the next function
nnoremap <silent> ]f :call
\ search('\(\(if\\|for\\|while\\|switch\\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{', "w")<CR>

答案 3 :(得分:0)

如果您使用标签列表,则添加了一项功能。只要标签列表支持该语言,就可以使用Ctrl-up和Ctrl-down从一个标签跳到另一个标签。

此处:https://github.com/man9ourah/taglist

并将其发送到您的.vimrc

nmap <silent> <c-up> <plug>(TlistJumpTagUp)     " Map ctrl-up to move one tag up
nmap <silent> <c-down> <plug>(TlistJumpTagDown) " Map ctrl-down to move one tag down