opção `set` com variáveis

8

Estou tentando reescrever a adição de uma seqüência de caracteres para a opção com variável. A sequência original é

set rtp+=~/.vim/bundle/Vundle.vim

A seguir está a letmaneira de trabalhar :

let MYVIMDIR='/home/loom/foo'
let &rtp .= ','.expand(MYVIMDIR).'/bundle/Vundle.vim'

Estou interessado em como reescrevê-lo set. O código a seguir (e algumas outras variações) não funciona

let MYVIMDIR='/home/loom/foo'
set rtp+=expand(MYVIMDIR).'/bundle/Vundle.vim'

Qual é a maneira correta de usar variáveis ​​na expressão set?

Tear
fonte

Respostas:

9

Você pode usar :exe, mas isso é extremamente complicado de usar e você precisará escapar de algumas coisas.

Eu costumava usar minha própria função de correção de caminho. Parecia com:

exe 'set rtp+='.lh#path#fix(somevariable)
" with standard tools, may be it'd be (untested)
exe 'set rtp+='.escape(somevariable, ' \|,')

let &rtp = expression é realmente nosso amigo.

Mas, de fato, não funciona bem +=. É por isso que eu inventei lh#path#munge()que depende de outra função lh#list#add_if_new(). Estritamente falando, set +=é imitado por lh#list#add_if_new(). munge()mantém nomes de caminho que existem, ou na verdade padrões que combinam com as coisas.

" Function: lh#path#munge(pathlist, path) {{{3
function! lh#path#munge(pathlist, path) abort
  if type(a:pathlist) == type('str')
    let pathlist = split(a:pathlist, ',')
    return join(lh#path#munge(pathlist, a:path), ',')
  else
    " if filereadable(a:path) || isdirectory(a:path)
    if ! empty(glob(a:path)) " support '/**' for &tags
      call lh#list#push_if_new(a:pathlist, a:path)
    endif
    return a:pathlist
  endif
endfunction

" Function: lh#list#push_if_new(list, value) {{{3
function! lh#list#push_if_new(list, value) abort
  if index(a:list, a:value) < 0
    call add (a:list, a:value)
  endif
  return a:list
endfunction

Eles são definidos e mantidos em lh-vim-lib .

Luc Hermitte
fonte
11
você também precisa escapar vírgulas no: chamada set
Christian Brabandt
4

Você pode usar uma variável de ambiente definida na sua sessão atual do shell.

let $myvimdir = '/home/abc/vimfiles'

Dessa forma, você também pode usar outras variáveis ​​para compor o caminho:

let $myvimdir = $HOME.'/vimfiles'

E defina o caminho do tempo de execução:

set rtp+=$myvimdir/bundle/Vundle.vim

Mais informações sobre variáveis ​​de ambiente no vim : help expr-env

iznav
fonte
11
Interessante. Mas quando tento let $nts | set ts=$nts, o vim não gosta.
tivn
Isso ocorre porque as variáveis ​​de ambiente são armazenadas como seqüências de caracteres e o tabstop espera um número.
iznav