3

很长一段时间以来,我一直在阅读有关 Shougo 的 Vim 的“Unite”插件的精彩内容,所以我最终决定试一试。如果您还不熟悉:

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

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

4

2 回答 2

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

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

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

于 2014-08-06T22:38:53.537 回答
4

Vim 是文本编辑器而不是操作系统 :-)。定位命令不起作用吗?

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

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

实现这一点的真正 Vim/Unix 方法是与找到结果并将其加载到 Vim 中的好程序进行交互。FZF/Selecta 等都是不错的选择。在我的博客上可以找到一些基本技巧:linuxesome.blogspot.com,但它有点过时了。

编辑:现在 vim 从 Vim > 8.0 开始具有异步支持

于 2014-07-25T18:38:03.877 回答