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使用进阶: 目录

“vi/vim使用进阶: 文件浏览和缓冲区浏览”的70个回复

  1. 博主你好,我在使用BufExplorer时,每次调出BufExplorer,还要根据buffer序号,再输入:b number来切换文件,感觉还是不方便,能不能在调出BufExplorer时,直接输入数字就能切换文件呢?

    1. 我通常是用 <CTRL-^>命令来切换缓冲区,打开BufExplorer只是为了查看缓冲区编号。例如,想要切换到缓冲区1234的话,我会按 1234<CTRL>6
      上述命令中的<CTRL>6就相当于<CTRL>^

      :h CTRL-^

      1. 打开多个buffer后,使用buffer delete操作删除里几个buffer,这时的buffer 编号就没有按照顺序了,有没什么操作能重新将这些buffer编号?

  2. 博主你好,bufexplorer的默认快捷键\be,按了没反应。 在.vimrc中添加
    nnoremap be :BufExplorer
    才有反应
    问题是bufexplorer.vim中不是已经有这句了吗,而且我也定义了
    let g:bufExplorerDisableDefaultKeyMapping=0
    很奇怪。

    1. 解决了,因为我重新定义了这些快捷键,都是带属性的,所以\be就失效了。
      nnoremap :BufExplorer
      nnoremap :BufExplorerHorizontalSplit
      nnoremap :BufExplorerVerticalSplit

  3. 大神,很久很久以前,我是看着您的这一系列配置vim的。不过最近用得也挺顺手,不过今天突然想到一个问题,既然您装了LookupFile,那么装Buffer的插件又有何意义呢?日常开发中直接通过lookupfile打开你需要编辑的文件,编辑完了保存,完全没有必要看buffer呀?

    1. 主要是因为,在开发过程中,有时经常会在几个常用的缓冲区之间来回切换。这时用lookupfile插件没有使用缓冲区编号方便,对大工程尤为如此。另外一个原因是,当沉浸在开发思路中时,有时会想不起文件名,这时有个视觉上的提示有好处,可以在不中断思路的情况下切换到自己所需的文件。

  4. 提问大牛,怎么设置netrw的高度或者BufExplorer的高度,发现左边的上下两个窗口总是上面过短,看文件列表或者缓冲区列表不是很爽,下面很长,需要用鼠标拉动,而且会自动跳回原来状态,非常感谢。

    1. 可以用下面的命令设置BufExplorer的最大高度:

      let g:bufExplorerMaxHeight=25 ” Max height

      但是需要注意的是,如果你打开的文件不到25个,那个WinManager会自动缩放窗口,只显示你打开的全部文件。

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

    这个描述有错误,根据
    BufExplorer官网上的描述:http://vim.sourceforge.net/scripts/script.php?script_id=42

    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)

    应该是依次按下 \ b v 三个键,就会出现BufExplorer的子窗口。而不是依次按下 , b v三个键。

  6. 首先感谢你的劳动。

    其次我想表达一下被该文章误导了,键入,fe 打开文件浏览窗格,我试了半天不行,查了很久发现是mapleader的设置问题,既然是写给新手的,这些东西为什么不说明一下啊?
    还有发现许多vim的文章写得都是模棱两可,新手很容易误入歧途啊。

  7. 博主你好,逐篇学习你的文章,我在安装BufExplorer的时候遇到了点问题:我是使用pathogen管理插件的,下载BufExplorer解压之后,我将plugin/bufexplorer.vim放入~/.vim/bundle/下,将doc/bufexplorer.txt 放到~/.vim/doc/下。生成helptags后我能看到help bufexplorer的帮助文件了,但是执行:BufExplorer显示Not an editor command: Bufexplorer,快捷键\bv \be也无效。我查看:scriptnames插件好像没有装载上。请问我是哪里出了问题?谢谢。

      1. 谢谢你的回复,照你说的更改以后就解决了。以前装了pathogen后以为手动装的插件就要放到bundle里,看来还是没研究懂 :)

  8. 还有一个问题是不管是
    :e dir
    还是
    ,wm
    出来的文件浏览器都不是netrw 而一个file exporer。不知道这是什么原因
    let g:defaultExplorer = 1
    不管是0 还是1都是一样的

  9. 您好 我按照文章设置完以后 按下,wm后会提示错误e118

    处理 function 25_GotoNextExplorer InGroup. . 25_EditNextVisibleExplorer. . Buf Explorer_Start 时发生错误
    E118:函数的参数过多 BufExplorer

    我的BufExplorer用的是7.3.6 vim是7.3 xp系统 ,不知是不是版本的问题 winmanger是02年那版

  10. 你好, 有两个问题请教:
    1. let g:winManagerWindowLayout = “BufExplorer,FileExplorer|TagList”
    这样配置后,出来的文件浏览是vim当前目录下的,而我只关心当前打开文件所在
    的目录下的文件。如当前在source下,执行vim ./frameworks/base/cmds/servicemanager/binder.c
    然后,wm 出来的浏览是source下的,而我想看的是source/frameworks/base/cmds/servicemanage这个目录下的所有文件,即在当前文件下执行:Sexplore!通过netrw出来的窗口是我需要的,我试了配置成 let g:winManagerWindowLayout = “netrwtree|TagList”,结果一输入,wm,就退出vim了,请问该如何配置?
    2.通过:Sexplore!打开窗口时,我移动到想打开的文件名上,按下回车,默认是在当前窗口打开此文件,请问如何配成在原先文件窗口打开,
    如./frameworks/base/cmds/servicemanager/目录下有binder.c
    和makefile
    我当前打开的是./frameworks/base/cmds/servicemanager/binder.c,然后
    :Sexplore,把光标移动到makefile,按下回车,这时我想在打开binder.c的窗口
    来打开makefile,而不是在fileexplore窗口打开,请问应该如何配置?

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

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

      1. @Easwy,
        你好,let g:LookupFile_TagExpr = ‘”./filenametags”‘
        这个我也是这样设置的,现在重装了机器,重新配置还是一样。
        :echo eval(g:LookupFile_TagExpr)
        显示的就是
        ./filenametags
        路径真的太长了~help,thx

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

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

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

    1 …
    2 …
    3 …

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

  14. 您好,博主,我使用的是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.”现在我只是想使用这两个插件,然后能够自动保存我的工作窗口设置,请问您是怎么解决的呢?

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

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

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

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

  18. 在Lookup窗口输入:
    java
    <<>>
    /root/source/android2.0/eclair/build/core/base_rules.mk

    匹配出来的文件没有java啊

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

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

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

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

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

    我要写成:

    nmap :WMToggle

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

  22. 楼主,你的教程很好,我看完之后很有收获。现在指出一个小错误:
    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)

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

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

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

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

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

  28. (以下为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 根本就是一个文件,不是目录

  29. (以下为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

发表回复

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