Python:使用 VIM 选择逻辑代码块

dot*_*hen 5 vim python selection

如何使用 VIM 选择逻辑缩进的代码块?例如,考虑一下 Python:

01:class Foo(object):
02: 
03:    def __init__(self, bar):
04:
05:        if 'baz' in bar:
06:            print("I love baz!")
07:
08:            print("You made the best choice!")
09:
10:        elif 'boo' in bar:
11:            print("I like boo!")
12:
13:        else:
14:            print("I like your choice!")
15:
16:        self.choice = bar
17:        self.someList = []
18:
19:        print("Foo sucessfully created!")
20:
21:
22:    def bim(self):
23:        print("Bam boo")
24:        return True
Run Code Online (Sandbox Code Playgroud)

如何选择所有常用缩进的行?也就是说,如果我在 06 行,它会选择 06-08 行(包括)?或者,如果我在第 16 行,它会选择第 05-19 行。

如何选择所有常用缩进的行以及“初始化”它的行?也就是说,如果我在 06 行,它会选择 05-08 行(包括)?或者,如果我在第 16 行,它会选择第 03-19 行。

如何轻松地将上级缩进添加到选择中?也就是说,如果我__init__选择了方法,我将如何过渡到选择整个类?

这个问题涵盖了许多其他(通常没有答案)VIM/Python 问题的一般情况,例如这个问题。我最初的倾向是悬赏这个问题,但实际上我更愿意知道这个更一般的情况,这将有助于在这种情况下和其他情况下的用户。

小智 9

看看vim-indent-object插件,它定义了一个基于缩进级别的新文本对象。它提供以下映射(取自文档):

    Key Mapping       Description

    <count>ai         (A)n (I)ndentation level and line above.
    <count>ii         (I)nner (I)ndentation level (no line above).
    <count>aI         (A)n (I)ndentation level and lines above/below.
    <count>iI         (I)nner (I)ndentation level (no lines above/below).
Run Code Online (Sandbox Code Playgroud)

所以:

  • vii选择所有常用缩进的行

  • 按下vai以选择所有常用缩进的行以及“初始化”它的行

请注意,选择缩进级别后,您可以再次按ii或进一步ai。例如,如果您在第 06 行并按vai,则会选择第 05-08 行。如果你ai再次按下,你会得到整个__init__()选择(即第 03-19 行)。再按ai一次将选择整个班级。