13

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
derobert
  • 49,731
  • 15
  • 94
  • 124

2 Answers2

7

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
  • 57,943
  • 15
  • 89
  • 102
3

Something like

exe "TlistAddFiles `=".flist

might work.

Andrew Barnett
  • 5,066
  • 1
  • 22
  • 25
  • 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 Mar 20 '09 at 16:16
  • FYI: I used exe "TlistAddFilesRecursive " . flist ... the `= stuff is weird syntax that makes the expansion work at the : prompt. – derobert Mar 20 '09 at 16:17
  • In that case, how about an 'xargs' at the end of your system string? – Andrew Barnett Mar 20 '09 at 16:34
  • 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 Mar 20 '09 at 16:38