首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vim和unite.vim插件浏览一个大型项目

使用vim和unite.vim插件浏览一个大型项目
EN

Stack Overflow用户
提问于 2014-07-25 18:34:14
回答 2查看 3.6K关注 0票数 3

我已经读了很长一段时间关于Shougo的Vim的"Unite“插件,所以我决定尝试一下。如果你还不熟悉:

  • https://github.com/Shougo/unite.vim
  • http://bling.github.io/blog/2013/06/02/unite-dot-vim-the-plugin-you-didnt-know-you-need/
  • http://www.codeography.com/2013/06/17/replacing-all-the-things-with-unite-vim.html

一个特性是能够递归地搜索文件/文件夹以搜索某些内容。通常您会这样做:"Unite file_rec/异步“。这通常会启动当前工作目录中的搜索(在我的例子中,是我正在处理的当前文件所在的目录)。我在一个非常大的代码库中工作;几乎有100万个文件散落在一个通常毫无意义的文件中,有时与源代码、二进制文件和文本文件混合在一起。这意味着使用默认的unite文件太慢了,即使我使用vimproc插件运行异步。对于这个问题,我以前的解决方案是运行一个夜间脚本,该脚本将构建一个包含每个".cpp"".h"文件的列表,将它们的绝对路径吐出到一个巨大的文件中,然后我会将该文件转换为项目中的所有内容。似乎很合理,但我想知道是否有更好的方法。

我觉得我只是在触及Unite提供的可能性的表面,我认为一定有一些聪明的方法来使用这个插件来完成类似的事情。它已经支持引用vim的":ol"命令,该命令列出了您最近使用的文件,因此我认为,即使是直接使用unite引用我的所有项目源文件/头文件也是一个好的开始。是否有联合的专家解决了这个问题?我甚至希望听到其他人的解决方案,以便在类似我的大型项目中快速访问所有可用的源文件。大多数与我一起工作的人只使用,它有包含您需要的所有内容的".sln“文件。也许我可以劫持/进口它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-06 22:38:53

以下是我最终所做的

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

代码语言:javascript
复制
 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:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-07-25 18:38:03

Vim是一个文本编辑器,而不是OS :-)。定位指挥部就不能工作吗?

否则请检查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时就有异步支持了

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24962356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档