如何将输出redirect到Gvim作为要打开的文件列表?

我想要findstr /m background *.vim | gvim findstr /m background *.vim | gvim在gvim的单个实例中打开所有包含background *.vim文件 – 但是我无法使pipe道工作。

这与这个问题非常相似,但不是捕获stdin输出,而是希望GViM将输出视为要打开的文件列表 – 而在Windows系统上,xargs不能保证。 有任何想法吗?

我可以想到一些这样做的方法:

使用vimgrep

使用vimgrep:在运行gvim之后,输入:

 :vimgrep /background/ **/*.vim 

这将填充所有匹配的quickfix列表(可能多于一个文件),所以你可以使用诸如:copen:cw:cn等来导航(参见:help quickfix


使用vim的内置的巧妙

使用findstr给你一个文件列表,然后让vim打开这些文件:

 findstr /m background *.vim > list_of_files.txt gvim list_of_files.txt " In Gvim, read each file into the buffer list: :g/^/exe 'badd' getline('.') " Open the files in tabs: :bufdo tabedit % 

这将加载每个文件,但也将保持打开的文件列表(你总是可以bunload它或其他)。

编辑

使用:tabedit文件列表不起作用(我只测试:badd )。 你可以通过使用badd然后使用bufdo(如上所述)或者通过做这样的事情(把它放在你的vimrc中):

 command! -range=% OpenlistdFiles <line1>,<line2>call OpenlistdFiles() function! OpenlistdFiles() range let FileList = getline(a:firstline, a:lastline) for filename in FileList if filereadable(filename) exe 'tabedit' filename endif endfor endfunction 

然后只需打开包含所有必需文件名的文件,然后输入:

 :OpenlistdFiles 

使用Vim的服务器功能和一些糟糕的批处理脚本

使用服务器功能和一些批处理脚本魔术(我不明白,因为我使用bash)

 @echo off REM Welcome to the hideous world of Windows batch scripts findstr /m background *.vim > list_of_files.txt REM Run GVIM (may not be required) gvim REM Still in command prompt or .bat file here REM for each line in the file "list_of_files.txt", pass the line to OpenInTab for /f %%i in (list_of_files.txt) do call:OpenInTab %%i goto:eof :OpenInTab REM Open the file in a separate tab of an existing vim instance gvim --remote-tab %~1 goto:eof 

Eeeurrgh。


如果是我,我会用“使用vim的内置的聪明”选项。 其实,事实并非如此:我会使用cygwin的bash脚本,只是使用bash,但是如果我想用本地工具来做,我会使用内置的巧妙方法。

打开PowerShell:

 gvim $(findstr /m background *.vim) 

在bash中:

 grep -l background *.vim | xargs gvim 

关键是xargs 。 它从标准输入中获取行并将它们作为命令行参数传递。 grep -l只是用匹配打印文件名。


另一个想法是,如果你没有xargs并且不能下载它们,那么你可以将行转换成vim命令( :edit filename )并让vim执行它们,即打开所有的文件。 再次,在我的环境中,我有sed

 grep -l background *.vim | sed 's/^/:edit /' > files vim -s files 

即使你没有sed ,也可以用vi -eed )替换它。

其中任何一个都会为每个文件名打开一个单独的gvim实例 – 如果只有一个文件名,但是对于多个文件名可以工作,那么特别有用,前提是您可以使用gvim的多个实例:

1)在for内找到

 for /f "delims=" %f in ('findstr /m background *.vim') do gvim "%f" 

2)管发现为

 findstr /m background *.vim | for /f "delims=" %f in ('more') do gvim "%f" 

3).bat文件创建一个名为gvim_stdin.bat的文件,比如(2)中包含这一行,除了%符号加倍外:

 for /f "delims=" %%f in ('more') do gvim "%%f" 

然后运行:

 findstr /m background *.vim | gvim_stdin