vi/vim使用进阶: 文件浏览和缓冲区浏览

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

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

:help netrw-browse
:help bufexplorer
:help winmanager 

[文件浏览]

在开发过程中,经常需要查找某个文件。我们前面在介绍path选项时,介绍过使用find命令查找文件的方法。本节介绍vim的文件浏览插件。

在vim 7.0以前,文件浏览功能由explorer.vim插件提供,在vim 7.0中,这个插件被netrw.vim插件所代替。本文以vim 7.0为例,主要介绍netrw.vim插件。

netrw.vim是vim的标准插件,它已经伴随vim而发行,不需要安装。

我们现在试一下vim文件功能,当你使用vim尝试打开目录时,vim会自动调用netrw.vim插件打开该目录(从操作系统的视角来看,目录其实是一种特殊的文件)。例如,我们在vim中执行命令”:e ~/src/vim70/src/“,会显示下面的窗口:

这个窗口类似于文件管理器,你可以创建、删除、改名文件或目录;在目录上按回车时,会进入该目录;在文件上按回车时,会使用vim打开该文件;可以更改排序方式、排序风格;隐藏目录或文件(使之不在上述窗口中显示)等等。

Netrw插件中常用键绑定有:

<F1>        显示帮助
<cr>        如果光标下为目录,则进入该目录;如果光标下是文件,则用vim打开该文件
-           返回上级目录
c           切换vim的当前工作目录为正在浏览的目录
d           创建目录
D           删除文件或目录
i           切换显示方式
R           改名文件或目录
s           选择排序方式
x           定制浏览方式,使用你指定的程序打开该文件 

其它常用键,诸如使用书签、隐藏符合条件的文件等,请参阅netrw帮助页。

上面我们用”:e ~/src/vim70/src/“的方式打开netrw,我们还可以使用”:Explore“等Ex命令来打开文件浏览器。我的vimrc中这样配置:

""""""""""""""""""""""""""""""
" netrw setting
""""""""""""""""""""""""""""""
let g:netrw_winsize = 30
nmap <silent> <leader>fe :Sexplore!<cr> 

这样,在我输入”,fe“时,就会打开一个垂直分隔的窗口浏览当前文件所在的目录,窗口的宽度为30。

浏览本地文件只是netrw插件的一项小功能,netrw插件最主要的功能是支持远程文件读写。利用该插件,你可以通过ftp,ssh,http等多种协议来编辑远程文件,也可以浏览远程机器的目录。

在软件开发过程中不常使用此功能,本文中不再介绍。参阅netrw手册页获取更多信息。

[缓冲区浏览]

在开发过程中,经常会打开很多缓冲区,尤其是使用tag文件在不同函数间跳转时,会不知不觉打开很多文件。要知道自己当前打开了哪些缓冲区,可以使用vim的”:ls“Ex命令查看。

开发过程中,又经常需要在不同文件间跳转。我习惯于使用”CTRL-^“来切换文件,这就需要知道文件所在的缓冲区编号。每次都使用”:ls“来找缓冲区编号很麻烦,所以我使用BufExplorer插件来显示缓冲区的信息。

BufExplorer插件在此处下载:http://vim.sourceforge.net/scripts/script.php?script_id=42

下载后,把该文件在~/.vim/目录中解压缩,这会在你的~/.vim/plugin和~/.vim/doc目录中各放入一个文件:

plugin/ bufexplorer.vim - bufexplorer插件
doc/ bufexplorer.txt    - bufexplorer帮助文件 

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

使用下面的命令生成帮助标签(下面的操作在vim中进行):

:helptags ~/.vim/doc 

然后,就可以使用”:help bufexplorer“命令查看BufExplorer的帮助文件了。

BufExplorer功能比较简单,这里就不做介绍了。我的vimrc里这样设置BufExplorer插件:

""""""""""""""""""""""""""""""
" BufExplorer
""""""""""""""""""""""""""""""
let g:bufExplorerDefaultHelp=0       " Do not show default help.
let g:bufExplorerShowRelativePath=1  " Show relative paths.
let g:bufExplorerSortBy='mru'        " Sort by most recently used.
let g:bufExplorerSplitRight=0        " Split left.
let g:bufExplorerSplitVertical=1     " Split vertically.
let g:bufExplorerSplitVertSize = 30  " Split width
let g:bufExplorerUseCurrentWindow=1  " Open in new window.
autocmd BufWinEnter \[Buf\ List\] setl nonumber 

BufExplorer已经映射了几个键绑定,例如,使用”,bv“就可以打开一个垂直分割窗口显示当前的缓冲区。

有一个称为minibufexpl.vim的插件,也可以把缓冲区列表显示出来,这个插件在此处下载:http://vim.sourceforge.net/scripts/script.php?script_id=159

使用这个插件后,屏幕截图看起来是这样,最上面一个窗口就是minibuffer窗口,列出了当前打开的缓冲区:

这个插件没有帮助文件,参考下载页上的说明,以及脚本代码来进行配置。

[winmanager插件]

winmanager插件可以把上面介绍的Explorer插件(vim 7.0以前的文件浏览插件)和BufExplorer插件集成在一起,我们上篇文章中介绍过的taglist插件也提供了对winmanager插件的支持。

Winmanager插件在这里下载:http://vim.sourceforge.net/scripts/script.php?script_id=95

下载后,把该文件在~/.vim/目录中解压缩,这会把winmanager插件解压到~/.vim/plugin和~/.vim/doc目录中:

plugin/winmanager.vim – winmanager插件
plugin/winfileexplorer.vim  - 改良的Explorer插件
plugin/wintagexplorer.vim – winmanager提供的tag插件,用处不大
doc/winmanager.txt – 帮助文件 

仍然用”:helptags ~/.vim/doc“命令来生成帮助标签,然后就可以使用”:help winmanager“来查看帮助了。

使用winmanager插件可以控制各插件在vim窗口中的布局显示。我的vimrc中这样设置:

""""""""""""""""""""""""""""""
" winManager setting
""""""""""""""""""""""""""""""
let g:winManagerWindowLayout = "BufExplorer,FileExplorer|TagList"
let g:winManagerWidth = 30
let g:defaultExplorer = 0
nmap <C-W><C-F> :FirstExplorerWindow<cr>
nmap <C-W><C-B> :BottomExplorerWindow<cr>
nmap <silent> <leader>wm :WMToggle<cr> 

g:winManagerWindowLayout变量的值定义winmanager的窗口布局,使用上面的设置,我们的窗口布局看起来是这样的:

左边有两个窗口,上面的是BufExplorer窗口,下面是taglist窗口。FileExplorer窗口和BufExplorer共用一个窗口,在BufExplorer窗口中使用”CTRL-N“可以切换到FileExplorer窗口,再使用一次则又切换回BufExplorer窗口。也就是说,在变量g:winManagerWindowLayout中,使用”,”分隔的插件,在同一个窗口中显示,使用”CTRL-N“在不同插件间切换;使用”|”分隔的插件,则在另外一个窗口中显示。

在屏幕右边的窗口则是主编辑区。

在上面的vimrc设置中,还定义了三个键映射,分别用于跳到左上窗口、左下窗口,以及显示/关闭winmanager窗口。

注:安装后,如果未设置g:winManagerWindowLayout变量,winmanager插件需要与BufExplorer插件一起才能使用。所以需要下载BufExplorer。

http://vim.sourceforge.net/scripts/script.php?script_id=1440有一个winmanager插件的修改版本,如果在FileExplorer中打开文件时,它会使用与该文件相关联的程序来打开该文件,而不是使用vim。我没有使用过这个插件,有兴趣你可以试试。

[参考文档]

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

原创文章,请阅读页脚的许可方式,转载请注明:转载自易水博客 [ http://easwy.com/blog/ ]

本文链接地址: http://easwy.com/blog/archives/advanced-vim-skills-netrw-bufexplorer-winmanager-plugin/

文章的脚注信息由WordPress的wp-posturl插件自动生成

43 thoughts on “vi/vim使用进阶: 文件浏览和缓冲区浏览

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

    #flyincosmic 发表于2007-05-02 23:25:06 IP: 220.192.43.*
    :e d:\tools调出来的实际上是fileExplore.vim
    不知如何显示出如上图的netrw directory list界面(windows xp vim7.0下)

    Explore类的命令也不可用,说处理function 6_StartExporler时发生错误,

    #met 发表于2008-01-16 19:05:35 IP: 220.173.106.*
    请问为什么将映射写入_vimrc之后没有办法像您那样用,**快捷方式? 在win下

    #easwy 发表于2008-01-17 09:45:18 IP: 213.70.90.*
    可能你的和我的不同,使用:echo mapleader命令查看一下你的mapleader是什么
    如果你没做更改的话,缺省应该是\而不是,
    所以你的快捷方式应该用\**。

    #met 发表于2008-01-19 18:21:56 IP: 220.173.106.*
    显示无mapleader命令

    #easwy 发表于2008-01-21 09:20:38 IP: 213.70.90.*
    :echo mapleader

    [回复]

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

    #yeah2000 发表于2008-01-21 16:54:43 IP: 123.116.238.*
    您好,我下载了您的.vim 和vimrc,而且安装了其他需要安装的插件,可是我为什么看不到您 的这种窗口布局效果呢(他们在加载的时候没有出现任何错误)
    谢谢!

    #yeah2000 发表于2008-01-21 17:04:51 IP: 123.116.238.*
    不好意思,是我刚才没有看懂,现在明白了

    #snzf110 发表于2008-09-19 16:11:09 IP: 117.41.132.*
    我的ubuntu8.04 ~/.vim 根本就是一个文件,不是目录

    [回复]

  3. 楼主的VIM系列文章确实水平很高啊,在网上看到这么高水平的文章不多。楼主的系列文章把俺的VIM也打造了个新模样。原来俺只用lookupfile, ctags, cscope,还有devhelp.vim。我觉得已经很强大了,基本上可以实现Source Insight里常用的功能了。加了这里学到的taglist, bufexplorer, winmanager。哈哈,越来越有IDE的影子了。

    [回复]

  4. 你好,我在 XP3 下安装了这个插件,左侧显示的是 FileExplorer 和 TagList 窗口,但在我用鼠标双击 TagList 项时,TagList 窗口就会自动的向上增长,如果手动调整好TagList 窗口的高度后,再双击还是会自动的向上增长,奇怪的是,我如果再打开一个文件(就是有多个缓冲区)时,再双击就不会自动向上增长了.这是什么原因呢?望指教.

    [回复]

  5. 你好!如大虾所说配好了,但是我在wmmanager窗口中用回车无法打开对应的文件,不知道为什么。望指教,谢谢。

    [回复]

  6. 没有错误信息,回车之后就自动跳到主操作窗口现有文件中了,并不会打开对应文件。但是如果文件是已经打开存在在缓冲区中的,回车之后会在主操作窗口中显示。

    [回复]

  7. 哦,估计是我文件夹放得太深,而且用的link进去的。。。移到 ~/ 下面就是正常的了。。。。thank you~

    [回复]

  8. Pingback: 寻觅/14 » Blog Archive » vim使用进阶

  9. 楼主,你的教程很好,我看完之后很有收获。现在指出一个小错误:
    BufExplorer已经映射了几个键绑定,例如,使用”,bv“就可以打开一个垂直分割窗口显示当前的缓冲区。

    这句话里面”,bv”应该改成”\bv”吧?官方上有这样一段话。

    description
    With bufexplorer, you can quickly and easily switch between buffers by using the one of the default public interfaces:

    ‘\be’ (normal open) or
    ‘\bs’ (force horizontal split open) or
    ‘\bv’ (force vertical split open)

    [回复]

  10. 楼主,您好,您的教程写得很不错,但是,我有一个问题:

    windows下:
    nmap wm :WMToggle
    不能自己显示多窗口。

    我要写成:

    nmap :WMToggle

    然后,用快捷键才可以。
    请问这是为什么?
    谢谢。

    [回复]

  11. Easwy :
    @rushui999
    在我的vimrc中重新映射了mapleader,在前面的文章中有提到,所以是用,bv
    :help mapleader

    嗯,果然不错,你是自己重新定义了,呵呵,最开始看你的前面的部分的时候,才接触vi,看得不是很懂,也就没有留心看。

    [回复]

  12. 我用lookup插件,不知道为什么没法用正则*等配置?
    而且刚打开lookup插件可以查找文件,输入字符后删掉几个再输,文件就不会再出来了

    [回复]

  13. 你好,请问如何让winmanager显示在右边阿?
    还有,如何让Project插件的窗口也加到winmanager里面?

    [回复]

  14. @absolute8511
    winmanager默认是显示在左边,要显示在右边,可能要自己改插件的代码。

    你先试试project.vim支不支持winmanager。如果它不支持,想加进来要自己写一些vim脚本,看这里:
    :help winmanager-adding

    [回复]

  15. 博主,您好,又麻烦您了,我帮定了这两个快捷键,在公司很好使,可是回家后,怎么也不好使了,按F3,和F4键都是把光标所在位置的字母大写改成小写,小写改成大写。为什么呢?
    201 nmap :FirstExplorerWindow
    202 nmap :BottomExplorerWindow

    [回复]

  16. 您好,博主,我使用的是minibuffer和nerdtree,但是每次在:mksession!后,当使用:source打开session,总是提示错误,我在网上查了好久,大概是这个原因“The biggest roadblock is that sessions can only store string and integer variables, while nerdtree makes insane use of hashes and arrays to store the filesystem data. So id have to do fairly large hacks to make this work.”现在我只是想使用这两个插件,然后能够自动保存我的工作窗口设置,请问您是怎么解决的呢?

    [回复]

  17. 楼主,我遇到一个使用上的问题很不爽.你帮忙看下.

    在打开winmanager以后,用tags找到一个符号有多个定义是就会出现多个选择.

    1 …
    2 …
    3 …

    当我选择任意一个回车就会在屏幕的最下端出现:
    Escaped
    Press ENTER or type command to continue
    要再敲一次回车才能跳到相应的文件.
    在没有打开winmanger时就不回有这样的情况.
    而且有时在文件间跳转的时候会出现Escaped, 但不需要敲回车.
    觉得很奇怪,而且找不到为什么,麻烦你帮忙看一下.

    [回复]

  18. @Easwy
    这应该是bufexplorer 的bug,临时措施是在bufexplorer.vim中找到提示escaped的那一行,将其注释掉。经测试暂时没有发现有什么问题。

    [回复]

  19. 易水:
    你好,看了你的vim系列博客受益菲浅,少走了很多弯路,谢谢。
    问个问题,lookupfile搜索文件时如何设置显示相对路径而不是绝对路径?
    比如我的工程在/home/myname/workspace/source,这个目录下也放着cscope.out,filenametags等文件,
    每次都是在终端cd /home/myname/workspace/source,然后vim,
    但当我F5搜索文件时,列出的匹配项总是绝对路径(路径有时很长,但我知道是在这个工程目录下的所以source以前的路径不需要显示),而且打开一个文件时,文件底部横条显示文件名也是绝对路径。我看了filenametags,里面是相对路径,请问如何设置可以显示相对路径,谢谢。

    [回复]

    Easwy 回复:

    @yuebao,
    应该是你设置g:LookupFile_TagExpr变量时使用了绝对路径,像下面这样使用相对路径就可以了:
    let g:LookupFile_TagExpr = ‘”./filenametags”‘
    但使用相对路径,你就不能随意切换当前路径,否则lookupfile插件就无法找到相应的文件了。

    [回复]

发表评论

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

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>