Vim: Qual é a diferença entre esses dois métodos de configuração de uma variável?

1

No meu .vimrc , tenho a seguinte variável definida:

let $VIMFILES = "~/.vim"

Além disso, no meu .vimrc , tento definir a opção backupdir da seguinte forma:

set backupdir=$VIMFILES/backup
" 'set backupdir?' will return: backupdir=~/.vim/backup

No entanto, isso não funciona. A tentativa de :w de um arquivo falhará e retornará o seguinte:

"foo" E510: Can't make backup file (add ! to override)

Curiosamente, definir backupdir usando o método a seguir funciona bem ...

exec "set backupdir=" . $VIMFILES . "/backup"
" Like the first method, 'set backupdir?' will
" also return: backupdir=~/.vim/backup

Alguém pode esclarecer por que o primeiro método falha e o segundo método funciona, apesar de backupdir ter o valor desejado em ambos os casos? Estou usando alguma técnica imprópria e, em caso afirmativo, o que devo usar?

    
por ZeroKnight 16.01.2014 / 09:28

1 resposta

2

Eu posso reproduzir isso e, de fato, parece bastante intrigante. Uma coisa complicada é que :set backupdir? não imprime necessariamente o valor da opção real; ele realiza algumas transformações, então o que você vê nem sempre é o que é usado.

Acho que o problema está no uso do ~/ na variável $VIMFILES . Quando você diretamente :set a opção (como emulado pela última :execute tentativa), o Vim parece expandir isso automaticamente. Mas quando você atribui isso a uma variável de ambiente, ela é mantida literalmente e, devido à falta de expansão, o :write falha. Observe que a saída é idêntica porque o Vim aparentemente traduz automaticamente /home/username de volta para ~ na saída.

Eu resolveria isso expandindo explicitamente o valor da variável:

let $VIMFILES = expand("~/.vim")
    
por 16.01.2014 / 10:31

Tags