Option `set` mit Variablen

8

Ich versuche neu zu schreiben und der Option einen String mit Variable hinzuzufügen. Die ursprüngliche Zeichenfolge ist

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

Das Folgende ist die Arbeitsweise let:

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

Ich bin interessiert, wie ich es umschreibe set. Der folgende Code (und einige andere Variationen) funktioniert nicht

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

Was ist der richtige Weg, um Variablen im Ausdruck zu verwenden set?

Webstuhl
quelle

Antworten:

9

Sie könnten verwenden :exe, aber dies ist äußerst umständlich zu verwenden und Sie müssen ein paar Dinge entkommen.

Ich habe früher meine eigene Pfadfixierungsfunktion verwendet. Es sah aus wie:

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

let &rtp = expression ist wirklich unser Freund.

Aber in der Tat spielt es nicht gut mit +=. Deshalb habe ich mir lh#path#munge()das ausgedacht, das auf einer anderen Funktion beruht lh#list#add_if_new(). Genau genommen set +=wird von emuliert lh#list#add_if_new(). munge()behält vorhandene Pfadnamen oder Globbing-Muster bei, die mit den Dingen übereinstimmen.

" 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

Sie werden in lh-vim-lib definiert und verwaltet .

Luc Hermitte
quelle
1
Sie müssen auch Kommas in der: Set Call
Christian Brabandt
4

Sie können eine Umgebungsvariable verwenden, die in Ihrer aktuellen Shell-Sitzung definiert ist.

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

Auf diese Weise können Sie auch andere Variablen verwenden, um den Pfad zu erstellen:

let $myvimdir = $HOME.'/vimfiles'

Und legen Sie den Laufzeitpfad fest:

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

Weitere Informationen zu Umgebungsvariablen in vim : help expr-env

iznav
quelle
1
Interessant. Aber wenn ich es versuche let $nts | set ts=$nts, mag es vim nicht.
22.
Dies liegt daran, dass Umgebungsvariablen als Zeichenfolgen gespeichert werden und tabstop eine Zahl erwartet.
Iznav