有时我需要打开几个文件作为参考,但又不想让它们混乱到我的当前缓冲区列表中。我尝试过 :new
, sp
, vs
, 和 :tabnew
,但新打开的文件总是保留在我的当前缓冲区列表中。有没有办法创建一个全新的缓冲区列表来单独保存这些打开的文件呢?这样,我就可以使用 1,100bd
来完全关闭这些文件,每当我不再需要查看它们时。我已经在谷歌上搜索了很久,但仍然没有找到解决方法。
有时我需要打开几个文件作为参考,但又不想让它们混乱到我的当前缓冲区列表中。我尝试过 :new
, sp
, vs
, 和 :tabnew
,但新打开的文件总是保留在我的当前缓冲区列表中。有没有办法创建一个全新的缓冲区列表来单独保存这些打开的文件呢?这样,我就可以使用 1,100bd
来完全关闭这些文件,每当我不再需要查看它们时。我已经在谷歌上搜索了很久,但仍然没有找到解决方法。
免责声明:使用插件几乎肯定是更强大的解决方案,因为我自己制作这个插件,而且我对vim相对较新。但至少这是一个很好的练习,可以了解快速修复列表的用途。
我的回答:
您可以将快速修复错误列表用作文件列表。请参阅:help quickfix
以获取完整文档。以下是我处理所有与主分支不同的文件时的工作流程(使用git)。
vim
命令在当前目录下打开vim。new
命令打开一个新的缓冲区。read ! git diff --name-only master
命令将bash命令的输出粘贴到新的缓冲区中。您可以运行任何命令或手动输入文件列表。您可能需要通过删除任何空行来清理它。w! /tmp/quickfix.txt
命令创建一个我们稍后可以使用的文件名。set errorformat+=%f
命令将错误格式更改为接受普通文件路径列表。有关详细信息,请参见:help errorformat
。cfile /tmp/quickfix.txt
命令读取文件列表并使用新的错误格式创建快速修复“错误”列表。set errorformat-="%f"
(可选)删除添加的错误格式,以确保您不会干扰其他使用errorformat
的功能,例如vimgrep
。现在你可以使用快速修复选项在文件之间移动。使用:copen
打开交互式列表,使用:cnext
/:cprevious
循环它们。您还可以同时拥有多个列表。我使用:colder
返回到以前的列表。如果您在vim中使用任何grep
命令,则应该熟悉此功能。
这些只是手动步骤。您可以创建一个函数,一次性完成所有操作或需要的任何部分。这是我正在使用的内容。
function! LoadQuickfixFileList(filename)
set errorformat+=%f
execute "cfile ".a:filename
set errorformat-=%f
endfunction
function! WriteBufferToQuickFixFileList(filename)
call writefile(getbufline(bufnr(bufname("%")), 0, "$"), a:filename)
endfunction
function! GitDiffNameOnlyMaster()
execute "new"
execute "read ! git diff --name-only master"
execute "normal! ggdd"
call WriteBufferToQuickFixFileList("/tmp/quickfix.txt")
call LoadQuickfixFileList("/tmp/quickfix.txt")
endfunction
nnoremap <silent> <leader>cgd :call GitDiffNameOnlyMaster()<CR>
nnoremap <silent> <leader>cw :call WriteBufferToQuickFixFileList("/tmp/quickfix.txt")<CR>
nnoremap <silent> <leader>cf :call LoadQuickfixFileList("/tmp/quickfix.txt")<CR>
<leader>cgd
可以完成整个 git diff --name-only master
的操作。如果我自己在新缓冲区中列出文件列表,我可以使用 <leader>cw
将其写入 /tmp/quickfix.txt
。一旦我完成了这个操作,或者以其他方式创建了一个 /tmp/quickfix.txt
文件,我就可以使用 <leader>cf
加载该文件。
尝试使用参数列表。请参阅:help:args和周围的部分。如果您所有的参考文件(仅限这些文件)都在您的参数列表中,您可以使用:argdo bd
来摆脱它们。如果您已经使用全局列表,则还有本地参数列表。
:setlocal nobuflisted
选项。 - ryuichiro