【问题标题】:vim: multiple "sessions" in the same instance?vim:同一实例中有多个“会话”?
【发布时间】:2016-09-30 00:32:22
【问题描述】:

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

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

我如何想象每个会话将包含 20 个文件,并且只列出带有 :ls 的文件,并且我可以在同一个 vim 窗口中切换它们(基本上就像我运行多个vim 的实例在同一个 shell 中,并在它们之间使用Ctrl-Z; fg %X 进行切换,而无需离开 vim)。

[*] 我喜欢使用:ls 后跟:bX(或者直接:bX,以防我记住了缓冲区编号)在文件之间导航),以及:bp/:bn,而且我总是至少有两个拆分打开,而且这个工作流程对我来说效果很好,所以我不是在寻找更有效的替代 :ls

【问题讨论】:

  • 您面临的问题是什么?在您的问题中,您谈到您当前的工作流程“变得有点低效”(没有解释这对您意味着什么),但在您对 Luc 的回答的评论中,您谈论的是会话的文件大小。
  • 顺便说一句,如果您仍然面临同样的问题,您可能会在Vim beta 上查看是否有答案。

标签: vim vim-plugin


【解决方案1】:

我从不使用:ls。但是我经常从事大型项目,并且我从不同的项目中打开(许多)文件(并且我仍然能够以我想要的模式(调试,发布,...)编译我想要的东西,为每个单独生成标签项目,具有不同的编码风格等)

您的问题似乎是关于“我如何从一个文件转到另一个文件”。我同时打开了许多拆分窗口,我从一个窗口跳到另一个窗口:

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

编辑:我刚刚在lh-vim-lib 中推出了一个高度实验性的:Project <name> :ls 功能。注意:这个新的 project 功能并不是为了满足您的需求,但由于它,很容易拥有一个受限的: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 查阅与给定项目关联的缓冲区。

【讨论】:

  • 感谢您的建议,我不知道:sb 看起来很方便。但是,问题不在于“如何从一个文件到另一个文件”; :ls 后跟 :bX (或者直接 bX 一旦我记住了缓冲区的数量)旁边的 :bn/:bp 对我来说已经足够好了。主要问题实际上是会话变得有点大,我想避免在不同的 tmux 窗口中使用多个 vim 实例(尽管如果类似于我在问题是不可能的)。
  • 就是这样:您无需记住缓冲区编号即可在当前窗口中打开缓冲区。 :sb:b 支持部分缓冲区文件名的制表符完成。我们真的不需要:ls 知道缓冲区编号,以便在当前窗口中加载这些打开的缓冲区。
  • 否则,充其量只有标签,但:ls仍然可以看到所有内容
  • 这让我思考。我目前正在我的 lh-vim-lib 中处理 new project feature ——我主要需要编写文档,并在我的其他插件步骤中使用它。添加:Ls <projectname> 来显示与活动项目关联的缓冲区非常容易。
  • 不管怎样,我也不用:ls,我只是输入:b ,开始输入文件名并按TAB键完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多