変数付きの `set`オプション


8

変数を使用してオプションに文字列を追加することを書き直そうとしています。元の文字列は

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

以下は作業let方法です:

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

で書き換える方法に興味がありますset。次のコード(および他のいくつかのバリエーション)は機能しません

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

式で変数を使用する正しい方法は何setですか?

回答:


9

を使用することもできます:exeが、これは使用が非常に面倒であり、いくつかのことを回避する必要があります。

以前は自分のパス修正機能を使っていました。それは次のように見えました:

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

let &rtp = expression 本当に友達です。

しかし、実際には、これはとはうまく機能しません+=。それが私がlh#path#munge()別の機能に依存することを思いついた理由lh#list#add_if_new()です。厳密に言えばset +=、によってエミュレートされlh#list#add_if_new()ます。munge()存在するパス名、または実際に一致するグロビングパターンを保持します。

" 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

これらはlh-vim-libで定義および保守されています。


1
:set呼び出しでコンマをエスケープする必要もあります
Christian Brabandt

4

現在のシェルセッション内で定義された環境変数を使用できます。

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

そうすれば、他の変数を使用してパスを構成することもできます。

let $myvimdir = $HOME.'/vimfiles'

ランタイムパスを設定します。

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

vim内の環境変数に関する詳細情報:help expr-env


1
面白い。しかし、私がで試したときlet $nts | set ts=$nts、vimはそれが好きではありません。
18

これは、環境変数が文字列として格納され、タブストップが数値を期待しているためです。
iznav 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.