vi/vim使用进阶: lookupfile插件

<< 返回vim使用进阶: 目录

本节所用命令的帮助入口:

:help lookupfile

在文章保存项目相关配置中,我们讲过通过”:find“命令打开指定的文件,不过使用”:find“命令并不是非常的方便:一是如果项目比较大、文件比较多,find查找起来很慢;二是必须输入全部的文件名,不能使用正则表达式(regex)查找。

我们也介绍过vim提供的文件浏览插件,你可以在浏览器中根据目录去查找,但这种方式在浏览目录时比较方便,查找一个已知名字(或知道部分名字)的文件效率就比较低了。

相比之下,在source insight中查找文件非常简单,只要输入部分的文件名,就可以找到符合条件的文件。

我一直被这个问题所困扰,直到有一天,在http://www.vim.org/上发现了一个非常出色的插件,才彻底解决了查找文件效率低下的问题,它的功能毫不逊于source insight。在给该插件投票时,我选择了”Life Changing“。是的,它改变了我的生活!

这个插件的名字是:lookupfile

Lookupfile插件可以在下面的链接下载:http://www.vim.org/scripts/script.php?script_id=1581

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

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

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

Lookupfile插件还需要最新的genutils支持,因此,需要下载genutils:http://www.vim.org/scripts/script.php?script_id=197

这个插件提供了一些通用的函数,可供其它的脚本使用。它的安装方法也是在~/.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来打开文件了,按”<F5>“或输入”: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 <silent> <leader>lk :LUTags<cr>
"映射LUBufs为,ll
nmap <silent> <leader>ll :LUBufs<cr>
"映射LUWalk为,lw
nmap <silent> <leader>lw :LUWalk<cr>

有了上面的定义,当我输入”,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插件就介绍这么多,请阅读手册获取更多的信息。

这是一个非常好的插件,希望能为更多人喜爱!

也欢迎大家多交流使用中的心得和疑问。

[参考文档]

<< 返回vim使用进阶: 目录

“vi/vim使用进阶: lookupfile插件”的87个回复

  1. 易水你好,想请教你一个问题,这个插件是不是在gvim和vim下表现不一样。我发在linux下的终端vim里(7.4.x版本),用大写字母查找文件名时有异常,常常搜索不到,而用\cabc在能搜索文件名包含ABC的文件,在windows gvim(8.0.x)没有这个问题,请问你知道原因么?

    1. 跟gvim和vim无关,与系统有关。Windows中的文件名不区分大小写,所以估计插件设置了忽略大小写,而Linux中文件名是区分大小写的

  2. 博主你好!
    我在运行您写的脚本时遇到了一个问题!!!
    我在运行脚本时出现了这个错误提示。
    find: -printf: unknown primary or operator
    望博主解答!
    谢谢!!!

  3. 楼主你好,我在用这个插件时碰到一些问题不知道怎么回事:我在.vimrc文件中配置的 nmap lu LookupFile
    nmap ll :LUBufs
    nmap lw :LUWalk
    当我按lu时,确实可以实现文件的查找,打开几个文件后,但当我使用ll在缓冲区查找后,再按lu就无法在所有文件里查找,只能在缓冲区查找了,请问这是怎么回事?
    还有这里是什么意思?

  4. 你好:
    咨询个问题:我用gvim,在lookupfile选择文件、切换之后,tags会失效,即需要重新”set tags=tags”。
    这是什么原因?有办法解决吗?我用vim是没有这个问题的
    谢谢

    1. 如果你用的是同一个vimrc,不可能vim没问题而gvim有问题的。有可能你lookupfile的设置不正确,能把你关于set tags的所有配置贴出来吗?

  5. @博主
    我把文件名打完了就是不出来下拉列表(C+N C+P都不行)。我再删除一两个字符吧,下拉列表就出来了(C+N C+P也可以翻路径了)

  6. Error detected while processing function lookupfile#LookupFile:
    line 81:
    E712: Argument of get() must be a List or Dictionary
    请楼主看下这个问题怎么弄。

  7. Error detected while processing function lookupfile#LookupFile:
    line 81:
    E712: Argument of get() must be a List or Dictionary

  8. 感谢写这么好的系列教程,在其中我学了很多很多。
    在使用过程中也遇到一些问题,其中一个问题是关于 LookupFile 插件的。
    开发过程中我们需要经常转到其他分支下去修改代码。
    于是我们会用 :cd 命令,或者使用 winmanager 的文件浏览器找到所在目录再按 c 切换当前目录。
    但问题来了,切换目录后再按 F5 进行查找时 LookupFile 插件还是找原来的 tags 所指的文件。无法使用当前目录下的 tags 文件进行文件查找。
    除非是你在这个目录直接进入 VIM 。

  9. 我也碰到来E117这个错误,现在解决来。
    原因来,我这些插件是用root用户装到,放在/etc下面到,插件*.vim也是只有root用户有可读权限,其他用户都是没权限(如下)
    -r–r–r– 1 root root 51932 2009-09-16 10:25 genutils.vim
    -r-x—— 1 root root 16556 2007-08-25 09:33 lookupfile.vim
    -rw-r–r– 1 root root 13401 2012-03-11 13:14 mark.vim
    -rw-r–r– 1 root root 147930 2007-09-21 18:11 taglist.vim
    所以,在其他用户执行vim的时候,插件就用不起来了。
    改下文件到权限就可以了。

  10. 谢谢Easwy,按照你的方法问题解决了,现在在公司用的是windows的GVIM,和linux版本的相比感觉怪怪的。。。顺便我想问一下用在normal模式下用q来录制宏的时候我如果想将宏的动作用于下面的几行,应该怎么做?

      1. @Easwy, 比如说我在第一行录制了宏@a,这个宏的功能是在行首键入注释的符号:
        qa->^->i->//
        这个时候我想在下面的五行执行同样的动作即把下面的五行全部注释掉,应该怎么做?

          1. @stam,
            你的宏里应该加一个下移的操作,整个序列应该是这样:
            qa^i//<ESC>jq
            或者你可以尝试一下NERD_commenter.vim插件

  11. 博主您好,想问一下为什么我下载的都是lookupfile和genutils.vim都是最新的版本但是运行vim的时候还是会提示
    greputils: You need a newer version of genutils.vim plugin

    lookupfile: You need a newer version of genutils.vim plugin
    环境windows XP vim版本 7.3

  12. 真是太感谢了! 终于看到一篇能解决实际问题的文章了 , 最近想用VIM编辑工程, 就是有几个问题纠结了, 搜到LZ这篇文章又解决一个问题哈~~~ 我准备把其他几篇全看完!!!!

  13. @yuebao
    在我的记忆里,“E117: Unknown function: lookupfile#OpenWindow”这个错误,是你的lookupfile插件没完全完全造成的,这个插件在.vim/autoload和.vim/plugin目录分别有一个文件,请检查.vim/autoload目录中是否有这个文件。

  14. Easwy :
    (以下为CSDN评论的转帖)
    #donkey 发表于2008-07-25 12:42:10 IP: 58.246.27.*
    Easwy,
    我的VIM版本是7.1并且安装了最新的 Lookupfile and genutils。但是当我用F5触发的时候,我遇到了以下问题。请问您可以指点一下吗?
    Error detected while processing function 12_LookupUsing:
    line 16:
    E117: Unknown function: lookupfile#OpenWindow
    #donkey 发表于2008-07-25 16:26:31 IP: 58.246.27.*
    This issue has been fixed. Thanks
    #leroywang 发表于2008-10-11 19:56:07 IP: 61.141.221.*
    起动时指定一tag文件,当目录改变后再使g:LookupFile_TagExpr重新指向另一文件,新指定的tag文件并不会马上生效,lookup时使用的还是原来的tag文件,请问怎样reset tag文件的链接,thx.
    2008-10-29 14:16:15作者回复
    从lookupfile脚本来看,它每次都是使用g:LookupFile_TagExpr来进行查找。也就是说这个变量的值改变后立即生效。你用下面的命令确定一下这个变量的值是不是真的改了:
    :echo eval(g:LookupFile_TagExpr)
    #wadewang2008 发表于2009-02-03 10:48:17 IP: 147.145.40.*
    hi donkey and Easywy,
    i also met the same error:
    Error detected while processing function 12_LookupUsing:
    line 16:
    E117: Unknown function: lookupfile#OpenWindow
    could you please tell me how your issue was fixed? i used gvim7.1 under linux.
    great thanks!

    我也遇到了同样的问题,不知各位怎么解决的?

  15. 您好,最近在学习Vim,您的系列文章很好。这个插件lookupfile,你提供的地址没法下载,不知道为啥,其他的插件都能下载的。这个插件根本没看到有下载链接,进入这个页面只有左边的菜单栏,右边是空白页面。您能发一个给我吗?xuxinhua1984@gmail.com

  16. lookupfile里面的help也提供了生成tag的脚本,请问博主和您写的脚步又什么区别呢?我刚接触vim,还看不懂你们的脚本…..

  17. @rainfish
    目前最新版本的lookupfile和我写这篇文章时的版本有所改变。
    我刚才已经更新了文章中为lookupfile所绑定的按键,可以用于最新的lookupfile插件。

  18. 博主,您好,没想到头几个问题您这么快就解答了,非常感谢!其他几个问题都解决了,非常感谢!现在一个苦恼的问题就是lookupfile,按照您的办法配置后,一开始可以查询文件,但是当打开文件后,再次查询就无法找到文件了,只是找到一些tag,比如类名字了,宏定义了之类的,而且选择后也不能定位到类名字的位置,而是新建了一个文件,不知道怎么回事,还望博主解答,非常感谢!

  19. 博主,你好,有个问题向您请教,我使用lookupfile时,发现有时候无法查询文件,还有就是无法查询已打开的缓冲区,请问是怎么回事?

  20. Easwy :
    2. vim也有类似的功能,输入两个字符,然后把<CTRL-P>或上箭头,就自动找到上一条以此字符开关的命令

    我的vim按<CTRL-P>是翻到上一条命令,而不是找到上一条以此字符开关的命令。。。不知是否要设置哪个开关。。。

  21. @karlzheng

    1.

    :help :_%

    2. vim也有类似的功能,输入两个字符,然后把<CTRL-P>或上箭头,就自动找到上一条以此字符开关的命令
    或者你可以用

    q:

    打开命令行历史窗口

    :help q:

  22. 再请教:
    1、昨晚你用:cd %:p:h这一个指令中的:p,:h是file modifers的指令?那%是什么意思呢?是expand吗?用help %看到的是跳转到下一个匹配的括号这样子的意思。。。cmd模式中的%的作用好像不同?
    2、vim cmd模式的命令历史是否有bash shell中ctrl+r输入两个字符再ctrl+r这样搜索的功能?

  23. 谢谢解答!
    1、我在vimrc中设了:set nocp之后,输入IPCThr还是会提示:
    Exception: Vim(let):E354: 无效的寄存器名: ‘*’
    2、在tags中有文件InputDevice.java, 我在LookupFile窗口输入InputDevice.java可以搜到文件,但在Input.* 或Input* 均没法匹配到这个文件,请问是为什么?
    在bbs那边回复了

  24. 用这个插件,打开lookupfile窗口,输入:“input”它会搜索没问题。
    但输入:”IPCThread”想搜索一个IPCThread的文件,提示:
    Exception: Vim(let):E354: 无效的寄存器名: ‘*’

    不知道什么问题。。。
    请问可否把你用的插件文件传上来?--我用的都是官方最新的文件。。。

  25. 输入两个字符就开始查找还是很不方便–开始查找的时候再输入字符几乎不响应,过了老半天才有反应。。。

  26. Easwy :
    @karl
    应该你配置的问题,即使lookupfile插件会自动插入内容,也应该是你上次所搜索的文件名,而不是这样一句话
    这句话看起来像是你的注释…

    是的 是那个键映射后面的内容。。。
    这个插件好像有个bug(也不知是否是我使用的问题)--输入一些内容后如果删除了再输入它不会去找文件(在vim下面会显示:“正在扫描:”+当前编辑的文件名)

  27. @karl
    应该你配置的问题,即使lookupfile插件会自动插入内容,也应该是你上次所搜索的文件名,而不是这样一句话
    这句话看起来像是你的注释…

  28. @karl
    libc_init_common.h中,init_c可以匹配init.c这个正则表达式

    如何设置回车时再开始搜索我没试过,你读一下lookupfile插件文档,看能不能设置?

  29. 我照你说的:
    nmap lk LookupFile
    做了映射:但每次一敲:,lk在Lookup窗口就会已经自动输入了: “映射LookupFile为,lk
    结果只能先把它删掉。。。设置哪里去掉?

  30. Easwy :
    @karl
    是的,”.”匹配单个字符。
    匹配速度取决于你项目的大小,对比较大的项目,建议单独为lookupfile生成一个tag文件,并且设置lookupfile插件,让它在输入了2个或更多字符时再开始搜索,这样可以提高速度。
    我的项目有近20000个文件,我感觉搜索速度可以接受。

    1、 ”.”匹配单个字符,那libc_init_common.h怎么能匹配init.c这个模式?
    2、 两个字符就开始搜索?--太早了,我想回车的时候才开始搜索,请问知道怎么设置吗?

  31. @karl
    是的,”.”匹配单个字符。

    匹配速度取决于你项目的大小,对比较大的项目,建议单独为lookupfile生成一个tag文件,并且设置lookupfile插件,让它在输入了2个或更多字符时再开始搜索,这样可以提高速度。
    我的项目有近20000个文件,我感觉搜索速度可以接受。

  32. Easwy :
    @karl
    这些匹配都是正确的,因为lookupfile查找时使用的是正则表达式,在正则表达式里,点(.)表示的是任意字符
    如果你想查找init.c,用这个表达式:init\.c
    或者^init\.c$,前一个会把所有文件名中包含init.c的文件找出来,后者则只列出文件名是init.c的

    ‘.’不是匹配单个字符吗? .*才是匹配N个字符吧?
    另:搜索的速度好像不是很快

  33. @karl
    这些匹配都是正确的,因为lookupfile查找时使用的是正则表达式,在正则表达式里,点(.)表示的是任意字符
    如果你想查找init.c,用这个表达式:init\.c
    或者^init\.c$,前一个会把所有文件名中包含init.c的文件找出来,后者则只列出文件名是init.c的

  34. Easwy :
    @karl
    1. 你有为lookupfile插件生成专门的文件名tag文件吗?
    2. 检查g:LookupFile_TagExpr变量的设置正不正确
    3. 试试按我文中的步骤操作一遍

    还是不行,在LoopupFile窗口插入状态下输入:init.c,匹配出以下结果:
    /root/source/android2.0/eclair/bionic/libc/bionic/libc_init_common.c
    /root/source/android2.0/eclair/bionic/libc/bionic/libc_init_common.h
    /root/source/android2.0/eclair/bionic/libc/netbsd/resolv/res_init.c
    。。。。。。。。
    感觉好像是查找文件内容那样子,这些文件名好像不匹配init.c的

  35. 先再请教一下问题:
    我在.vimrc中加下面这段脚本:
    if filereadable(“./tags”)
    “set tags=getcwd() . “/tags”
    let mytags=”tags=” . getcwd() . “/tags”
    echo mytags
    set mytags
    endif

    set指令出错,请问应该怎么设?谢谢!

  36. @karl
    1. 你有为lookupfile插件生成专门的文件名tag文件吗?
    2. 检查g:LookupFile_TagExpr变量的设置正不正确
    3. 试试按我文中的步骤操作一遍

  37. 我做了tag,查找的时候,出来的结果没有包含想要的结果:
    test
    <<< 25042 Matching >>>
    /root/source/android2.0/eclair/bionic/libc/bionic/pthread.c
    /root/source/android2.0/eclair/bionic/libc/kernel/arch-x86/asm/bitops_32.h
    /root/source/android2.0/eclair/bionic/libc/kernel/arch-x86/asm/mpspec_32.h
    /root/source/android2.0/eclair/bionic/libc/kernel/arch-x86/asm/pda.h
    /root/source/android2.0/eclair/bionic/libc/kernel/arch-x86/asm/pgtable_32.h
    /root/source/android2.0/eclair/bionic/libc/kernel/arch-x86/asm/voyager.h
    /root/source/android2.0/eclair/bionic/libc/kernel/common/asm-generic/bitops/le.h
    /root/source/android2.0/eclair/bionic/libc/kernel/common/asm-generic/pgtable.h

  38. @Easwy
    谢谢你,这个问题我解决了,原来是下载lookupfile 跟genutils的时候,都有一个autoload目录没有放到.vim下面去。

  39. 这个问题我还没有解决啊,权限我也改了,还是出一样的错误,lookupfile 1.8 genutils 我用的2.4的,还是出一样问题,有知道解决方法的吗,谢谢了,折腾我两个月了,系统都重装了。

  40. 啊啊,自己解决了,可能是.vim文件夹拷来拷去,权限发生了变化,重新chown 一下就没这个问题了

  41. function 12_LookupUsing:line 16:E117: Unknown function: lookupfile#OpenWindow
    请问一下这个问题如何解决的,谢谢。

  42. @Jeanva
    可能你要看一下lookupfile和minibufexpl这两个插件的源代码,或者写信问问作者。我记得lookupfile打开窗口调用的是通用vim脚本库中的函数,我想问题应该不在这里。

  43. 有个问题:就是和minibufexpl.vim一起用的话,使用lookupfile会导致minibufexpl的窗口只显示一行,是否与Lookupfile用到的OpenWindow的实现有关?

  44. 楼上的如上映射即指[Lookupfile配置]小节所示

    发现带尖括号的内容提交评论之后就看不到了

  45. 发现一个问题:
    nmap lk LookupFile
    在我的机器上,如果如上设置映射,每次按下”,lk”会默认打开一个文件,该文件的文件名是上次的搜索模式
    如果将映射的去掉该问题就解决了

    不知道对不对?还是只有我才有这种问题呵呵

  46. 不好意思,刚才是我自己粘贴复制设置的时候
    它居然会自动在.vimrc里跑出”space”(空格),汗…

  47. 好文章,学到很多,有个小问题
    按这里的讲解一步步下来,为什么每次按,lk或者,ll弹出Lookupfile小窗口,都会在光标前面默认有若干个空格呢,还得每次按Back退回去才能有效输入
    谢谢

  48. ,lk也没用- -
    每次得直接输入命令才打开。确实很麻烦。。
    难道是我没配置好?
    快捷键应该已经设置好了。。否这不会出这状况的。。。
    l是移动啊。。

  49. 谢谢谢谢
    搞定。。
    顺便弱智的问一句。。怎么按lk调出来呢- -
    :,lk?
    :lk?
    直接按lk?
    不好意思。。我刚从emacs转过来。。emacs写程序的时候快捷键太诡异了。。。

  50. @SamPeng
    查了一下,这个是cppcomplete.vim插件设置的
    你不用改cppcomplete.vim插件的设置,只要你用
    nmap <unique> <silent> <leader>lk <Plug>LookupFile
    imap <unique> <expr> <silent> <leader>lk (pumvisible()?”\<C-E>”:””).”\<Esc>\<Plug>LookupFile”
    设置一下lookupfile的键映射就可以了

  51. 为什么我装上去却提示我
    处理 /home/sampeng/.vim/plugin/lookupfile.vim 时发生错误:
    第 148 行:
    E227: 映射 k5 已存在
    sampeng@SamPeng:~/.vim/plugin$
    F5没命令了阿。再说不是转移到lk上去了么

  52. 你好!感谢你写的文章,让我基本可以使用vim代替sourceinsight,
    我发现lookupfile一个奇怪的现象,想请教一下你,如下:
    使用:LookupFile(也就文章中的,lk)连续打开多个文件,比如a.c
    然后打开b.c,再重新打开a.c,然后执行:LUBufs(也就是文章中的,ll),
    弹出来的buffer列表中a.c有两个entry,其实是一模一样的,
    不知道你有没有碰到同样的问题?是否知道怎么解决?
    谢谢!

    1. 我试了一下我的lookupfile,没有发现这个问题。从理论上讲,也不应该有这个问题,因为:LUBufs是在当前缓冲区列表中查找,而同一个文件只会占用一个缓冲区。
      你使用:ls命令察看一下缓冲区中是不是对这个文件打开了两次?会不会这个文件的路径出现了两种表示方法,例如,一个路径是/home/xxx/a.c,另外一个路径是~/a.c?

  53. (以下为CSDN评论的转帖)

    #donkey 发表于2008-07-25 12:42:10 IP: 58.246.27.*
    Easwy,
    我的VIM版本是7.1并且安装了最新的 Lookupfile and genutils。但是当我用F5触发的时候,我遇到了以下问题。请问您可以指点一下吗?
    Error detected while processing function 12_LookupUsing:
    line 16:
    E117: Unknown function: lookupfile#OpenWindow

    #donkey 发表于2008-07-25 16:26:31 IP: 58.246.27.*
    This issue has been fixed. Thanks

    #leroywang 发表于2008-10-11 19:56:07 IP: 61.141.221.*
    起动时指定一tag文件,当目录改变后再使g:LookupFile_TagExpr重新指向另一文件,新指定的tag文件并不会马上生效,lookup时使用的还是原来的tag文件,请问怎样reset tag文件的链接,thx.

    2008-10-29 14:16:15作者回复
    从lookupfile脚本来看,它每次都是使用g:LookupFile_TagExpr来进行查找。也就是说这个变量的值改变后立即生效。你用下面的命令确定一下这个变量的值是不是真的改了:
    :echo eval(g:LookupFile_TagExpr)

    #wadewang2008 发表于2009-02-03 10:48:17 IP: 147.145.40.*
    hi donkey and Easywy,
    i also met the same error:
    Error detected while processing function 12_LookupUsing:
    line 16:
    E117: Unknown function: lookupfile#OpenWindow
    could you please tell me how your issue was fixed? i used gvim7.1 under linux.
    great thanks!

  54. (以下为CSDN评论的转帖)

    #虫子 发表于2007-12-26 16:27:23 IP: 159.226.43.*
    其实不用这个插件查找文件也很方便。
    方法如下,
    建立项目的时候使用
    find -name “*.c” -o -name “*.h” >project.files
    把所有项目需要的文件名保存在一个文件里面。这时候每个文件只占一行
    使用的时候只要 vi project.files
    然后就可以直接使用vi的查找方法来查找文件了。
    定位了文件所在那行,只要 gf 就可以打开文件。很方便
    而且完全可以把 vi project.files 绑定一个快捷键

    2007-12-29 09:24:55作者回复
    在没有这个插件时,用这种方法也不错。
    不过这个插件还有一些其它的功能,用起来也不错的

    #diablo0822 发表于2008-05-13 16:44:01 IP: 116.24.239.*
    找到了一个比较方便的方法
    在XP/VISTA下直接:Texplore就可以出来当前工作目录了,方便查找文件

    #小猪 发表于2008-06-10 14:38:32 IP: 59.41.221.*
    不用cygwin,试试msys

  55. (以下为CSDN评论的转帖)

    #diablo0822 发表于2007-06-04 23:21:55 IP: 121.35.47.*
    楼主,请问下你这个生成文件目录的脚本我在XP应该怎么用?
    我直接用ctags -R * 生成的tag文件来用lookupfile很不方便。

    #easwy 发表于2007-06-05 09:34:15 IP: 213.70.90.*
    在windows下,你可以装上cygwin,里面有find工具

    #diablo0822 发表于2007-06-05 23:36:45 IP: 121.35.47.*
    不会吧,这样太麻烦了,为了这个find工具装个cygwin。。。。还不如装个linux。不过还是谢谢你了,这些文章写得特别好,我都看过了,现在在XP下用SI感觉很不爽,还是装个linux好了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注