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

时间:2009-12-16 18:23:06

标签: vim

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

function test($b) {

  var $a = 0;

  while ($a < b) {
    $a += 3;
  }

  return $a;
}

并且光标位于$a += 3行,是否可以快速选择整个功能?

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

6 个答案:

答案 0 :(得分:10)

在您发布的选择命令后按 V ,将选择转换为行选择,它将选择函数声明:

v 2 V

答案 1 :(得分:5)

自从这个问题被问到并回答以来已经有很长一段时间了,但我会添加自己的答案,因为它是我正在寻找的那个,而其他人都没有像这个一样工作:

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

第一个映射,&#34; Visual around function&#34;或vaf,将跳回函数定义的开头,无论{是在同一行还是下一行,即使它是一个lambda函数,并在视觉上选择它的特点是它的结束括号。这适用于PHP,Javascript和Go。

如果愿意,用户可以按V转到行方式选择模式。

我发现的唯一问题是,当我处于一个大函数的主体中,但是在使用lambda(让我们说&#34;小&#34;)函数的行之下时,这将是停止在小函数的开头搜索并选择它的正文而不是到达大函数的开头并选择它的所有正文。

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。感觉就像选择的重复或扩展。它真正做的是放弃选择并在它之前前行,然后尝试它。如果&#34;大&#34;函数使用几个lambda函数,用户必须多次重复af才能到达大函数。

通常,vaf足够了。有时需要vaf afvaf af af。无论如何,它是我能得到的最接近我想要的东西,所以这就是我正在使用的版本。

答案 2 :(得分:3)

这是一个似乎非常有效的映射,无论嵌套级别如何。

:map t ? function <CR>f{vaBV

答案 3 :(得分:1)

如果你打开了功能级折叠,这是另一种方法:z c v

关闭当前折叠并选择它,但它会关闭它。如果您希望它保持开放状态:z c v $

如果您启用了块级折叠,则必须关闭两次,因为您在while循环中,所以:2 z c {{1} }

启用PHP类/函数折叠:v

答案 4 :(得分:1)

简单方法

nmap vaf va}V

我喜欢这个

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

如果'{'在新行中

nmap vaF [{?function<CR>:nohl<CR>v/{<CR>]}

答案 5 :(得分:0)

又一种方式。这应该选择整个函数定义,无论您在定义中的光标位置如何,而不仅仅是在if( socket.send_to(asio::buffer(idnMsg, 6), senderEndpoint) != 6 ) { std::cerr << "send_to failed" << std::endl; exit(1); } else { std::cerr << "one packet sent" << std::endl; } 行时。

在正常模式下使用此功能($a += 3表示按回车键)

<CR>

各部分的说明:

  • ?func<CR>V/{% 向后搜索单词&#34; func&#34; (想法是到达函数定义的第一行)
  • ?func转到视线模式
  • V向前寻找左大括号(我没有使用/{,因为左大括号可能在另一条线上)
  • f{转到匹配的大括号