如何在 Vim 中跳转到当前函数体的开头?

作为标题,如果我在函数体的中间,函数体很长,我怎么能跳回到函数体的开头。

30419 次浏览

正常情况下,搜索(向后) ?^{应该可以到达那里。

[ m ]

转到[ count ]方法的前一个开始

适用于 Java 或类似的结构化语言,也适用于 Python。

顺便说一句,能够做到这一点的唯一相对可靠的方法是修改 vim,见 这篇文章

[编辑]
这只适用于有丰富的 ctag 支持的语言。由于我们还没有被设计适合知道您希望用哪种语言进行这项工作,所以这个答案也可能不正确。
[/编辑]

一旦你已经移动块和段落的代码排序,你可能想看看你可以做什么,当你在这些块的中间,通过看看 这部分的 vim 文档。

比如删除块,在块之前插入,在块之后添加,等等。

高温

C 语言

如果你的 C 代码是非埃及风格的:

[[

[m只有在函数周围有一个封闭的 {}时才能工作,例如,用于 Java/C + + 的 class { method(){} }

这是一个适用于埃及和非埃及牙套的好办法:

?^[^ \t#]

例子:

void egypt() {
#define DONTCARE 1
int indented code = 1;
}


void tpyge()
{
#define DONTCARE 1
int indented code = 1
}

我花了几个小时做了这个模式: /^\s*\(\i\+\_[ \t\*]\+\)\+\i\+\_s*(\_[^)]*)\_s*{,它对我很有效。

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

看看这里的效果: 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>

对于包含在一对花括号{}中的函数:

跳转到开始: [{

跳转到结束: ]}

对于使用花括号或方括号的函数,请将花括号替换为括号或方括号。

在2022年,护树人值得你的关注。

内置的 [m使用词法规则,并总是跳转到以前的 {位置或最外面的 {位置。

相比之下,treesitter 利用了句法信息,因此它可以跳到一个更精确的位置,而且没有下面描述的限制:

以上两个命令假设文件包含一个带有方法的类。 类定义被“{”和“}”包围。类中的每个方法 类中的每个方法都用“{”和“}”包围。这适用于 Java 语言。 文件如下所示: >

如果你想了解更多,检查 https://github.com/nvim-treesitter/nvim-treesitter-textobjects