我想使用Vimscript循环遍历目录中的文件。阅读usr_41.txt
并进行了搜索,我能想到的最好的就是let dir_contents = system('ls')
但是由于system()
没有返回列表,我无法循环它。有没有一种方法可以将系统调用的结果保存为列表,还是已经这样做的Vim命令或函数?
答案 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上,它更复杂,因为
glob()
函数不会返回以dot开头的文件名,除非明确请求(使用glob('dir/.*')
)。glob()
开头的文件名时,还会显示.
(当前目录)和..
(父目录)特殊目录。为了解决这个问题,你必须使用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)
系统列表完全符合您的要求:
: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.