我在vim中打开了一个很长的文件列表,如下所示:
/dir1/file1
/dir2/file2
/dir2/file3
.....
Run Code Online (Sandbox Code Playgroud)
如何通过拆分或编辑在同一个vim会话中以最简单的方式逐个打开所有这些?
Ron*_*del 59
我会用-p表示标签
vim -p `cat yourlistoffiles`
Run Code Online (Sandbox Code Playgroud)
Has*_*kun 17
您可以使用quickfix模式,如下所示
:set errorformat=%f
:cf myfilelist
Run Code Online (Sandbox Code Playgroud)
此时,您可以使用普通的quickfix快捷方式浏览文件,:cn下一个文件,:cp上一个文件,:cr再次转到第一个文件.
编辑:
哦,如果你想从当前缓冲区中读取列表,请使用上面的说明中的in :cb而不是:cfin
我假设您在Vim中打开了文件列表,并希望在整个列表中模拟"gf"命令...
编辑.vimrc以包含此功能:
function Openall()
edit <cfile>
bfirst
endfunction
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用可视模式(1G,Shift-V,G)并键入":call Openall()"突出显示整个文件(或您要打开的路径集).然后命令行将显示:
:'<,'>call Openall()
Run Code Online (Sandbox Code Playgroud)
这将在所有突出显示的行中运行新的Openall()函数.
按Enter键,所有文件将在后台缓冲区中打开.然后,您可以使用常用的缓冲区命令访问它们.:ls会将它们显示为列表.
对于我的用例,您已经打开了一个包含文件列表的缓冲区,我找到了执行此操作的最佳方法。你可以在 vim cmd 模式下输入:
:% normal gf<C-v><C-o>
Run Code Online (Sandbox Code Playgroud)
(<C-v>你在哪里输入 Ctrl 和 v,与 相同<C-o>)
它变成:
:% normal gf^O
Run Code Online (Sandbox Code Playgroud)
%对文件中的每一行运行命令normal在正常模式下运行其后的所有内容gf在新缓冲区中打开光标下的文件<C-v>让您输入控制代码(<C-o>在本例中)<C-o>返回到最后一个位置,该位置始终是带有文件列表的缓冲区# open buffer with list of files from grep
$ grep -rl "new User()" mycode/ libraries/ | vim -
# then runs this in vim:
:% normal gf^O
Run Code Online (Sandbox Code Playgroud)
将以下内容添加到您的~/.vimrc:
" Open all files in current buffer (e.g. after piping to `vim -`)
nnoremap <leader>oa :% normal gf^O<cr>
Run Code Online (Sandbox Code Playgroud)
这映射\oa到运行命令(因为<leader>对\我来说)。
qogf<C-o>j
Run Code Online (Sandbox Code Playgroud)
运行gf(go file) 然后使用<C-o>返回到初始的未命名缓冲区,然后只用 向下一行j,准备重复。
然后查看缓冲区中有多少行 (12) 并运行宏,如下所示:
12@o
Run Code Online (Sandbox Code Playgroud)
您可以执行以下操作
cat file | xargs vim
Run Code Online (Sandbox Code Playgroud)
如果“文件”包含您的文件列表,则将在同一vim会话中打开文件。和往常一样,当打开多个缓冲区时,可以使用:bn向前导航和:bp反向导航。