在 Vim 中切换项目的最佳方式是什么?
What is the best way to switch between projects in Vim?
我使用 CtrlP 来绕过项目中的文件(通常可以定义为 git 存储库根目录),但我经常发现自己使用 :cd
在不同的项目之间切换,这似乎不必要地耗费时间。
我希望 vim 能够记住我访问过的不同 git 存储库根并在它们之间快速跳转。到达那里后,存储库中的所有文件都将可供 CtrlP 使用,我可以到达我想要的位置。
有什么方法可以通过现有插件获得我想要的东西吗?
This 提示建议使用大写标记作为 'file bookmarks'。
For example, open your .vimrc
, press mV
, and close Vim. The next time you want to edit your .vimrc
, just press 'V
to open it.
如果您使用 fugitive.vim 那么我可能会为您提供一个选项。
将以下内容放入您的 ~/.vimrc
文件中:
set viminfo+=!
if !exists('g:PROJECTS')
let g:PROJECTS = {}
endif
augroup project_discovery
autocmd!
autocmd User Fugitive let g:PROJECTS[fnamemodify(fugitive#repo().dir(), ':h')] = 1
augroup END
command! -complete=customlist,s:project_complete -nargs=1 Project cd <args>
function! s:project_complete(lead, cmdline, _) abort
let results = keys(get(g:, 'PROJECTS', {}))
" use projectionist if available
if exists('*projectionist#completion_filter')
return projectionist#completion_filter(results, a:lead, '/')
endif
" fallback to cheap fuzzy matching
let regex = substitute(a:lead, '.', '[&].*', 'g')
return filter(results, 'v:val =~ regex')
endfunction
概览
想法是,只要逃犯激活缓冲区,脚本就会将项目目录路径存储在 g:PROJECTS
字典中。添加 !
到 'viminfo'
会将大写的全局变量存储到 viminfo 文件中,从而使发现的项目持久存在。一旦逃犯发现了一个项目,就可以使用 :Project
命令 :cd
到该目录并完成。
注意事项和警告
- 我没有测试过任何这段代码。按原样使用。
- 需要Fugitive.vim
- 可选地使用 Projectionist.vim 完成(如果可用)
- 欢迎通过其他方式将目录路径添加到
g:PROJECTS
- 必须访问存储库才能被发现
- 没有清理丢失的项目目录
- Vim没有"project"的概念所以能做的也就这么多
把两个工程放到一个新的目录下,然后在这个目录下打开Vim,就可以用ctrlP打开两个工程里的文件了
如果你不想移动项目,创建软link并将它们放在一个目录中。
尝试 vim-rooter:当您进入缓冲区时,它会自动将目录更改为缓冲区的 "root"(例如 git 存储库根目录)目录。
我使用 CtrlP 来绕过项目中的文件(通常可以定义为 git 存储库根目录),但我经常发现自己使用 :cd
在不同的项目之间切换,这似乎不必要地耗费时间。
我希望 vim 能够记住我访问过的不同 git 存储库根并在它们之间快速跳转。到达那里后,存储库中的所有文件都将可供 CtrlP 使用,我可以到达我想要的位置。
有什么方法可以通过现有插件获得我想要的东西吗?
This 提示建议使用大写标记作为 'file bookmarks'。
For example, open your
.vimrc
, pressmV
, and close Vim. The next time you want to edit your.vimrc
, just press'V
to open it.
如果您使用 fugitive.vim 那么我可能会为您提供一个选项。
将以下内容放入您的 ~/.vimrc
文件中:
set viminfo+=!
if !exists('g:PROJECTS')
let g:PROJECTS = {}
endif
augroup project_discovery
autocmd!
autocmd User Fugitive let g:PROJECTS[fnamemodify(fugitive#repo().dir(), ':h')] = 1
augroup END
command! -complete=customlist,s:project_complete -nargs=1 Project cd <args>
function! s:project_complete(lead, cmdline, _) abort
let results = keys(get(g:, 'PROJECTS', {}))
" use projectionist if available
if exists('*projectionist#completion_filter')
return projectionist#completion_filter(results, a:lead, '/')
endif
" fallback to cheap fuzzy matching
let regex = substitute(a:lead, '.', '[&].*', 'g')
return filter(results, 'v:val =~ regex')
endfunction
概览
想法是,只要逃犯激活缓冲区,脚本就会将项目目录路径存储在 g:PROJECTS
字典中。添加 !
到 'viminfo'
会将大写的全局变量存储到 viminfo 文件中,从而使发现的项目持久存在。一旦逃犯发现了一个项目,就可以使用 :Project
命令 :cd
到该目录并完成。
注意事项和警告
- 我没有测试过任何这段代码。按原样使用。
- 需要Fugitive.vim
- 可选地使用 Projectionist.vim 完成(如果可用)
- 欢迎通过其他方式将目录路径添加到
g:PROJECTS
- 必须访问存储库才能被发现
- 没有清理丢失的项目目录
- Vim没有"project"的概念所以能做的也就这么多
把两个工程放到一个新的目录下,然后在这个目录下打开Vim,就可以用ctrlP打开两个工程里的文件了
如果你不想移动项目,创建软link并将它们放在一个目录中。
尝试 vim-rooter:当您进入缓冲区时,它会自动将目录更改为缓冲区的 "root"(例如 git 存储库根目录)目录。