vim:同一个实例中有多个 "sessions"?
vim: multiple "sessions" in the same instance?
我和 vim 一起从事一个不断发展的项目。我喜欢在同一会话中打开大部分项目文件。但是,随着项目的增长,我开始同时打开太多文件;在文件 [*] 之间切换开始变得有点低效,因为列表太长了(例如,对于 20 个文件,这种导航方式对我来说非常有效,但是) .
有没有办法在 vim 的同一实例中将会话分成多个 "sub-sessions"?
我如何想象每个会话将包含,比如说,20 个文件,并且只列出带有 :ls
的文件,并且我可以在相同的 vim window 中切换它们](基本上就好像我 运行 在同一个 shell 中 vim 的多个实例,然后用 Ctrl-Z; fg %X
在它们之间切换,只是不离开 vim ).
[*] 我喜欢在文件之间导航 :ls
然后是 :bX
(或者直接 :bX
如果我记住了一个缓冲区编号),以及 :bp
/:bn
,我总是至少打开两个拆分,这个工作流程对我来说效果很好,所以我不看以获得 :ls
.
更有效的替代方案
我从不使用 :ls
。但是我经常在大项目上工作,我打开(很多)来自不同项目的文件(而且我仍然能够以我想要的模式(调试,发布,......)编译我想要的东西,为每个独立生成标签项目,有不同的编码风格等)
您的问题似乎与 "How do I go from one file to another" 有关。我有许多拆分 windows 同时打开,我从一个跳到另一个:
:sb
,支持文件名的制表符补全(已在缓冲区中打开)
: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
.
查阅与给定项目关联的缓冲区
我和 vim 一起从事一个不断发展的项目。我喜欢在同一会话中打开大部分项目文件。但是,随着项目的增长,我开始同时打开太多文件;在文件 [*] 之间切换开始变得有点低效,因为列表太长了(例如,对于 20 个文件,这种导航方式对我来说非常有效,但是) .
有没有办法在 vim 的同一实例中将会话分成多个 "sub-sessions"?
我如何想象每个会话将包含,比如说,20 个文件,并且只列出带有 :ls
的文件,并且我可以在相同的 vim window 中切换它们](基本上就好像我 运行 在同一个 shell 中 vim 的多个实例,然后用 Ctrl-Z; fg %X
在它们之间切换,只是不离开 vim ).
[*] 我喜欢在文件之间导航 :ls
然后是 :bX
(或者直接 :bX
如果我记住了一个缓冲区编号),以及 :bp
/:bn
,我总是至少打开两个拆分,这个工作流程对我来说效果很好,所以我不看以获得 :ls
.
我从不使用 :ls
。但是我经常在大项目上工作,我打开(很多)来自不同项目的文件(而且我仍然能够以我想要的模式(调试,发布,......)编译我想要的东西,为每个独立生成标签项目,有不同的编码风格等)
您的问题似乎与 "How do I go from one file to another" 有关。我有许多拆分 windows 同时打开,我从一个跳到另一个:
:sb
,支持文件名的制表符补全(已在缓冲区中打开):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
.