如何在vim中创建一个新的独立缓冲区列表?

3

有时我需要打开几个文件作为参考,但又不想让它们混乱到我的当前缓冲区列表中。我尝试过 :new, sp, vs, 和 :tabnew,但新打开的文件总是保留在我的当前缓冲区列表中。有没有办法创建一个全新的缓冲区列表来单独保存这些打开的文件呢?这样,我就可以使用 1,100bd 来完全关闭这些文件,每当我不再需要查看它们时。我已经在谷歌上搜索了很久,但仍然没有找到解决方法。


你是否希望特定的缓冲区不在缓冲区列表中显示?如果是的话,你可能需要使用:setlocal nobuflisted选项。 - ryuichiro
2
你使用“缓冲区”这个词是错误的。每个文件都被放入自己的缓冲区,每个缓冲区都被添加到缓冲区列表中。你想要多个缓冲区列表还是其他什么? - romainl
谢谢@ryuichiro,我会看一下的。 - lvarayut
@romainl 哦,我刚意识到这一点。实际上我需要一个单独的缓冲区列表。我已经编辑了我的问题。 - lvarayut
3个回答

2
你可以尝试这个插件:vim-ctrlspace
从该插件的 README.md 中可以看到:
答案是标签 - Vim-CtrlSpace 的秘密武器。每个标签都有一个独立的缓冲区列表。与普通的Vim相比,这是非常不同的。由插件提供支持的标签可以视为桌面上的文件堆叠。
通过标签,您可以:
- 将相关缓冲区分组 - 提取到其他标签中 - 根据名称命名它们 - 移动或复制它们
在Vim-CtrlSpace中,标签的使用比Vim更加广泛。这是因为它们主要用作独立的缓冲区列表,因此您很可能有很多标签。可以通过选项卡列表访问和管理标签。
您的所有缓冲区、标签和标签布局都可以保存为工作区。就像用即时相机拍摄桌子照片一样。您可以使用 Workspace List 为每个项目保存多个工作区。

0

免责声明:使用插件几乎肯定是更强大的解决方案,因为我自己制作这个插件,而且我对vim相对较新。但至少这是一个很好的练习,可以了解快速修复列表的用途。

我的回答: 您可以将快速修复错误列表用作文件列表。请参阅:help quickfix以获取完整文档。以下是我处理所有与主分支不同的文件时的工作流程(使用git)。

  1. 使用vim命令在当前目录下打开vim。
  2. 使用new命令打开一个新的缓冲区。
  3. 使用read ! git diff --name-only master命令将bash命令的输出粘贴到新的缓冲区中。您可以运行任何命令或手动输入文件列表。您可能需要通过删除任何空行来清理它。
  4. 使用w! /tmp/quickfix.txt命令创建一个我们稍后可以使用的文件名。
  5. 使用set errorformat+=%f命令将错误格式更改为接受普通文件路径列表。有关详细信息,请参见:help errorformat
  6. 使用cfile /tmp/quickfix.txt命令读取文件列表并使用新的错误格式创建快速修复“错误”列表。
  7. 使用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 加载该文件。


0

尝试使用参数列表。请参阅:help:args和周围的部分。如果您所有的参考文件(仅限这些文件)都在您的参数列表中,您可以使用:argdo bd来摆脱它们。如果您已经使用全局列表,则还有本地参数列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接