在 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 存储库根目录)目录。