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

时间:2015-02-02 21:48:41

标签: vim

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

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

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

4 个答案:

答案 0 :(得分: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

概述

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

注释和警告

  • 我没有测试任何此代码。按原样使用。
  • 需要Fugitive.vim
  • 可选择使用Projectionist.vim完成(如果有)
  • 可以通过其他方式将目录路径添加到g:PROJECTS
  • 必须访问存储库才能发现
  • 没有清理缺少的项目目录
  • Vim没有“项目”的概念,因此只能做很多事情

答案 1 :(得分:2)

尝试vim-rooter:当你输入一个缓冲区时,它会自动将目录更改为缓冲区的“root”(例如git repo root)目录。

答案 2 :(得分:1)

This提示建议使用大写标记作为“文件书签”。

  

例如,打开.vimrc,按mV,然后关闭Vim。下次要修改.vimrc时,只需按'V即可将其打开。

答案 3 :(得分:1)

只需将两个项目放在一个新目录中,然后在此目录中打开Vim,就可以使用ctrlP在两个项目中打开文件。

如果您不想移动项目,请创建软链接并将它们放在一个目录中。