我希望能够使用findstr /m background *.vim | gvim
命令,在单个gvim实例中打开所有包含background
的*.vim
文件,但我无法让管道命令正常工作。
这与此问题非常相似,但不同的是,我希望GViM将输出视为要打开的文件列表,并且在Windows系统上,xargs并不保证可用。有什么想法吗?
我可以想到几种方法来完成这个任务:
使用vimgrep命令:在运行gvim之后,输入:
:vimgrep /background/ **/*.vim
这将把所有匹配项(可能每个文件有多个)填充到快速修复列表中,因此您可以使用 :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
使用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,但是如果我必须使用本地工具来完成,我会使用内置的聪明方法。
:g
命令之前,您可以执行 :cd common_path
。如果您想更改路径,请执行 :%s@^@C:/path/to/folder/@
(vim 可以处理正斜杠,并且这样可以避免转义路径)。 - DrAl:cd %:p:h
来切换到公共路径。 - DrAl-c“lcd%CD%”
,这似乎也很好用。我的问题现在是关于:g/^/exe 'tabedit' getline('.')
命令。它似乎只能与最顶部的文件一起使用。有什么想法吗? - E.Beachtabedit
命令阻止了 :g
命令的运行。我已经修改了上面的描述,添加了一些(经过测试的)替代方案。 - DrAl在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
)来替换它。
gvim $(grep -l background *.vim)
- graywh打开 Powershell:
gvim $(findstr /m background *.vim)
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