使用vim和unite.vim插件浏览一个巨大的项目

时间:2014-07-25 18:34:15

标签: vim vim-plugin unite.vim

我很长一段时间都在为Vim阅读Shougo的“Unite”插件,所以我终于决定尝试一下。如果你还不熟悉的话:

一个功能是能够递归搜索文件/文件夹以搜索某些内容。通常你会这样做:“ Unite file_rec / async ”。这通常会在当前工作目录中开始搜索(在我的情况下,我正在处理的当前文件所在的目录)。我在一个非常大的代码库中工作;将近100万个文件分散在一个经常荒谬的文件中,有时会将源文件,二进制文件和文本文件混合在一起。这意味着使用默认的unite文件太慢了,即使我正在使用vimproc插件运行异步。我对这个问题的解决方案(在unite之外)的旧解决方案是运行一个夜间脚本,该脚本将构建每个“。cpp”“。h”文件的列表,吐出把他们的绝对路径放到一个巨大的文件中,然后我会grep该文件在项目中的事物之间跳转。看起来相当合理,但我想知道是否有更好的方法。

我觉得我只是在谈论Unite提供的可能性,而且我认为必须有一些聪明的方法来使用这个插件来完成类似的事情。它已经支持引用vim的“:ol”命令,它列出了你最近使用过的文件,所以我想即使只是直接用unite引用我的所有项目源/头文件的glob也是一个好的开始。是否有任何联合专家解决了这个问题?我甚至喜欢听到其他人的解决方案,以快速访问类似于我的大型项目中的所有可用源文件?我工作的大多数人只使用Visual-Studios,其中包含您需要的所有内容的“.sln”文件...也许我可以劫持/导入它?

2 个答案:

答案 0 :(得分:5)

这是我最终做的事情

使用此命令构建我的文件列表

 find "$(cygpath -aw "$PWD")" -iname *.cpp -o -iname *.h -o -name build -prune > filenamelist

*请注意,我在使用Cygwin时遇到了使用Windows机器,所以我必须将路径转换为Windows友好路径,以实际引用cygwin shell之外的文件(即从VIM内部)。我也想排除某些目录,即。构建文件夹

我创建了unite.vim \ autoload \ unite \ sources \ filelist.vim:

let s:unite_source = {
      \ 'name': 'filelist',
      \ }

function! s:unite_source.gather_candidates(args, context)
    let filelist_path = "filenamelist"
    let filenamelist = readfile(filelist_path)

    return map(filenamelist, '{
            \ "word": v:val,
            \ "source": "filelist",
            \ "kind": "filelist",
            \ }')
endfunction

function! unite#sources#filelist#define()
    return s:unite_source
endfunction

unite.vim \ autoload \ unite \ kinds \ filelist.vim

let s:kind = {
      \ 'name': 'filelist',
      \ 'default_action': 'load',
      \ 'action_table': {},
      \ 'parents': [],
      \ }

let s:kind.action_table.load = {
      \ 'is_selectable': 1,
      \ }

function! s:kind.action_table.load.func(candidates)
  if len(a:candidates) != 1
    echo "candidates must be only one"
    return
  endif
  execute "open " a:candidates[0].word
endfunction

function! unite#kinds#filelist#define()
  return s:kind
endfunction

*请注意,这只是一个快速实现,我将输入文件硬编码为“filenamelist”,当我真的应该将输入文件列表设置为传入参数并在我的.vimrc中设置它以便我可以根据它进行切换我正在研究的项目; - )

之后,我刚刚创建了一个简单的热键来调用Unite文件列表。它将加载拆分窗口,让你搜索/选择你想要打开的文件,然后做一个完全集成为unite插件的正确的东西。

答案 1 :(得分:4)

Vim是文本编辑器而不是操作系统:-)。找不到命令工作?

否则请检查tree -i -f -P "*.cpp|*.h"。您可以使用shell脚本memoize结果来获得缓存效果。我认为它可以来源于Unite.vim。

如果没有像FZF https://github.com/junegunn/fzf那样尝试进行递归搜索。主要想法是将巨型业务保留在Vim之外。 Vim不适用于这样的异步任务。阻止Vim进行这样的活动将不是一个很好的体验,因为它只是一个文本编辑器,目前它缺乏异步支持。

实现这一目标的真正的Vim / Unix方法是与找到结果并将其加载到Vim的好程序进行交互。 FZF / Selecta等是很好的候选人。我的博客上可以找到很少的基本提示:linuxesome.blogspot.com但它有点过时。

编辑:现在vim具有异步支持,自Vim> 8.0