代码之家  ›  专栏  ›  技术社区  ›  case nelson

如何选择整个PHP函数定义?

vim
  •  10
  • case nelson  · 技术社区  · 15 年前

    在PHP中,如果我有如下函数:

    function test($b) {
    
      var $a = 0;
    
      while ($a < b) {
        $a += 3;
      }
    
      return $a;
    }
    

    光标位于 $a += 3 行,是否可以快速选择整个函数?

    “v2ab”将选择所有内容,包括函数大括号,但不包括声明 function test($b)

    6 回复  |  直到 9 年前
        1
  •  10
  •   Christian C. Salvadó    15 年前

    压力 V 在发布选择命令后,要将所选内容转换为 选线 ,选择函数声明:

    V V

        2
  •  5
  •   Sebastián Grignoli    11 年前

    问和回答这个问题已经有很长时间了,但我会添加我自己的答案,因为这是我正在寻找的答案,其他任何一个都不会像这个一样工作:

    nnoremap vaf ?func.*\n*\s*{<cr>ma/{<cr>%mb`av`b
    vmap af o<esc>kvaf
    

    第一个映射,“可视环绕函数”或 vaf ,将跳回到函数定义的开头,而不管 { 在同一行或下一行中,即使它是lambda函数,也要以字符的形式选择它的结束括号。这在php、javascript和go中有效。

    如果用户愿意,可以按v键转到线条选择模式。

    我发现的唯一问题是,当我在一个大函数体中,但在一条使用lambda(我们称之为“small”)函数的行的下面,这将停止搜索小函数的开头,并选择它的体,而不是到达大函数的开头,并选择它的所有体。

    function show_video_server(v_server) {
      // this whole function should get selected
      var something = function(){ /* this function gets selected */ };
      //   |   the cursor is here when I type "vaf"
    }
    

    作为解决方法,我使用第二个映射: vmap af o<esc>kvaf . 感觉就像是选择的重复或扩展。它真正要做的是放弃选择,转到它前面的行,然后再试一次。如果“big”函数使用多个lambda函数,则用户必须重复 af 好几次才能到达那个大的。

    通常, 真空电弧炉 够了。有时 vaf af vaf af af 是需要的。总之,这是我能得到的最接近我想要的,所以这是我正在使用的版本。

        3
  •  3
  •   case nelson    15 年前

    这是一个映射,不管嵌套级别如何,它都能很好地工作。

    :map t ? function <CR>f{vaBV
    
        4
  •  1
  •   oops    15 年前

    以下是另一种方法,如果打开了功能级别折叠,则可以使用: z c v

    这将关闭当前折叠并选择它,但会使其关闭。如果您希望它保持打开状态: Z C V $

    如果启用了块级折叠,则必须关闭两次,因为您在while循环中,因此: 2 Z轴 C V

    要启用PHP类/函数折叠: let php_folding = 1

        5
  •  1
  •   aufula    12 年前

    简单方法

    nmap vaf va}V

    我喜欢这个

    nmap vaf [{?function<CR>:nohl<CR>vf{]}

    如果___

    nmap vaF [{?function<CR>:nohl<CR>v/{<CR>]}
        6
  •  0
  •   doubleDown    9 年前

    另一种方式。这应该选择整个函数定义,而不考虑光标在定义中的位置,而不仅仅是在 $a += 3 线。

    在正常模式下使用( <CR> 表示按Enter键)

    ?func<CR>V/{%
    

    各部分说明:

    • ?func 向后搜索“func”一词(其思想是到达函数定义的第一行)
    • V 转到可视线条模式
    • /{ 向前搜索左大括号(我没有使用 f{ 因为开口撑架可能在一条单独的线上)
    • % 转到匹配的大括号