08

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

上一章我们介绍了会话(session)文件和viminfo文件,其中’sessionoptions’选项和‘viminfo’选项的配置可能会根据你的需要进行调整。但如何保存你所做的调整呢?我们将在这一章中介绍。

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

:help compatible
:help mapleader
:help map
:help autocmd 

为什么我的vim这么难用?不能语法高亮,没有折行,不能打开多个窗口多个buffer,不能……

为什么别人用几个键就可以完成一个很复杂的功能,而我不能?

为什么别人的vim看起来和我的很不一样?

……

当你开始问这些问题的时候,是时候去检查一下你的vimrc了。

当vim在启动时,如果没有找到vimrc或gvimrc,它缺省工作VI兼容的模式。这意味着,你只能使用VI所具备的功能,而vim中的大量扩展功能将无法使用。也许这就是你的vim如此难用的原因。

vim中自带了一个vimrc例子,让我们从这个例子开始吧。

下面我以Linux下的vim为例,windows版本的vim,会在后面提到。

示例的vimrc(名为vimrc_example.vim)通常位于/usr/share/vim/vimXXX/目录下,其中vimXXX与你所使用的vim版本有关。

首先把这个示例的vimrc拷贝到相应的目录,在Linux下,应该把它拷贝到你的home目录下,名字为”.vimrc”,下面是shell命令:

cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc 

或者你在vim中执行下面的命令,和上面的shell命令完成相同的功能:

:!cp $vimRUNTIME/vimrc_example.vim ~/.vimrc 

现在,你退出vim后再进入,你的vim和刚才已经不一样了。

你可以先读一下你的vimrc,看看它都设定了什么:

:e ~/.vimrc 

这是一个注释良好的文件,不需要多解释。

对windows版本的vim,它已经缺省的有了一个vimrc,你可以在vim在使用下面的命令来查看它:

:e $vim/_vimrc 

在这个文件中,它包含了上面提到的vimrc_example.vim。同时,它会把vim设置的更符合windows的操作习惯。比如,支持CTRL-C拷贝,CTRL-V粘贴等等。Windows下的用户,可以使用$vim/_vimrc来做为你的第一个vimrc。

顺便提一句,在unix/linux中,文件名可以以”.”开头,表明此文件是隐藏的。而在windows中,不允许文件名以”.”开头,所以,windows版本的vim,将读取_vimrc来做为自己的配置文件。

在今后使用vim的日子里,你会频繁的更改你的vimrc。所以我们需要设置一些快捷方式,使我们能快速的访问vimrc。

把下面这段内容拷贝到你的vimrc中:

1    "Set mapleader
2    let mapleader = ","
3
4    "Fast reloading of the .vimrc
5    map <silent> <leader>ss :source ~/.vimrc<cr>
6    "Fast editing of .vimrc
7    map <silent> <leader>ee :e ~/.vimrc<cr>
8    "When .vimrc is edited, reload it
9    autocmd! bufwritepost .vimrc source ~/.vimrc 

为了方便解释,我给每一行都加了一个行号。

  • 在vimrc中,双引号开头的行,将被当作注释忽略。
  • 第2行,用来设置mapleader变量,当mapleader为未设置或为空时,使用缺省的”\”来作为mapleader。

    mapleader变量是作用是什么呢?看下面的介绍。

  • 第5行定义了一个映射(map),这个映射把<leader>ss,映射为命令:source ~/.vimrc<cr>。当定义一个映射时,可以使用<leader>前缀。而在映射生效时,vim会把<leader>替换成mapleader变量的值。也就是说,我们这里定义的<leader>ss在使用时就变成了”,ss“,当输入这一快捷方式时,就会source一次~/.vimrc文件(也就是重新执行一遍.vimrc文件)。
  • 第7行,定义了<leader>ee快捷键,当输入,ee时,会打开~/.vimrc进行编辑。
  • 第9行,定义了一个自动命令,每次写入.vimrc后,都会执行这个自动命令,source一次~/.vimrc文件。

有了上面的快捷键,我们就能快速的打开vimrc文件编辑,快速重新source vimrc文件,方便多了。

无论在windows还是在linux中,我都使用vim作为我的缺省编辑器。并且,我想使用同一个vimrc文件。因此,我定义了一个MySys()函数,用来区分不同的平台,以进行不同的配置。

另外,在编辑vimrc文件时,我更喜欢新开一个标签页来编辑,而不是在当前窗口中。因此,我定义了SwitchToBuf()函数,它在所有标签页的窗口中查找指定的文件名,如果找到这样一个窗口,就跳到此窗口中;否则,它新建一个标签页来打开vimrc文件。(注:标签页(tab)功能只有在vim 7.0版本以上才支持。)

下面是我的vimrc中使用的设定,希望能够抛砖引玉:

" Platform
function! MySys()
  if has("win32")
    return "windows"
  else
    return "linux"
  endif
endfunction

function! SwitchToBuf(filename)
    "let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "")
    " find in current tab
    let bufwinnr = bufwinnr(a:filename)
    if bufwinnr != -1
        exec bufwinnr . "wincmd w"
        return
    else
        " find in each tab
        tabfirst
        let tab = 1
        while tab <= tabpagenr("$")
            let bufwinnr = bufwinnr(a:filename)
            if bufwinnr != -1
                exec "normal " . tab . "gt"
                exec bufwinnr . "wincmd w"
                return
            endif
            tabnext
            let tab = tab + 1
        endwhile
        " not exist, new tab
        exec "tabnew " . a:filename
    endif
endfunction

"Fast edit vimrc
if MySys() == 'linux'
    "Fast reloading of the .vimrc
    map <silent> <leader>ss :source ~/.vimrc<cr>
    "Fast editing of .vimrc
    map <silent> <leader>ee :call SwitchToBuf("~/.vimrc")<cr>
    "When .vimrc is edited, reload it
    autocmd! bufwritepost .vimrc source ~/.vimrc
elseif MySys() == 'windows'
    " Set helplang
    set helplang=cn
    "Fast reloading of the _vimrc
    map <silent> <leader>ss :source ~/_vimrc<cr>
    "Fast editing of _vimrc
    map <silent> <leader>ee :call SwitchToBuf("~/_vimrc")<cr>
    "When _vimrc is edited, reload it
    autocmd! bufwritepost _vimrc source ~/_vimrc
endif

" For windows version
if MySys() == 'windows'
    source $VIMRUNTIME/mswin.vim
    behave mswin
endif 

注意:我在windows中也定义一个”HOME”环境变量,然后把_vimrc放在”HOME”环境变量所指向的目录中。如果你打算在windows中使用上面的设定,也需要这样做!

好了,现在我们知道如何永久更改’sessionoptions’选项和‘viminfo’选项了,把对它们的配置放入你的vimrc即可。

vim自带的示例vimrc中,只定义最基本的配置。

http://www.amix.dk/vim/vimrc.html有一个非常强大的vimrc,有人戏称为”史上最强的vimrc”,或许有些言过其实。不过,如果你通读了这个vimrc,相信能从中学到很多……

这里有一个redguardtoo修改过的版本,可以对照参考一下。

我的vimrc也是基于Amix的模板,然后自已做了很多修改。

建议:不要照拷这个vimrc!可能这个文件的设定并不符合你的习惯。另外,这个文件的设定,可能也不能在你的工作环境中运行。

[参考文档]

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

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

本文链接地址: http://easwy.com/blog/archives/advanced-vim-skills-introduce-vimrc/

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

文本处理

16条评论 添加评论

  1. Easwy
    2009/02/10 12:27 | #1

    (以下为CSDN评论的转帖)

    #Kemin 发表于2007-10-27 17:10:59 IP: 219.134.249.*
    有些地方沒說明白,是什麽?$vim又是什麽,新手不太明白

    #Kemin 发表于2007-10-27 17:34:00 IP: 219.134.249.*
    =============
    $:
    下面三个前缀用来访问特殊的数值
    “$”——访问环境变量;
    “&”——访问 Vim 选项;
    “@”——访问寄存器。
    ==============
    ” :
    To define a mapping which will not be echoed on the command line, add
    ” as the first argument. Example: >
    :map
    ,h /Header

    #Kemin 发表于2007-10-27 17:45:29 IP: 219.134.249.*
    系統沒有$VIM的環境變數,VIM有自己的環境變數?在哪裏查?
    還有~/_vimrc找沒到這個文件,我用的是WINDOW,符號~指的不是VIM的安裝目錄

    #easwy 发表于2007-10-29 11:06:43 IP: 213.70.90.*
    $VIM是vim定义的变量,在vim中使用命令:
    :echo $VIM
    可以看到它的定义。类似的还有$VIMRUNTIME

    windows里,你可以通过指定HOME环境变量,来定义“~”的位置

  2. Easwy
    2009/02/10 12:31 | #2

    (以下为CSDN评论的转帖)

    #rain 发表于2008-06-21 09:25:56 IP: 210.77.10.*
    你好,请教一下这句话是什么意思呢
    let fullfn = substitute(a:filename, “^\\~/”, $HOME . “/”, “”),
    我help了半天,也是云里雾里的,只知道是替代,
    1) 我看substitute的语法是 s[ubstitute]/{pattern}{string}/[flags]
    好像没有()的用法阿

    2)a:filename 中的冒号是什么意思? “^\\~/”是过滤用么?该怎么解释?

    刚刚接触vimrc,希望能详细解释一下,谢谢啦

    2008-06-23 12:30:08作者回复
    :help substitute()
    这里用的substitute是其函数版本,作用是把~符号替换成$HOME变量所指定的home目录

    这个函数有三个变量,第一个是原始字符串,也就是a:filename保存的字符串,第二个参数是被替换的内容,”^\\~/”是一个正则表达式,表示从字符串的起始查找~字符,两个\是转义字符,因为~符号在substitute函数中有特殊含义,而此处需要使用其本义。

    #James 发表于2008-06-25 14:11:05 IP: 143.89.126.*
    这个substitute是一个函数,你要:help substitute()
    你help的内容其实是命令:substitute
    两者不是一个东西

    a:***表示的是参数列表中的变量
    这里a:filename就是传进来的那个filename变量
    “^\\~/”是一个正则表达式

    #James 发表于2008-06-25 14:14:48 IP: 143.89.126.*
    其实MySys可以变得更加”智能”一点
    我在windows和linux下工作,可以如下定义

    function! MySys()
    if has(“win32″)
    return “windows”
    elseif has(“unix”)
    return “linux”
    else
    return “”
    endfunction

    2008-07-08 09:56:37作者回复
    嗯,这样实现更方便些。thanks.

    #wayon_yang 发表于2008-09-20 08:54:12 IP: 166.111.60.*
    收藏 先

  3. juice
    2009/05/29 08:10 | #3

    :e ~/.vimrc 什么意思?

  4. 2009/06/02 14:41 | #4

    @juice
    执行
    :help :e

  5. ironox
    2009/09/07 14:50 | #5

    谢谢楼主的教程!

    奇怪了,我改了以后,
    source .vimrc
    竟然文件开头的几行注释 都报错。是
    怎么回事啊,是不是我犯了什么低级错误

    :!source .vimrc
    [No write since last change]
    .vimrc: line 2: An example for a vimrc file.
    : command not found
    .vimrc: line 4: Maintainer: Bram Moolenaar
    : command not found
    .vimrc: line 6:
    : command not found
    .vimrc: line 8: for Unix and OS/2: ~/.vimrc
    : No such file or directory
    .vimrc: line 10: for MS-DOS and Win32: /usr/share/vim\_vimrc
    : No such file or directory
    .vimrc: line 17: syntax error near unexpected token `(‘
    .vimrc: line 17: `” Use Vim settings, rather then Vi settings (much better!).’

  6. 2009/09/08 18:31 | #6

    @ironox
    命令错了,“:!source .vimrc”是在执行shell命令了
    应该是“:source .vimrc”

  7. karl
    2009/12/21 10:23 | #7

    再请教一下博主,我想看vim中有哪些变量:比如说下面:

    :e $vim/_vimrc

    这个中的 $vim变量。。用什么命令?是否有像:show variables之类的命令?

  8. 2009/12/22 09:08 | #8

    @karl
    用这条命令:
    :let

    :help let

  9. karl
    2009/12/23 15:18 | #9

    Easwy :
    @karl
    用这条命令:
    :let
    :help let

    用:let 好像没看到 $vim这个变量。。。另一方面,let是set变量值,我想看是否有$vim这个变量怎么办?

  10. 2009/12/23 18:04 | #10

    @karl
    :help exists()

    另外,$VIM和$VIMRUNTIME是环境变量,不是变量
    :help $VIM
    :help $VIMRUNTIME

  11. karl
    2009/12/26 19:17 | #11

    Easwy :
    @karl
    :help exists()
    另外,$VIM和$VIMRUNTIME是环境变量,不是变量
    :help $VIM
    :help $VIMRUNTIME

    1、这两个环境变量好像不是在我的电脑–属性里设置的?
    2、请问有没有列表这些环境变量的命令--如果我知道用exists(“$VIM”)中的$VIM, 也就不用判断有没有这个变量了 呵

  12. 2009/12/28 09:40 | #12

    @karl
    $VIM和$VIMRUNTIME是两个特殊的环境变量,不需要用户来定义的。我上面给出的帮助里说了vi如何设置这两个环境变量。
    至于其它的环境变量,则来自你系统中环境变量的定义了。

    :help expr-env

  13. karl
    2009/12/29 09:06 | #13

    好的 谢谢!

  14. embob
    2010/01/18 21:26 | #14

    请教一个问题:
    在增加了以下脚本以后,不能生效,出现“E492,不是编辑器的命令:,ss”。
    按照楼主的教程,基本的.vimrc配置、ctag、winmanger基本都搞定了,卡在这个问题好几天了,google了一下,也没找原因,楼主帮忙解答一下,谢啦!

    “Set mapleader
    let mapleader = “,”

    “Fast reloading of the .vimrc
    map ,ss :source ~/.vimrc
    “Fast editing of .vimrc
    map ee :e ~/.vimrc
    “When .vimrc is edited, reload it
    autocmd! bufwritepost .vimrc source ~/.vimrc

  15. 2010/01/19 10:07 | #15

    @embob
    你可能是用法错了,是在Normal模式下直接按,ss,而不是输入:,ss

  16. embob
    2010/01/19 21:43 | #16

    @Easwy
    以前确实都是在命令模式下输入,ss,改成在Normal模式下就ok了,看来还是对vim的几种模式没有理解透啊,呵呵。
    非常感谢楼主的解答!

评论本文