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

2022-09-01 03:32:08

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; }

}

答案 1

Vim具有/内置“用于Java或类似结构化语言”。[m]m

我编写了处理 Vim 函数VBScript批处理文件等的自定义版本。这些都由我的CountJump插件提供支持,该插件可用于基于正则表达式编写自定义跳转函数。


答案 2

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

编辑:更好的模式(版本 2):/\(\(如果\|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>