如何在vim命令中扩展变量?

13

我想在命令调用中获取一个变量的值。这是我在.vimrc文件中的代码:

command! -nargs=1 -complete=dir TlAddPm call s:TlAddPm(<f-args>)
function! s:TlAddPm(dir)
    let flist = system("find " . shellescape(a:dir) . " -type f -name '*.pm' | sort")
    TlistAddFiles `=flist`
endfun

:提示符下,`=flist`语法似乎有效(或者至少在使用变量w:时有效),但在.vimrc文件中它不起作用——TlistAddFiles只是传递了字符串`=flist`


感谢Andrew Barnett和Mykola Golubyev的答案,现在我已经得到了这个结果,看起来它是有效的。没有更好的方法吗?

command! -nargs=1 -complete=dir TlAddPm call s:TlAddPm(<f-args>)
function! s:TlAddPm(dir)
    let findres = system("find " . shellescape(a:dir) . " -type f -name '*.pm' | sort")
    let flist = []
    for w in split(findres, '\n')
        let flist += [ fnameescape(w) ]
    endfor
    exe "TlistAddFiles " . join(flist)
endfun

TlistAddFiles 的定义是什么? - Mykola Golubyev
这是来自于taglist插件http://vim-taglist.sourceforge.net/。 - derobert
你会从 .vimrc 中调用 s:TlAddPm(dir) 吗? - Mykola Golubyev
是的,我从 .vimrc 中调用它...请查看命令行!(代码示例中的第一行) - derobert
检查一下你的代码重构。 - Mykola Golubyev
2个回答

7

尝试一下

let joined = join(split(flist))
exec 'TlistAddFiles '.joined

针对您的编辑:

 let flist = split(findres, '\n')
 call map(flist, 'fnameescape(v:val)')

TlistAddFiles函数只是传递字符串flist。 - derobert
TlistAddFiles string(joined) .... 传递了字符串(joined)。而join()行抱怨需要一个列表。 - derobert
是的,似乎需要执行。 - derobert

3

类似于以下内容:

exe "TlistAddFiles `=".flist

可能会起作用。


更接近了。传递一个字符串,例如View/JSON.pm^@View/TT.pm^@ ... 只需要弄清如何在 null 上进行分割,并将每个传递给 filenameescape。 - derobert
FYI:我使用了exe“TlistAddFilesRecursive”。= stuff是一种奇怪的语法,使得扩展在冒号提示符下工作。 - derobert
那么,在你的系统字符串末尾加上一个“xargs”怎么样? - Andrew Barnett
那会对文件名中带有空格的文件造成问题。但我想出了一个(虽然不太美观)可行的解决方案... 请参见问题更新。 - derobert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接