有没有Vim的插件或方法可以管理多个项目?

7

我经常同时处理多个项目。我手头的文件数量如下:

  Project   |   Files
--------------------------
  Thesis         20
  Simulator      50
  Plots          30
  Graphs         30
  Website        500+

在一个窗口中放置所有这些文件显得很笨重。有几种选择,我将讨论它们的缺点,或者说是它们的致命弱点。
1. 分割窗口 我可以将vim分成5个窗口,每个项目一个,但这与通过针孔编码没有什么区别。实际上,我从来都不喜欢分割窗口,除了在不断比较和编辑两个相关文件的情况下。此外,我发现在二维中导航不如仅沿水平方向那样无缝。
2. 标签页 标签页(愚蠢地称为视口)似乎正好解决了这种问题,但它们不提供缓冲区使用的限制。例如,如果我在我的“毕业论文”标签页中,我只想浏览这20个缓冲区,而不是所有500多个网站相关缓冲区。由于我正在将它们保存为会话,如果我意外切换到“毕业论文”标签页中的“网站”缓冲区,然后退出,在进入时我就会有两个“网站”选项卡。这更加麻烦,因为我已经为每个标签设置了本地目录(:lcd)。
3. 终端标签页 使用终端标签页确保每个标签页中的缓冲区保持独立。然而,每个vim会话不能再共享信息。我无法将文本从一个终端复制到另一个终端(我想我可以将其复制到“+”寄存器中)。我也不能对所有缓冲区使用:buffdo。此外,我喜欢可以将所有vim标签保存为单个会话的事实。
我知道SO是公开讨论的大忌,因此我将询问是否有一种方法来实现我所追求的功能。
编辑:一个很好的概括我需要的方式是说我想要“子缓冲区”。
编辑:我想要从vim标签中获得的是更有效地使用它们作为它们真正是的视口的能力。我想要能够仅为我的毕业论文部分创建一个选项卡。在这个部分中,我会更改本地目录以反映它。此外,我希望将该选项卡中的缓冲区过滤为所有缓冲区的子集。同样,在模拟器选项卡中,我想要专门用于我的模拟器文件。
基本上,我想通过标签页运行多个独立的vim会话的能力,但仍然具有一些额外的优点(即共享寄存器以能够复制)。

5
不算是“Vim解决方案”,但你为何不针对每个项目使用一个工作区和一个Vim实例呢?这样切换项目时,你只需要切换到另一个工作区,在那里一切都为该项目设置好了。 - beta
很多时候我会将图表结果放入论文中,然后将论文中的公式放入模拟器中。我想要的是子缓冲区。 - puk
1
我不认为3个人算是“很多人”。实际上,我对你的工作流程一无所知。你为什么总是使用cd命令?为什么不给你的*.py脚本取别名或者将它们的目录添加到你的$PATH中?或者直接在一个Vim窗口中完成所有操作,然后将你的脚本映射到<F7>键上或其他快捷键上? - romainl
1
请回答那些试图帮助你的人的问题,这样他们才能更有效地帮助你。你编辑了你的问题以澄清,但你的编辑并没有涉及到 Vim。因此,请更准确地解释你想要如何处理选项卡以及所有终端相关的事情。 - romainl
好的,你一开始就应该这样做。我们的第一印象是正确的:你想要做的事情实际上不可能,所以你必须在不同的终端窗口中使用不同的Vim会话。 - romainl
显示剩余7条评论
5个回答

6

我找到了一种方法来做这件事。Vim标签几乎没用。相反,我使用了Gnome终端选项卡。

  1. 全局寄存器 为了模拟使用全局寄存器,以便能够在不同的 Vim 实例之间复制粘贴,可以通过将 set clipboard=unnamedplus 添加到您的 .vimrc 文件中来将系统剪贴板和未命名寄存器“管道”在一起。这会导致所有的 yank/delete... 操作都被复制到系统剪贴板上。从那里,其他 Vim 实例将能够访问它。同样,您在 vim 外面做的任何复制粘贴现在都将存储在未命名寄存器中。

  2. Gnome 终端标签快捷键 下一个和前一个标签的默认快捷键为 Ctrl+Pg UpCtrl+Pg Dn。由于我使用 Shift+kShift+j 来进行下一个和前一个缓冲区,我将 Ctrl+kCtrl+j 映射到我的下一个和前一个标签。只需进入 Gnome 终端 > 编辑 > 键盘快捷键即可。

  3. Gnome 终端标签 编写一个 shell 脚本来启动每个 Vim 实例作为一个新的终端标签。请参考这里的说明

  4. Vim 实例 最后,为每个 Vim 实例保存一个会话文件 :mksession fileName

它并不完美(例如,无法在终端之间复制命名寄存器),但我认为它更能代表视口(这里称为“选项卡”)的实际功能。


编辑 我已经回到使用vim标签。我学习了vim脚本,并映射了我的按键,使ShiftJShiftK分别映射到前/后缓冲区,CtrlJCtrlK分别映射到前/后标签页。然后我下载了tabname脚本,以便设置有意义的标签名称,然后修改了vim会话的制作方式以保存标签名称(请参见here),然后从gVim切换回Vim,以便我可以使用全屏模式。这是一段漫长而艰苦的旅程,但我认为它是值得的。


2
我有同样的问题很长时间了,同时使用多个项目工作。
为了部分解决这种挫败感,我使用了这个插件 https://github.com/xolox/vim-session
vim-session 使得在不同会话之间导航更加容易,在每个会话中我们都有一个项目。然而,使用一段时间后,我变得沮丧,因为每次你需要切换,当前会话文件的所有更改都需要保存。
现在对我来说最好的解决方案是Spacemacs + Vim 模式。我真的很喜欢 Vim 提供的编辑精神,而且使用 Spacemacs 的体验与之相同,还能更好地处理项目和更好地集成 git。

1
我曾经使用多个vim实例同时处理不同的项目,但效果并不理想。最终,我在终端中打开了太多的标签页。
我一直在使用vim-rooter插件,它可以自动将工作目录更改为您打开的缓冲区的项目根目录,前提是项目根目录下有.git目录。它只会通过打开某些扩展名的文件来触发,但该列表可以自定义。与ctrlp和任何其他插件配合使用。

1

我同意 ehamberg 的观点。

Vim 的缓冲区是全局的,因此任何分组或拆分只会在几分钟内有效,并且实际上会在第一个机会中出现问题。

相反,为每个项目使用一个 Vim 实例。如果您真的需要共享某些内容,您可以随时使用系统剪贴板。尝试 set clipboard+=unnamedplus 将 Vim 的默认寄存器与系统剪贴板同步。

但我想知道您管理项目的方式是否合理:

  • 在第3点中,您写道“我也不能再在所有缓冲区上使用 :buffdo 命令。” 为什么要在跨多个不同项目的所有打开缓冲区上使用该命令?

  • 您真的同时打开了500多个缓冲区吗?我知道 Vim 可能处理它,但为什么要打开那么多缓冲区?我从事 Web 开发工作,即使在“大型”项目上,我一天内也很少处理超过十几个文件。


关于第一条,它们处于某种灰色地带,有些相关:我的论文生成了一些绘图结果,然后我从这些绘图中提取了一些测试代码并将其插入到我的论文中,同样,我也在我的模拟器中使用了来自我的论文的代码。 - puk
关于第二点,我觉得我的电脑可以处理它 =P 但是我会重新考虑我的方法。 - puk
我想要做的是在每个选项卡(除了网站选项卡)中能够执行“:bn”(映射为“Shift + J”),以便循环浏览文件,而不是循环浏览600多个文件。 - puk
我更新了问题,并详细解释了为什么要这样做。 - puk

1

BufExplorer插件可以通过选项卡对缓冲区进行分组。CtrlP插件可以从另一个选项卡重用缓冲区。


还有自制的vimscript https://github.com/DXist/dotvim/blob/master/after/plugin/lighthouse.vim,我用它来将项目分组到标签页中。它可以处理每个标签页和缓冲区的项目。项目在 .vim/projects.vim 文件中配置。 - Rinat Shigapov

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