Python: selecione blocos de códigos lógicos com o VIM

5

Como alguém seleciona o código logicamente indentado bloqueia com o VIM? Por exemplo, considere este pedaço de 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

Como posso selecionar todas as linhas de recuo comum? Ou seja, se eu estiver na linha 06, selecionaria as linhas 06-08 (inclusive)? Ou se estou na linha 16, selecionaria as linhas 05-19.

Como posso selecionar todas as linhas de recuo comum e, adicionalmente, a linha que 'inicializa'? Ou seja, se estou na linha 06, selecionaria as linhas 05-08 (inclusive)? Ou se estou na linha 16, selecionaria as linhas 03-19.

Como posso adicionar facilmente à seleção o recuo de nível superior? Ou seja, se eu tiver o método __init__ selecionado, como eu faria a transição para ter a turma inteira selecionada?

Esta questão engloba o caso geral de muitas outras perguntas (muitas vezes não respondidas) do VIM / Python, como este . Minha inclinação inicial era colocar uma recompensa por essa questão, mas eu realmente preferiria conhecer esse caso mais geral, que ajudaria os usuários nessa situação e em outras situações.

    
por dotancohen 20.11.2013 / 11:22

1 resposta

8

Veja o plug-in vim-indent-object , que define um novo objeto de texto com base no recuo níveis. Ele fornece os seguintes mapeamentos (retirados da documentação):

    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).

Portanto:

  • Pressione vii para selecionar todas as linhas de recuo comum

  • Pressione vai para selecionar todas as linhas de recuo comum e, adicionalmente, a linha que 'inicializa'

Observe que depois de selecionar um nível de recuo, você pode ir mais longe pressionando ii ou ai novamente. Por exemplo, se você estiver na linha 06 e pressionar vai , as linhas 05-08 serão selecionadas. Se você pressionar ai novamente, obterá todo o __init__() selecionado (ou seja, linhas 03-19). Pressionar ai mais uma vez selecionará a turma inteira.

    
por 20.11.2013 / 12:34