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

72qzrwbm  于 2022-11-11  发布在  其他
关注(0)|答案(8)|浏览(470)

正如题目所说,如果我在函数体的中间,而函数体很长,我怎么能跳回到函数体的开头。

m528fe3b

m528fe3b1#

[米
转到方法的上一个起始位置[count]
适用于Java或类似的结构化语言,也适用于Python。

zaqlnxep

zaqlnxep2#

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

vsdwdz233#

对于包含在一对大括号{}中的函数:
跳到开头:[{
跳到结尾:]}
对于使用圆括号或方括号的函数,请用圆括号或方括号替换这些圆括号。

xmd2e60i

xmd2e60i4#

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

EDIT:更好的模式(版本2):一个月一个月
请在此处查看效果:

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

" 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>

EDIT:更好的模式(版本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>
bt1cpqcv

bt1cpqcv5#

2022年,treesitter值得你关注。
内置的[m使用词法规则,总是跳到上一个{位置或最外面的{位置。
相比之下,treesitter利用了语法信息,因此它可以跳转到更精确的位置,并且没有如下所述的限制:
以上两个命令假设档案包含具有方法的类别。类别定义是以'{'和'}'括住。类别中的每个方法也是以'{'和'}'括住。这适用于Java语言。档案看起来像这样:〉
如果您想了解更多信息,请查看https://github.com/nvim-treesitter/nvim-treesitter-textobjects

wtzytmuj

wtzytmuj6#

顺便说一句,能够做到这一点的唯一相对可靠的方法是修改vim,请参见this post
[编辑]
而且这只适用于由丰富的ctags支持的语言。由于我们还没有被设计成适合知道你希望用哪种语言来做这件事,所以这个答案也可能不正确。
[编辑]

xxls0lw8

xxls0lw87#

一旦你在代码块和段落之间移动,你可能会想看看当你在这些块中间时,你可以做些什么,通过查看Vim文档的这一部分。
例如删除块、在块前插入、在块后追加等。
高温

kfgdxczn

kfgdxczn8#

(向后)搜索?^{通常可以找到它。

相关问题