如何在VIM中重新分配缓冲区编号?

16

我曾经认为vim是无所不能的,直到我想要在列表中去除缓冲区并将其重用于其他用途。例如,如果我有:

1 "f1.h"
2 "f2.h"
3 "f3.h"
4 "f1.cpp"
5 "f2.cpp"
6 "f3.cpp"

而我想用其他东西替换f1.h - f3.h,但是需要保持相同的缓冲区顺序:

1 "n1.h"
2 "n2.h"
3 "n3.h"
4 "f1.cpp"
5 "f2.cpp"
6 "f3.cpp"

我不知道该怎么做。我可以使用"1,3bd"删除缓冲区1-3,甚至可以使用"1,3bw"将它们清除,但是没有看到任何重新使用这些数字的方法,除非重新启动vim。 vim缓冲区faq位于http://vim.wikia.com/wiki/Vim_buffer_FAQ,似乎证实了这一点。

但我不想相信vim真的有这个限制,难道真的没有从vim内部执行此操作的方法吗?

3个回答

6

在同一会话中无法重新分配缓冲区号。您最好查看vimscript的替代方案。

一个可以处理到最近使用的文件排序(并且可以删除缓冲区)的缓冲区浏览器是Buffer Explorer / Browser

在vim.org上有很多其他的缓冲区切换脚本,适用于它们各自的作者需求。或者您也可以使用一些映射来编写自己的脚本。

我为Django想出了这个。

http://code.djangoproject.com/wiki/UsingVimWithDjango#Mappings

它让我可以通过快捷键轻松访问与应用程序目录相关的20个标准命名文件。你可以为你的项目设计类似的东西。我的映射是\1、\2、\3等,因此数字模式仍然存在。我还将\vr映射到~/.vimrc,将\br映射到~/.bashrc。重要的是,它可以且应该是一个非常高效的过程。

你的\1、\2、\3映射脚本指引着我寻找答案的方向,如果我没有看到更好的方法,我会接受它。如果这种方法被系统地扩展以创建所有缓冲区文件的映射,并按照所需顺序排列,那么这将是切换到任何文件(通过缓冲区编号)的可接受替代方法,特别是在与按相同映射数字序列列出文件的脚本一起使用时。 - William Knight

4

以下是一个懒人的方法(不需要学习新技能):

  • 将您的会话保存到当前工作目录或任何您喜欢的位置的文件中:
:mksession Session.vim
  • 编辑Session.vim文件。查找已打开的缓冲区列表(以badd开头的行)。

  • 按照您的喜好重新排序这些行。

  • 关闭vim。

  • 使用-S标志和会话文件启动vim:

$> gvim -S Session.vim

您的缓冲区将按照您放置它们的顺序按顺序重新编号。


好的建议。我想补充一点,有时候打开一个干净的会话更容易,重现你想要重用的窗口布局、缓冲区列表、选项等,保存它,然后编辑 Session.vim 文件进行进一步调整。这是因为长时间运行的 Vim 会话可能会以非常混乱的缓冲区列表和选项设置结束,从而阻碍 :mksession 的最佳努力来重现它。 - leogama

-1
我建议使用制表符(从vim 7开始)。您可以使用tabm自由移动它们,并使用tabetabnew打开新选项卡。此外,这更容易理解正在发生的事情。您还可以使用-p(如果我没记错)打开一堆选项卡启动vim。

3
谢谢建议,但我更喜欢使用缓冲区号而不是选项卡的原因之一是,我经常同时处理几十个或数百个文件。在一个会话中,我开始通过缓冲区编号记忆常用文件,并快速在它们之间切换。这似乎对选项卡来说不太容易做到。我猜这也是为什么Vim尝试维护缓冲区号的持久性,但如果我必须重新加载一块缓冲区(比如包含文件),我喜欢将它们保留在顶部。这就是我想解决的问题。 - William Knight
1
我坚信使用标签而不是缓冲区会减慢你的速度并且可能会产生误解。即使你在前台使用标签,VIM仍然会在后台使用缓冲区,因此你可能最终会切换到同一标签中的缓冲区,并且不理解发生了什么。 - Carlo Lobrano

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