O caminho do ambiente de substituição do VIM para incluir o caminho

0

Eu quero criar um caminho include a partir de uma variável de ambiente em vim . Quero manter apenas as instâncias que terminam como /share/bin nessa variável e alterá-las para include . Eu quero fazer isso em .vimrc , por esse motivo eu usei a função vim substitute() .

Como teste, usarei esta variável:

export TEST=/afs/test/share/bin:/afs/test2/share/bin:/afs/test/bin:/afs/test3/share/bin:/cvmfs/x86_64-slc6-gcc47-opt/share:/cvmfs/x86_64-slc6-gcc47-opt/bin

O resultado desejado para este exemplo é:

TEST=/afs/test/include /afs/test2/include /afs/test3/include

Enquanto tentava alcançar esse resultado, fiquei com as duas perguntas a seguir:

Question1

Como estava com problemas para usar o método vim substitute() (explicado abaixo), abri um arquivo, digamos lala , com o mesmo texto da variável de ambiente $TEST :

/afs/test/share/bin:/afs/test2/share/bin:/afs/test/bin:/afs/test3/share/bin:/cvmfs/x86_64-slc6-gcc47-opt/share:/cvmfs/x86_64-slc6-gcc47-opt/bin

E usei o comando s/share\/bin:/include /g para obter:

/afs/test/include /afs/test2/include /afs/test/bin:/afs/test3/include /cvmfs/x86_64-slc6-gcc47-opt/share:/cvmfs/x86_64-slc6-gcc47-opt/bin

depois, usei o comando %s#\(/.*include\)\(.*\)##g , resultando:

/afs/test/include /afs/test2/include /afs/test/bin:/afs/test3/include

Mas quando eu faço no vim

:echo substitute(substitute($TEST,"share/bin:","include ","g"),"\(/.*include\)\(.*\)","","g")

Eu recebo:

/afs/test/include /afs/test2/include /afs/test/bin:/afs/test3/include /cvmfs/x86_64-slc6-gcc47-opt/share:/cvmfs/x86_64-slc6-gcc47-opt/bin

então, minha primeira pergunta é:

Por que substitute() não fornece o mesmo resultado ao usar substitute ?

Question2

E, finalmente, desejo remover todas as instâncias semelhantes a /afs/test/bin: de:

/afs/test/include /afs/test2/include /afs/test/bin:/afs/test3/include

, isto é, que não incluem nele. Eu estava tentando:

%s#\(/.\{-}include\)\@<=\(/| \)\{-}.\{-}:# #

Mas está combinando /afs/test2/include /afs/test/bin: e dando como resultado:

/afs/test/include /afs/test3/include

Como posso remover as instâncias de texto que não têm / share / bin?

    
por Werner 14.11.2014 / 14:45

1 resposta

2

Seu código não é fácil de seguir e, em geral, substitute() deve se comportar como :s , então não posso explicar o problema exato. No entanto, toda a sua abordagem depende apenas das substituições de texto, e isso o torna tão complexo. Desde a versão 7, o Vim tem funções (inspiradas no Python) para trabalhar em Lists, e é isso que eu usaria aqui. Eu mostro isso passo a passo:

" Setup
let $TEST='/afs/test/share/bin:/afs/test2/share/bin:/afs/test/bin:/afs/test3/share/bin:/cvmfs/x86_64-slc6-gcc47-opt/share:/cvmfs/x86_64-slc6-gcc47-opt/bin'

" Turn into List.
let dirs = split($TEST, ':')

" Remove unwanted dirs, then substitute the rest.
call filter(dirs, 'v:val =~# "/share/bin$"')
call map(dirs, 'substitute(v:val, "/share/bin$", "/include", "")')

" Combine back into String.
let result = join(dirs, ' ')
echo result

Saída:

/afs/test/include /afs/test2/include /afs/test3/include
    
por 14.11.2014 / 15:03

Tags