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

6
我想使用Vimscript循环遍历目录中的文件。经过阅读usr_41.txt并进行搜索,我得出的最佳方法是使用let dir_contents = system('ls')。但由于system()没有返回列表,我不能循环遍历它。是否有一种方法可以将系统调用的结果保存为列表,或者已经存在的Vim命令或函数可以这样做?
5个回答

5
你可以使用split(system('ls'), '\n')获取一个列表,这将为您提供文件列表,假设您的文件名中没有换行符。

2

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

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

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

然而,如果你在执行除了"ls"之外的其他操作时,可能会遇到一些奇怪的烦人问题:尾随的空白行将被丢弃(截至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

希望能对某些人有所帮助!

1

尝试类似这样的东西

split(system('ls', nr2char(10))

我目前不在Unix系统上,所以无法自己尝试,但它在Windows上(和dir)运行良好,例如

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

1

有一个内置的glob()函数。要获取Windows上当前目录中的文件列表,可以使用split(glob('.\\*'), "\n")。在*nix上,这更加复杂,因为:

  1. POSIX允许除NULL外的所有内容都在文件名中。这里的一切都意味着换行符("\n")也是允许的。
  2. glob()函数不返回以点开头的文件名,除非明确请求(使用glob('dir/.*'))。
  3. 当明确请求列出以点开头的文件名时,glob()还会显示(当前目录)和..(父目录)特殊目录。

为了解决这些问题,您必须使用类似于this的东西(或者使用带有Python支持和Python自己的os.listdir函数的vim)。

如果您不介意在依赖项中拥有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!

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

0

systemlist 在 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.

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