假设我在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
的参数。
答案 0 :(得分:4)
您似乎正在定义一个包含至少一行的“{code}”{
}
。只需在一行末尾搜索{
,您就可以轻松搜索这些内容:
/{$
/{
表示搜索{
,而$
表示该行末尾的锚点。
可能会出现{
打开一个块但不是一行的最后一个字符的情况:
while (some_other_funtion($_)) { # this while is very important
write_log('working');
}
要考虑到这一点,请执行以下搜索未在同一行关闭的{
:
/{[^}]*$
/
- 搜索{
- {
个字符[^}]
- 后跟任何不是}
*
- 重复0次或以上$
- 直到行尾(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