Como inserir a variável vimscript e a string na pesquisa vim e substituir

3

Acabei de descobrir sobre a existência do Vimscript a partir de hoje, então me perdoe se essa pergunta for mais básica do que parece, mas tenho lutado para encontrar uma resposta para essa pergunta durante a maior parte do dia .

Eu estou trabalhando em um arquivo no vim onde eu tenho que fazer um grande número de ações repetidas. Por exemplo, meu arquivo é parecido com isto:

    firstname
    secondname
    thirdname
    fourthname
    fifthname
    sixthname
    ...

A lista continua, e o que eu gostaria de fazer é anexar uma string fixa ao final de cada linha, de modo que cada linha termine com um número crescente, ou seja:

    firstname = _first1
    secondname = _first2
    thirdname = _first3
    fourthname = _first4
    fifthname = _first5
    sixthname = _first6
    ...

Eu sei que poderia escrever um pequeno script para resolver esse problema, mas fui atraído pela perspectiva de usar o vimscript para fazer tudo dentro do vim, e essa é uma habilidade que eu gostaria de adquirir. Até agora eu trabalhei uma função como tal para rodar no modo de comando do vim:

    :let i=1 | g/name/s//\=i/ | let i=i+1

O que parece promissor, já que o resultado é quase o que eu quero:

    first1
    second2
    third3
    fourth4
    fifth5
    sixth6
    ...

Mas não importa como eu tentei modificá-lo, não consigo imprimir uma string (= _first) seguida do número incrementado. Por exemplo, isso ...

    :let i=1 | g/name/s//name = _first\=i/ | let i=i+1

Produz isso.

    firstname = _first=i
    secondname = _first=i
    thirdname = _first=i
    fourthname = _first=i
    fifthname = _first=i
    sixthname = _first=i
    ...

e isso ...

    :let i=1 | execute 'g/name/s//name = _first' . i . '/' | let i=i+1

Produz isso.

    firstname = _first1
    secondname = _first1
    thirdname = _first1
    fourthname = _first1
    fifthname = _first1
    sixthname = _first1
    ...

Eu tentei outras combinações, mas neste momento eu estou praticamente esfaqueando no escuro. Tudo que eu tento parece obter uma variável de incremento sem string, ou uma string com uma variável estática. Como eu poderia fazer isso com o vimscript?

Editar:

Estou dando a resposta correta para Ingo Karkat, pois isso me levou diretamente a como resolver meu problema. Para a posteridade, aqui está o código que acabei usando:

    :let i=1 | 1156,1271g/$/s//\=' = _first' . i/ | let i=i+1

produzindo:

    firstname = _first1
    secondname = _first2
    thirdname = _first3
    fourthname = _first4
    fifthname = _first5
    sixthname = _first6
    ...

As únicas pequenas diferenças no meu código (projeto específico) eram que ele operava apenas nas linhas 1156 a 1271 e era anexado ao final da linha sem substituir nenhum texto.

    
por CaffeineConnoisseur 04.09.2013 / 05:51

1 resposta

4

Depois que você usar sub-replace-special , introduzido com \= , tudo terá que ser uma expressão do Vim; você não pode adicionar / anexar texto de substituição literal. Portanto, seu texto estático deve ser codificado como Strings e concatenado com . :

:let i=1 | g/name/s//\='_first' . i/ | let i=i+1
    
por 04.09.2013 / 17:42