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; }
}
答案 0 :(得分:45)
Vim内置了[m
/ ]m
“for Java或类似的结构化语言”。
我编写了处理Vim functions,VBScript和batch files等自定义版本。这些都由我的CountJump plugin提供,可用于根据正则表达式编写自定义跳转函数。
答案 1 :(得分:3)
答案 2 :(得分:1)
我花了好几个小时来制作这种模式: /^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{
,它对我有用。
编辑:更好的模式(版本2): /\(\(if\|for\|while\|switch\|catch\)\_s*\)\@64<!(\_[^)]*)\_[^;{}()]*\zs{
您可以在.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