Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1213356
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2012-08-28 14:23:44

原文地址:http://easwy.com/blog/archives/advanced-vim-skills-lookupfile-plugin/

     Lookupfile插件可以在下面的链接下载:

     它使用vim 7.0中插入模式下的下拉菜单补全功能,因此只能在vim 7.0及以上版本中使用。

     下载该插件后,把它解压到你的~/.vim目录中,就完成了安装。然后在vim中执行”:helptags ~/.vim/doc“命令,生成help文件索引,然后就可以使用”:help lookupfile“命令查看lookupfile插件的帮助文件了。

注:windows用户需要把这个插件解压在你的$vim/vimfiles或$HOME/vimfiles目录。

     Lookupfile插件还需要最新的genutils支持,因此,需要下载genutils:

这个插件提供了一些通用的函数,可供其它的脚本使用。它的安装方法也是在~/.vim目录解压就可以了。需要注意的是,最新版本的genutils使用了 新的自动加载方式,所以和以前的版本不兼容。如果你的其它插件需要使用genutils的旧版本的话,你需要参照genutils的说明进行配置,以便使 新旧两个版本能协同工作。

     现在我们介绍lookupfile插件。虽然名字为lookupfile,其实这个插件它不仅能用来查找文件,还可以在打开的缓冲区中查找,按目录查找,等等。

[项目文件查找]

     Lookupfile在查找文件时,需要使用tag文件。它可以使用ctags命令生成的tag文件,不过查找效率会比较低。因此我们会专门为它生成一个包含项目中所有文件名的tag文件。

     我编写了下面的shell脚本,为vim70的源代码,生成一个文件名tag文件。

#!/bin/sh
 # generate tag file for lookupfile plugin
 echo -e "!_TAG_FILE_SORTED\t2\t/2=foldcase/" > filenametags
 find . -not -regex '.*\.\(png\|gif\)' -type f -printf "%f\t%p\t1\n" | \
 sort -f >> filenametags

     回想一下我们在”使用标签(tag)文件“一文中介绍的tag文件的格式。再对照脚本命令来看:

  • echo命令用来生成filenametags文件中的”!_TAG_FILE_SORTED”行,表明此tag文件是经过排序的。
  • find命令用来查找所有类型为普通文件,文件后缀名不是.png和.gif的文件,找到的文件按”文件名\t文件路径\t1″的格式输出出来。
  • sort命令则把find命令的输出重新排序,然后写入filenametags文件中

     在~/src/vim70/目录下运行该脚本,会生成一个名为filenametags的文件,包含了vim70目录下的所有文件的名字及其所在目录。

     现在我们需要让lookupfile插件知道到哪去找文件名tag文件。我们假定vim当前工作目录为~/src/vim70/,执行下面的命令:

:let g:LookupFile_TagExpr = '"./filenametags"'

注:如果不设定g:LookupFile_TagExpr的值,那么lookupfile插件会以tags选项定义的文件作为它的tag文件。

     现在我们就可以使用lookupfile来打开文件了,按”“或输入”:LookupFile“在当前窗口上方打开一个lookupfile小窗口,开始输入文件名(至少4个字符),随着你的输入,符合条件的文件就列在下拉列表中了。文件名可以使用vim的正则表达式,这大大方便了文件的查找。你可以用”CTRL-N“和”CTRL-P“(或者用上、下光标键)来在下拉列表中选择你所需的文件。选中文件后,按回车,就可以在之前的窗口中打开此文件。

     下图是使用lookupfile插件查找文件的一个例子:

     在屏幕最上方的窗口就是lookupfile窗口,在这个窗口中输入”gui.*x11″几个字符,查找到6个匹配文件,使用CTRL-N选中gui_x11.c文件,然后按回车,就会在前一个vim窗口中打开src/gui_x11.c文件,lookupfile窗口也自动关闭了。是不是非常方便?!

[缓冲区查找]

     在开发过程中,我经常会同时打开数十甚至上百个文件。即使是使用BufExplorer插件,想在这么多buffer中切换到自己所要的文件,也不是件容易的事。

     Lookupfile插件提供了一个按缓冲区名字查找缓冲区的方式,只要输入缓冲区的名字(可以是正则表达式),它就可以把匹配的缓冲区列在下拉列表中,同时还会列出该缓冲区内文件的路径,当你的buffer中有多个同名文件时,这可以帮你迅速找到你想要的文件。

     使用”:LUBufs“命令开始在缓冲区中查找,输入缓冲区的名字,在你输入的过程中,符合条件的缓冲区就显示在下拉列表中了,选中所需缓冲区后,按回车,就会切换你所选的缓冲区。下图是一个示例:

[浏览目录]

     Lookupfile插件还提供了目录浏览的功能,使用”:LUWalk“打开lookupfile窗口后,就可以输入目录,lookupfile会在下拉列表中列出这个目录中的所有子目录及文件供选择,如果选择了目录,就会显示这个目录下的子目录和文件;如果选择了文件,就在vim中打开这个文件。

下图是使用LUWalk的一个抓图:

     Lookupfile插件还提供了LUPath和LUArgs两个功能,这两个功能我用的不多,就不在这里介绍了。感兴趣的朋友读一下lookupfile的手册。

[Lookupfile配置]

Lookupfile插件提供了一些配置选项,通过调整这些配置选项,使它更符合你的工作习惯。下面是我的vimrc中关于lookupfile的设置,供参考:

""""""""""""""""""""""""""""""
 " lookupfile setting
 """"""""""""""""""""""""""""""
 let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
 let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串
 let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
 let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目
 let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件
 if filereadable("./filenametags") "设置tag文件的名字
 let g:LookupFile_TagExpr = '"./filenametags"'
 endif
 "映射LookupFile为,lk
 nmap lk :LUTags
 "映射LUBufs为,ll
 nmap ll :LUBufs
 "映射LUWalk为,lw
 nmap lw :LUWalk

     有了上面的定义,当我输入”,lk“时,就会在tag文件中查找指定的文件名;当输入”,ll“时,就会在当前已打开的buffer中查找指定名字的buffer;当输入”,lw“时,就会在指定目录结构中查找。

     另外,我还在项目相关的配置文件vim70sx.vim(参考保存项目相关配置)中加入了lookupfile所使用的tag文件的信息:

" lookup file tag file
 let g:LookupFile_TagExpr = '"filenametags"'
     这样,在恢复前次会话时就给lookupfile插件定义了tag文件。

     在用lookupfile插件查找文件时,是区分文件名的大小写的,如果想进行忽略大小写的匹配,可以使用vim忽略大小写的正则表达式,即在文件名的前 面加上”\c”字符。举个例子,当你输入”\cab.c”时,你可能会得到”ab.c”、”Ab.c”、”AB.c”…

注:如果想加快lookupfile忽略大小写查找的速度,在生成文件名tag文件时,使用混合大小写排序。这在文章使用标签(tag)文件有所提及。

     通常情况下我都进行忽略大小写的查找,每次都输入”\c”很麻烦。没关系,lookupfile插件提供了扩展功能,把下面这段代码加入你的vimrc中,就可以每次在查找文件时都忽略大小写查找了:

" lookup file with ignore case
 function! LookupFile_IgnoreCaseFunc(pattern)
 let _tags = &tags
 try
 let &tags = eval(g:LookupFile_TagExpr)
 let newpattern = '\c' . a:pattern
 let tags = taglist(newpattern)
 catch
 echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
 return ""
 finally
 let &tags = _tags
 endtry
 " Show the matches for what is typed so far.
 let files = map(tags, 'v:val["filename"]')
 return files
 endfunction
 let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'

     有时在LUBufs时也需要忽略缓冲区名字的大小写,我是通过直接修改lookupfile插件的方法,在LUBufs查找的字符串前都加上”\c”,使之忽略大小写。如果你不想这样,可以每次在缓冲区名字前手动加上”\c”。

     本文关于Lookupfile插件就介绍这么多,请阅读手册获取更多的信息。


阅读(935) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~