如何将system()调用结果的每一行写入Vimscript中的列表?

时间:2011-06-20 12:57:44

标签: vim

我想使用Vimscript循环遍历目录中的文件。阅读usr_41.txt并进行了搜索,我能想到的最好的就是let dir_contents = system('ls')

但是由于system()没有返回列表,我无法循环它。有没有一种方法可以将系统调用的结果保存为列表,还是已经这样做的Vim命令或函数?

5 个答案:

答案 0 :(得分:4)

您可以获得一个包含split(system('ls'), '\n')的列表,该列表会为您提供一个文件列表,前提是您没有包含换行符的文件。

答案 1 :(得分:1)

尝试类似

的内容
split(system('ls', nr2char(10))

我目前不在Unix系统上,所以我不能自己尝试,但它适用于Windows(和dir),例如

for FILE in split(system('dir /b', nr2char(10))
  echo 'File is: ' . FILE
endfor

答案 2 :(得分:1)

内置glob()功能。要获取Windows上当前目录中的文件列表,可以使用split(glob('.\\*'), "\n")。在* nix上,它更复杂,因为

  1. POSIX允许除NULL之外的所有内容都在文件名中。这里的一切意味着也允许使用换行符(“\ n”)。
  2. glob()函数不会返回以dot开头的文件名,除非明确请求(使用glob('dir/.*'))。
  3. 当明确要求列出以点glob()开头的文件名时,还会显示.(当前目录)和..(父目录)特殊目录。
  4. 为了解决这个问题,你必须使用this之类的东西(或者使用带有python支持的vim和python自己的os.listdir函数)。

    如果您不介意在依赖项中使用frawor,则可以执行以下操作:

    execute frawor#Setup('0.0', {'@/os': '0.0'})
    <...>
    let dir_contents=s:_r.os.listdir('.')
    

    关于从shell命令获取行列表:如果您知道启动的命令不会输出NULL,则可以使用split(system(cmd), "\n", 1)(如果您不关心空行,则可能没有最后一个参数)。如果您知道该命令可能会输出NULL并且您希望保留它们,则必须执行更多操作:

    noautocmd new
    read !cmd
    let s:shell_output=getline(2, line('$'))
    noautocmd bwipeout!
    

    请注意,在这种情况下,NULL将替换为s:shell_output列表中的换行符,而实际换行符将表示为字符串结尾。

答案 3 :(得分:1)

我刚刚发现这些答案有一个微妙之处:

目前(2018年1月),vim有systemlist()可以很好地满足您的需求:

let l:ls=systemlist("ls")
" or let dir_contents=etc etc

然而,如果你正在做的事情除了&#34; ls&#34;你可能遇到一些奇怪的棘手行为:尾随空行将被删除(截至2018年1月)。如果这不是问题,请不要担心,请使用systemlist()并感到高兴。如果这是一个问题,你可能想做这样的事情:

let l:myvar=system("myprogram -that -returns -blank -lines")
l:mylist=split(l:myvar, "\n", 1) " the 1 is to keep empty lines

希望能帮助别人!

答案 4 :(得分:0)

Vim 7.4:248中添加的

系统列表完全符合您的要求:

:echo systemlist('printf "a\nb\n"')

输出:

['a', 'b']

来自文档http://vimhelp.appspot.com/eval.txt.html#eval.txt

systemlist({expr} [, {input}])                          systemlist()
                Same as system(), but returns a List with lines (parts of 
                output separated by NL) with NULs transformed into NLs. Output 
                is the same as readfile() will output with {binary} argument 
                set to "b".

                Returns an empty string on error.