zoukankan      html  css  js  c++  java
  • vi/vim使用进阶: vimrc初步

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

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

    当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/vim74/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中:

        "Set mapleader
        let mapleader = ","
    
        "Fast reloading of the .vimrc
        map <silent> <leader>ss :source ~/.vimrc<cr>
        "Fast editing of .vimrc
        map <silent> <leader>ee :e ~/.vimrc<cr>
        "When .vimrc is edited, reload it
       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 

    "这个文件双引号 (") 是批注  

    set hlsearch "高亮度反白  

    set backspace=2 "可随时用退格键删除  

    set autoindent "自动缩排  

    set ruler "可显示最后一行的状态  

    set showmode "左下角那一行的状态  

    set nu "可以在第一行的最前面显示行号  

    set bg=dark "显示不同的底色色调  

    syntax on "进行语法检验, 颜色显示  

    set ts=4 "ts是tabstop的缩写, 设Tab宽4个空格  

    set expandtab  

    %retab!      "加!是用于处理非空白字符之后的TAB, 即所有的TAB;若不加, 则只处理行首的TAB  

    " Encoding related  

    set encoding=UTF-8  

    set langmenu=zh_CN.UTF-8  

    language message zh_CN.UTF-8  

    set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1  

    set fileencoding=utf-8  

    "支持{}、[]、()、""、''自动补全  

    inoremap ( <c-r>=OpenPair('(')<CR>  

    inoremap ) <c-r>=ClosePair(')')<CR>  

    inoremap { <c-r>=OpenPair('{')<CR>  

    inoremap } <c-r>=ClosePair('}')<CR>  

    inoremap [ <c-r>=OpenPair('[')<CR>  

    inoremap ] <c-r>=ClosePair(']')<CR>  

    " just for xml document, but need not for now.  

    "inoremap < <c-r>=OpenPair('<')<CR>  

    "inoremap > <c-r>=ClosePair('>')<CR>  

    function! OpenPair(char)  

        let PAIRs = {  

                     '{' : '}',  

                     '[' : ']',  

                     '(' : ')',  

                     '<' : '>'  

                    }  

        if line('$')>2000  

            let line = getline('.')  

            let txt = strpart(line, col('.')-1)  

        else  

            let lines = getline(1,line('$'))  

            let line=""  

            for str in lines  

                let line = line . str . " "  

            endfor  

            let blines = getline(line('.')-1, line("$"))  

            let txt = strpart(getline("."), col('.')-1)  

            for str in blines  

                let txt = txt . str . " "  

            endfor  

        endif  

        let oL = len(split(line, a:char, 1))-1  

        let cL = len(split(line, PAIRs[a:char], 1))-1  

        let ol = len(split(txt, a:char, 1))-1  

        let cl = len(split(txt, PAIRs[a:char], 1))-1  

        if oL>=cL || (oL<cL && ol>=cl)  

            return a:char . PAIRs[a:char] . "<Left>"  

        else  

            return a:char  

        endif  

    endfunction  

    function! ClosePair(char)  

        if getline('.')[col('.')-1] == a:char  

            return "<Right>"  

        else  

            return a:char  

        endif  

    endf  

    inoremap ' <c-r>=CompleteQuote("'")<CR>  

    inoremap " <c-r>=CompleteQuote('"')<CR>  

    function! CompleteQuote(quote)  

        let ql = len(split(getline('.'), a:quote, 1))-1  

        let slen = len(split(strpart(getline("."), 0, col(".")-1), a:quote, 1))-1  

        let elen = len(split(strpart(getline("."), col(".")-1), a:quote, 1))-1  

        let isBefreQuote = getline('.')[col('.') - 1] == a:quote  

        if '"'==a:quote && "vim"==&ft && 0==match(strpart(getline('.'), 0, col('.')-1), "^[  ]*$")  

            " for vim comment.  

            return a:quote  

        elseif "'"==a:quote && 0==match(getline('.')[col('.')-2], "[a-zA-Z0-9]")  

            " for Name's Blog.  

            return a:quote  

        elseif (ql%2)==1  

            " a:quote length is odd.  

            return a:quote  

        elseif ((slen%2)==1 && (elen%2)==1 && !isBefreQuote) || ((slen%2)==0 && (elen%2)==0)  

            return a:quote . a:quote . "<Left>"  

        elseif isBefreQuote  

            return "<Right>"  

        else  

            return a:quote . a:quote . "<Left>"  

        endif  

    endfunction  

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

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

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

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

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

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

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

    [参考文档]

  • 相关阅读:
    iOS9 HTTP 不能正常使用的解决办法
    IOS UIWebView的一些用法总结
    顺序查找
    循环队列
    队列的链式存储实现
    栈的链式存储实现
    顺序表的实现
    MessageBox函数
    二分法查找
    冒泡排序
  • 原文地址:https://www.cnblogs.com/yoyo-sincerely/p/5872797.html
Copyright © 2011-2022 走看看