4

Как выбрать блоки кода с логическим отступом в 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

Как я могу выбрать все строки общего отступа? То есть, если я в строке 06, он выберет строки 06-08 (включительно)? Или, если я в строке 16, он выберет строки 05-19.

Как я могу выбрать все строки с общим отступом и дополнительно строку, которая его «инициализирует»? То есть, если я в строке 06, он выберет строки 05-08 (включительно)? Или, если я в строке 16, он выберет строки 03-19.

Как я могу легко добавить к выделению отступ верхнего уровня? То есть, если бы я выбрал метод __init__ , как бы я тогда перешел к выбору всего класса?

Этот вопрос охватывает общий случай многих других (часто без ответа) вопросов VIM/Python, таких как этот. Первоначально я хотел назначить награду за этот вопрос, но я бы предпочел узнать этот более общий случай, который поможет пользователям в этой ситуации и в других ситуациях.

1 ответ1

7

Взгляните на плагин 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).

Следовательно:

  • Нажмите vii чтобы выбрать все строки с общим отступом

  • Нажмите vai чтобы выбрать все строки с общим отступом и дополнительно строку, которая его «инициализирует»

Обратите внимание, что после выбора уровня отступа вы можете пойти дальше, снова нажав ii или ai . Например, если вы находитесь в строке 06 и нажимаете vai , выбираются строки 05-08. Если вы снова нажмете ai , вы получите весь выбранный __init__() (т.е. строки 03-19). Повторное нажатие ai выберет весь класс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .