在Vim中切换项目的最佳方法是什么?

jaz*_*mit 5 vim

我使用CtrlP来解决项目中的文件(通常可以将其定义为git repo root),但经常发现自己使用:cd在不同项目之间切换,这似乎不必要地耗费时间.

我希望vim能够记住我访问过的不同的git repo根,并在它们之间快速跳转.在那里,repo中的所有文件都可用于CtrlP,我可以到达我想要的位置.

有没有办法通过现有的插件获得我想要的东西?

Pet*_*ker 4

如果你使用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
Run Code Online (Sandbox Code Playgroud)

概述

这个想法是,只要逃亡者激活缓冲区,脚本就会将项目目录路径存储在字典中g:PROJECTS。添加!'viminfo'会将大写的全局变量存储到 viminfo 文件中,从而使发现的项目持续存在。一旦逃亡者发现一个项目,该:Project命令就可以用于:cd完成该目录。

注意事项和警告

  • 我还没有测试过这段代码。按原样使用。
  • 需要逃亡者.vim
  • 如果可用,可以选择使用Projectionist.vim补全
  • g:PROJECTS随意通过其他方式添加目录路径
  • 必须访问存储库才能发现它
  • 没有清理丢失的项目目录
  • Vim 没有“项目”的概念,所以能做的只有这么多