Enrole todas as linhas com sequência de caracteres no vim

0

Então, basicamente eu copio / colo alguns códigos, e preciso adicionar e acrescentar mais um código a cada linha. Cada linha é uma chamada de função e está sendo adicionada a uma instrução switch como se fosse o caso dela.

Neste momento, parece que:

switch(n)
{
    case 1: retVal = foo("bar"); break;
    case 2: retVal = foo("Bar"); break;
    foo("bAr");
    foo("BAr");
    foo("BAR");
}

E eu preciso que pareça:

switch(n)
{
    case 1: retVal = foo("bar"); break;
    case 2: retVal = foo("Bar"); break;
    case 3: retVal = foo("bAr"); break;
    case 4: retVal = foo("BAr"); break;
    case 5: retVal = foo("BAR"); break;
}

O melhor que eu tenho é:

:'<,'>s/I DONT KNOW/case SOMETHING: retVal = & break;/g

em que I DON'T KNOW e SOMETHING precisam ser alterados. O problema é que eu não estou confortável o suficiente com regex para saber o que colocar lá. Alguma idéia?

Editar: Depois de ver a resposta de Muru, percebi que deveria ter postado este link para a parte de numeração. O exemplo 11 mostra uma maneira de renumerar uma sequência usando regex, supondo que você tenha uma sequência existente.

    
por adam-watson 01.07.2015 / 17:52

1 resposta

1

Assumindo que sua seleção de modo visual esteja limitada às linhas com apenas foo(...); , o melhor que posso encontrar é:

:let c=2|'<,'>g//let c=c+1|s/\v\S+/\="case ".c.": retVal = ".submatch(0)." break;"/

Mais claramente:

let counter = 2
'<,'>g//                       " for some reason, we need both markers and g// for 'let' to work
   let counter = counter + 1
   s/
     \v                        " '\v' is "very magic"
     \S+/                      " used for '\S' - all non-whitespace characters
          \=                   " Indicate that replacement is an expression
             "case " .         " '.' concatenates strings
             counter . 
             ": retVal = " . 
             submatch(0) . 
             " break;"
                            /

Adaptado de este post do Vim wikia .

Sim, eu sei. Isso é feio. Existe uma maneira melhor.

Outra maneira, usando macros: (Iniciar da primeira linha sem o case )

qq
k:s/\v(case \d+: retVal = )(.*)\n(\s*)(.*)/\r break;/|exe "norm \<c-a>"
j
q

Em seguida, use @q quantas vezes houver linhas.

    
por 01.07.2015 / 18:41