Luc*_*ike 3 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"文件...也许我可以劫持/导入它?
这是我最终做的事情
使用此命令构建我的文件列表
find "$(cygpath -aw "$PWD")" -iname *.cpp -o -iname *.h -o -name build -prune > filenamelist
Run Code Online (Sandbox Code Playgroud)
*请注意,我在使用与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
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
*请注意,这只是一个快速实现,我将输入文件硬编码为"filenamelist",当我真的应该将输入文件列表设置为传入参数并在我的.vimrc中设置它以便我可以根据项目切换它我正在努力;-)
之后,我刚刚创建了一个简单的热键来调用Unite文件列表.它将加载拆分窗口,让您搜索/选择要打开的文件,然后完全集成为unite插件.