我希望findstr /m background *.vim | gvim
在单个gvim实例中打开包含*.vim
的所有background
个文件 - 但我无法让管道工作。
这与此question非常相似,但我不希望捕获stdin输出,而是希望GViM将输出视为要打开的文件列表 - 而且在Windows系统上,因此无法保证xargs。有什么想法吗?
答案 0 :(得分:6)
我可以想到几种方法:
使用vimgrep:运行gvim后,输入:
:vimgrep /background/ **/*.vim
这将使用所有匹配(每个文件可能多个匹配)填充quickfix列表,因此您可以使用:copen
,:cw
,:cn
等内容进行导航(见:help quickfix
)
使用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 %
这将加载每个文件,但也会保持文件列表打开(您可以随时加载它或其他任何文件)。
修改
在文件列表中使用:tabedit
不起作用(我只测试了:badd
)。您可以通过使用badd然后使用bufdo(如上所述)或通过执行此类操作(将其放入vimrc)来解决此问题:
command! -range=% OpenListedFiles <line1>,<line2>call OpenListedFiles()
function! OpenListedFiles() range
let FileList = getline(a:firstline, a:lastline)
for filename in FileList
if filereadable(filename)
exe 'tabedit' filename
endif
endfor
endfunction
然后只需打开包含所有必需文件名的文件,然后键入:
:OpenListedFiles
使用服务器功能和一些批处理脚本魔法(我使用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,但如果我不想使用本机工具,我会使用内置的聪明方法。
答案 1 :(得分:3)
打开Powershell:
gvim $(findstr /m background *.vim)
答案 2 :(得分:3)
在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 -e
(ed
)。
答案 3 :(得分:0)
其中任何一个都会为每个文件名打开一个单独的gvim
实例 - 如果只有一个文件名但对多个文件名有效,前提是你可以使用gvim的多个实例,那么这个实例非常有用:
1)在
中找到了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