views:

797

answers:

2

I'm trying to get a variable expanded in a command call. Here's what I have in my .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

At the : prompt, the `=flist` syntax seems to work (or, at least it did with a w: variable), but in the .vimrc file it doesn't — TlistAddFiles is just passed the string `=flist`.


Thanks to Andrew Barnett's and Mykola Golubyev's answers, I've now got this, which appears to work. Is there no better way?

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
+3  A: 

Try just

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

To your edit:

 let flist = split(findres, '\n')
 call map(flist, 'fnameescape(v:val)')
Mykola Golubyev
TlistAddFiles flist just passes the string flist.
derobert
TlistAddFiles string(joined) .... passes string(joined). And the join() line complains that a list is required.
derobert
Yeah, the exec seems required.
derobert
+1  A: 

Something like

exe "TlistAddFiles `=".flist

might work.

Andrew Barnett
Thats closer. Passes a string like View/JSON.pm^@View/TT.pm^@ ... just need to figure out how to split on null and also pass each to filenameescape.
derobert
FYI: I used exe "TlistAddFilesRecursive " . flist ... the `= stuff is weird syntax that makes the expansion work at the : prompt.
derobert
I think the null is coming from Vim trying to get rid of the newlines....
derobert
In that case, how about an 'xargs' at the end of your system string?
Andrew Barnett
Well, that'd make problems for file names with spaces in them. But I've come up with something that (while ugly) works... See the question update.
derobert