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

时间:2014-10-13 16:36:58

标签: perl vim

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

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

并将光标放在some_function行的开头,我如何将光标移动到以下任何一个:

  • while
  • 的开头
  • {
  • while
  • while块内的第一行(通过调用write_log

搜索{不是一种选择,因为可能有许多{无法启动新的内部代码块 - 例如,请参阅some_function的参数。

2 个答案:

答案 0 :(得分:4)

您似乎正在定义一个包含至少一行的“{code}”{ }。只需在一行末尾搜索{,您就可以轻松搜索这些内容:

/{$

/{表示搜索{,而$表示该行末尾的锚点。

可能会出现{打开一个块但不是一行的最后一个字符的情况:

while (some_other_funtion($_)) { # this while is very important
   write_log('working');
}

要考虑到这一点,请执行以下搜索未在同一行关闭的{

/{[^}]*$
  1. / - 搜索
  2. { - {个字符
  3. [^}] - 后跟任何不是}
  4. 的字符
  5. * - 重复0次或以上
  6. $ - 直到行尾
  7. Vim regexes并不总是与Perl相同,但这个特殊的是。)

    您可以通过将其放入.vimrc

    来定义第二次搜索的映射
    noremap <Leader>nb /{[^}]*$<CR>
    

    通过按<Leader>(默认为 \ n b ,可以跳转到下一个区块。

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

答案 1 :(得分:0)

%,$和^是您最好的朋友。 (光标指向匹配的机柜,行尾,行首)。

在代码块的开始处有':1 $',将光标置于第一个括号内。

%将使您进入代码块的下一个“匹配”端,前提是它处于平衡状态。如果您的代码不平衡,则光标将不会移动。实际上,它会计算紧随其后的匹配类型的打开和闭合大括号,如果不平衡,光标将不会移动。通常终端会发出蜂鸣声:如“ Doh!Doh!你有问题。'这非常有用,并且可以与'{} []()'

检查代码并确保块结尾存在的好方法。它将跳过括号(或括号或方括号)之间存在的尽可能多的行,以将光标放置在匹配的外壳上。

这个文件很小,但假设您位于第1行(:1)

:1 $-行首代码块结束

:2 - puts the cursor at the 'f' in 'for' on line 2 rather than the white space preceding.
%  - jumps you to the closing ')' on that line. 
%  - jumps you to the opening '(' on that line.
$  - takes you to the '{' which opens the for loop code
%  - jumps the cursor to the ending '}' of the for loop
%  - takes you back to the top (% is bi-directional. )

玩。 Intellij的文本编辑器具有vim模式是有原因的。功能强大。

此外,这里的vim手册还不错,涵盖了其中的一些内容以及更多内容。

https://www.pks.mpg.de/~mueller/docs/suse10.1/suselinux-manual_en/manual/sec.suse.vim.html