在 Vim 中移动到下一个代码块的开头

cub*_*nic 5 vim perl

假设我在 Vim 中打开了以下 Perl 代码:

if (@arr = shomething()) {
   for (@arr) {
       some_function($_->{some_key});
       # some
       # more
       # code
       while (some_other_funtion($_)) {
           write_log('working');
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

以及在行开头的光标some_function,我如何将光标移动到以下任一位置:

  • 的开始 while
  • {while
  • while块内的第一行(调用write_log

搜索{不是一个选项,因为可能有许多{不启动新的内部代码块 - 例如,请参阅some_function.

Ror*_*ane 4

看来您正在定义一个 \xe2\x80\x9ccode 块\xe2\x80\x9d 来包含{ }至少一行。{您只需在行尾搜索 a 即可最轻松地搜索这些内容:

\n\n
/{$\n
Run Code Online (Sandbox Code Playgroud)\n\n

/{表示搜索 a {,并$表示到行尾的锚点。

\n\n

在某些情况下,a{打开一个块,但不是一行的最后一个字符:

\n\n
/{$\n
Run Code Online (Sandbox Code Playgroud)\n\n

考虑到这一点,请执行以下搜索以查找{同一行上未关闭的 a:

\n\n
/{[^}]*$\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. /\xe2\x80\x93 搜索
  2. \n
  3. {\xe2\x80\x93 一个{字符
  4. \n
  5. [^}]\xe2\x80\x93 后跟任何不是字符的字符}
  6. \n
  7. *\xe2\x80\x93\xc2\xa0重复0次或多次
  8. \n
  9. $\xe2\x80\x93 直到行尾
  10. \n
\n\n

Vim 正则表达式并不总是与 Perl 中的相同,但这个特定的正则表达式是。)

\n\n

您可以通过将其放入您的:来定义第二次搜索的映射.vimrc

\n\n
noremap <Leader>nb /{[^}]*$<CR>\n
Run Code Online (Sandbox Code Playgroud)\n\n

<Leader>这样您就可以通过按(\\默认情况下)跳到下一个块n b

\n\n

由于它使用:noremap,它也会影响选择模式<Leader>如果您是可打印字符(默认情况下),您将\xe2\x80\x99 不希望这样。sunmap <Leader>nb在这种情况下,请在上一行下方添加一行以修复选择模式。

\n