我正在与vim合作开展一个不断发展的项目。我喜欢在同一个会话中打开大多数项目文件。但是,随着项目的不断发展,我开始同时打开太多文件;在文件之间切换 [*] 开始在40多个文件中变得有点无效,因为列表太长了(例如,20个文件,这种导航方式对我来说非常好)。
有没有办法在同一个vim实例中的多个“子会话”中拆分会话?
我怎么想象每个会话会包含20个文件,只列出:ls
个文件,并且我可以在同一个vim窗口中切换它们(基本上和我一样)在同一个shell中运行多个vim实例,并使用Ctrl-Z; fg %X
在它们之间切换,只需不离开vim。)
[*] 我喜欢在:ls
后跟:bX
(或直接:bX
的文件之间导航如果我记住了一个缓冲区编号),以及:bp
/ :bn
,我总是至少有两个拆开,这个工作流程对我很有用,所以我不看为了更有效地替代:ls
。
答案 0 :(得分:2)
我从不使用:ls
。但是我经常在大项目上工作,而且我打开来自不同项目的(很多)文件(我仍然可以在我想要的模式下编译我想要的东西(调试,发布,......),独立生成标签对于每个项目,有不同的编码风格等)
您的问题似乎是关于"我如何从一个文件转到另一个文件"。我有很多分开的窗户同时打开,我从一个跳到另一个:
:sb
,支持文件名上的标签完成(已在缓冲区中打开):sp **/filename*<tab>
(当它尚未打开时):sp
和:sb
合并为一个命令。编辑:我刚刚在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
查询与给定项目关联的缓冲区。