É possível combinar:% s / \ = e | no vim?

3

O que segue é mais ou menos o que estou tentando fazer no vim

:let g:ID = 1
:%s/^/\= g:ID | let g:ID = g:ID * 1.2/

Agora, parece que o vim desconsidera tudo depois do bar (essa é a parte let g:ID = g:ID * 1.2 .

Eu poderia escrever uma função que multiplica g: ID com 1.2 e retorna o valor de g: ID, mas eu gostaria de renunciar a isso.

Obrigado René

editar para maior clareza:

No script vim, posso escrever várias instruções na linha uma se eu usar a barra (|) para encadear as mesmas. Então, ao invés de

let g:ID = 20
let g:ID = g:ID * 1.2
let g:ID = g:ID * 1.2

Eu também posso escrever

  let g:ID = 20 | let g:ID = g:ID * 1.2 | let g:ID = g:ID * 1.2

Agora, o thingy \ = permite-me substituir uma expressão regular por uma expressão de script vim. Por exemplo, eu poderia fazer um

:%s/ABC/\=line(".")/

que substituiria todas as ocorrências de ABC em meu buffer atual com o número da linha na qual ele é encontrado.

Da mesma forma, um

:%s/^/\=g:ID/

gravaria o valor atual de g: ID no início de cada linha no meu buffer.

Tudo bem, mas gostaria de ter mais de uma expressão na parte de substituição e queria saber se conseguiria isso encadeando essas expressões com a barra. No meu caso, gostaria de manipular g: ID após cada chamada de substituição, daí

:let g:ID=20
:s/^/\=g:ID|let g:ID=g:ID * 1.2/

resultaria em escrever 20 no início da primeira linha no meu buffer, 24 no início da segunda linha no meu buffer, 28.8 no início da terceira linha no meu buffer e assim por diante.

Espero ter me tornado mais claro agora.

    
por René Nyffenegger 05.11.2009 / 11:40

3 respostas

3

Você pode usar :global quando seu comando é executado para cada linha.

:let g:ID = 1
:g//s//\=g:ID/ | let g:ID = g:ID + 1

Se você deseja restringir a substituição, limite o padrão :global ou prefixar :global com um intervalo ou ambos.

:10,20g/foo/s/^/\=g:ID/ | let g:ID = g:ID + 1

Isso deve preceder o g:ID incrementado para cada linha que corresponda a foo da linha 10 a 20 (inclusive).

    
por 20.04.2011 / 19:33
1

Você pode precisar definir uma função:

function! Accu(varname, mult)
  let old = {a:varname}
  let {a:varname} = {a:varname} * a:mult
  return old
endfunction

e use desta forma:

:let g:ID = 1
:%s/^/\=Accu('g:ID', 1.2)/
    
por 06.11.2009 / 16:29
0

Experimente <bar> em vez de | Dê uma olhada em: link

    
por 06.11.2009 / 10:38

Tags