假设我在 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{ 的whilewhile块内的第一行(调用write_log)搜索{不是一个选项,因为可能有许多{不启动新的内部代码块 - 例如,请参阅some_function.
看来您正在定义一个 \xe2\x80\x9ccode 块\xe2\x80\x9d 来包含{ }至少一行。{您只需在行尾搜索 a 即可最轻松地搜索这些内容:
/{$\nRun Code Online (Sandbox Code Playgroud)\n\n/{表示搜索 a {,并$表示到行尾的锚点。
在某些情况下,a{打开一个块,但不是一行的最后一个字符:
/{$\nRun Code Online (Sandbox Code Playgroud)\n\n考虑到这一点,请执行以下搜索以查找{同一行上未关闭的 a:
/{[^}]*$\nRun Code Online (Sandbox Code Playgroud)\n\n/\xe2\x80\x93 搜索{\xe2\x80\x93 一个{字符[^}]\xe2\x80\x93 后跟任何不是字符的字符}*\xe2\x80\x93\xc2\xa0重复0次或多次$\xe2\x80\x93 直到行尾(Vim 正则表达式并不总是与 Perl 中的相同,但这个特定的正则表达式是。)
\n\n您可以通过将其放入您的:来定义第二次搜索的映射.vimrc:
noremap <Leader>nb /{[^}]*$<CR>\nRun Code Online (Sandbox Code Playgroud)\n\n<Leader>这样您就可以通过按(\\默认情况下)跳到下一个块n b。
由于它使用:noremap,它也会影响选择模式。<Leader>如果您是可打印字符(默认情况下),您将\xe2\x80\x99 不希望这样。sunmap <Leader>nb在这种情况下,请在上一行下方添加一行以修复选择模式。