vim:同一个实例中的多个“会话”?

时间:2016-09-29 07:57:45

标签: vim vim-plugin

我正在与vim合作开展一个不断发展的项目。我喜欢在同一个会话中打开大多数项目文件。但是,随着项目的不断发展,我开始同时打开太多文件;在文件之间切换 [*] 开始在40多个文件中变得有点无效,因为列表太长了(例如,20个文件,这种导航方式对我来说非常好)。

有没有办法在同一个vim实例中的多个“子会话”中拆分会话?

我怎么想象每个会话会包含20个文件,只列出:ls个文件,并且我可以在同一个vim窗口中切换它们(基本上和我一样)在同一个shell中运行多个vim实例,并使用Ctrl-Z; fg %X在它们之间切换,只需不离开vim。)

[*] 我喜欢在:ls后跟:bX(或直接:bX的文件之间导航如果我记住了一个缓冲区编号),以及:bp / :bn,我总是至少有两个拆开,这个工作流程对我很有用,所以我不看为了更有效地替代:ls

1 个答案:

答案 0 :(得分:2)

我从不使用:ls。但是我经常在大项目上工作,而且我打开来自不同项目的(很多)文件(我仍然可以在我想要的模式下编译我想要的东西(调试,发布,......),独立生成标签对于每个项目,有不同的编码风格等)

您的问题似乎是关于"我如何从一个文件转到另一个文件"。我有很多分开的窗户同时打开,我从一个跳到另一个:

  • :sb,支持文件名上的标签完成(已在缓冲区中打开)
  • :sp **/filename*<tab>(当它尚未打开时)
  • plugin of mine - 其他人通常使用Unite,command-T或其他类似的插件 - 将:sp:sb合并为一个命令。
  • 标签。标签(/ csope)的默认集成已经很好了。然而,我已经开发了lh-tags,以便简单地在一个过载和覆盖函数的世界中导航标签,就像它在C ++中一样。

编辑:我刚刚在lh-vim-lib推出了一个高度实验性的:Project <name> :ls功能。注意:这个新的项目功能并不意味着要执行您正在寻找的功能,但由于它可以轻松实现受限:ls

要使用它,您必须先将缓冲区注册到一个项目或另一个项目。在这里,我推荐像local_vimrc这样的插件,如果每个项目都可以区分为给定目录下的文件。对于每个根目录,在其中放置一个_vimrc_local.vim文件,其中包含:

:let s:k_version = 1
" Global definitions executed everytime we enter a file belonging to the project
" This is where we set g:lobal_variables and options for project-unaware plugins.
....

" Then the anti-reinclusion guards for buffer definitions
if &cp || (exists("b:loaded__my_foobar_project_settings")
      \ && (b:loaded__my_foobar_project_settings > s:k_version)
      \ && !exists('g:force_reload__my_foobar_project_settings'))
  finish
endif
let b:loaded__my_foobar_project_settings = s:k_version
let s:cpo_save=&cpo
set cpo&vim

" HERE, we say the current buffer belongs to a project
" solution 1 when we need more control
:call lh#project#define(s:, {'name': 'YouProjectName'})
" OR solution 2 which is easier to manipulate (tab completion, ...)
:Project --define YourProjectName

如果您愿意,您也可以使用更小的粒度(这仍然是记录不完整的内容)。

然后,您将能够使用:Project --list查询项目列表,或者使用:Project YouProjectName :ls查询与给定项目关联的缓冲区。