10

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

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

4

4 回答 4

6

我可以想到几种方法:

使用 vimgrep

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

:vimgrep /background/ **/*.vim

这将使用所有匹配项(每个文件可能不止一个)填充快速修复列表,因此您可以使用: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 %

这将加载每个文件,但也会使文件列表保持打开状态(您始终可以加载它或其他任何内容)。

编辑

在文件列表上使用: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

使用 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

哎呀。


如果是我,我会选择“使用 vim 的内置聪明”选项。实际上,这不是真的:我会使用 cygwin 的 bash 脚本并只使用 bash,但如果我必须使用本机工具来完成,我会使用内置的聪明方法。

于 2009-12-24T17:18:13.310 回答
5

在 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)。

于 2009-12-24T16:42:34.213 回答
4

打开 Powershell:

gvim $(findstr /m background *.vim)
于 2009-12-24T15:34:34.277 回答
0

其中任何一个都将使用每个文件名打开一个单独的实例gvim——如果只有一个文件名但确实适用于多个文件名,则特别有用,前提是您可以使用多个 gvim 实例:

1) for 中的 findstr

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

2) 管道 findstr 到 for

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
于 2017-02-08T15:50:06.160 回答