【问题标题】:How to jump to the beginning of the current function body in Vim?Vim中如何跳转到当前函数体的开头?
【发布时间】:2011-01-07 17:54:33
【问题描述】:

如题,如果我在函数体中间,而且函数体很长,如何跳回函数体的开头。

【问题讨论】:

    标签: vim


    【解决方案1】:

    搜索(向后)?^{ 通常应该可以到达那里。

    【讨论】:

    • 真的有“这么多可能出错的情况”吗?这个问题专门从“函数体中间”提出,在编写 C 代码时,对于在行首不以 '{' 开头并且有一些行的函数来说,它应该是一种非常非标准的编码风格在函数中也以“{”开头。
    • @vincentleest 仅当您不在 C / C++ 中的 {} 块内时。
    【解决方案2】:

    [m

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

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

    【讨论】:

    • 对于 React/ES6/JavaScript 类方法也是如此 :-)
    • 但仅适用于方法,不适用于函数(需要包含class {})。 :-( 方法特定问题:stackoverflow.com/questions/12128678/…
    • 非常好。我的宝贝。
    • 补充一点,对于像 C 这样的过程语言,下面的组合会将你带到函数 [m[{ 的开头,然后你可以将它映射到 [f 之类的东西。
    【解决方案3】:

    顺便说一句,能够做到这一点的唯一相对确定的方法是修改vim,见this post

    [编辑]
    这仅适用于由 exuberant ctags 支持的语言。由于我们不适合知道您希望使用哪种语言进行此操作,因此该答案也可能不正确。
    [/编辑]

    【讨论】:

      【解决方案4】:

      一旦您在代码中的块和段落排序后移动,您可能希望通过查看 vim 文档的 this part 来了解当您处于这些块的中间时可以做什么。

      删除块,在块之前插入,在块之后追加等。

      HTH

      【讨论】:

        【解决方案5】:

        C语言[[

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

        [[
        

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

        这是一个很好的选择,适用于埃及和非埃及牙套:

        ?^[^ \t#]
        

        例子:

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

        【讨论】:

        • 对于埃及(或 Kernigan-Richie)风格,[{ 可能也有帮助。
        • @dgrogan 在上面的例子中,vim 8.0 Ubuntu 18.04 -u NONE, ]m 在右大括号处停止。如果函数内部有大括号,情况会变得更糟,例如if {}.
        • 或者,如果您的文件中定义了折叠结构,[z / ]z 可能会起作用。
        【解决方案6】:

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

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

        【讨论】:

        • 感谢对我很有用!迄今为止我发现的唯一一个甚至可以使用 C++ 命名空间
        【解决方案7】:

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

        跳转到开头:[{

        跳到结尾:]}

        用括号或方括号替换使用它们的函数。

        【讨论】:

        • 不知道为什么你被否决了——但这对 Go 的我有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 2020-02-28
        相关资源
        最近更新 更多