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

  1. :help compatible
  2. :help mapleader
  3. :help map
  4. :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命令:

  1. cp /usr/share/vim/vim74/vimrc_example.vim ~/.vimrc

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

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

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

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

  1. :e ~/.vimrc

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

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

  1. :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中使用的设定,希望能够抛砖引玉:

  1. " Platform
  2. function! MySys()
  3. if has("win32")
  4. return "windows"
  5. else
  6. return "linux"
  7. endif
  8. endfunction
  9.  
  10. function! SwitchToBuf(filename)
  11. "let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "")
  12. " find in current tab
  13. let bufwinnr = bufwinnr(a:filename)
  14. if bufwinnr != -
  15. exec bufwinnr . "wincmd w"
  16. return
  17. else
  18. " find in each tab
  19. tabfirst
  20. let tab =
  21. while tab <= tabpagenr("$")
  22. let bufwinnr = bufwinnr(a:filename)
  23. if bufwinnr != -
  24. exec "normal " . tab . "gt"
  25. exec bufwinnr . "wincmd w"
  26. return
  27. endif
  28. tabnext
  29. let tab = tab +
  30. endwhile
  31. " not exist, new tab
  32. exec "tabnew " . a:filename
  33. endif
  34. endfunction
  35.  
  36. "Fast edit vimrc
  37. if MySys() == 'linux'
  38. "Fast reloading of the .vimrc
  39. map <silent> <leader>ss :source ~/.vimrc<cr>
  40. "Fast editing of .vimrc
  41. map <silent> <leader>ee :call SwitchToBuf("~/.vimrc")<cr>
  42. "When .vimrc is edited, reload it
  43. autocmd! bufwritepost .vimrc source ~/.vimrc
  44. elseif MySys() == 'windows'
  45. " Set helplang
  46. set helplang=cn
  47. "Fast reloading of the _vimrc
  48. map <silent> <leader>ss :source ~/_vimrc<cr>
  49. "Fast editing of _vimrc
  50. map <silent> <leader>ee :call SwitchToBuf("~/_vimrc")<cr>
  51. "When _vimrc is edited, reload it
  52. autocmd! bufwritepost _vimrc source ~/_vimrc
  53. endif
  54.  
  55. " For windows version
  56. if MySys() == 'windows'
  57. source $VIMRUNTIME/mswin.vim
  58. behave mswin
  59. 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 . "\n"

endfor

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

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

for str in blines

let txt = txt . str . "\n"

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), "^[\t ]*$")

" 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!可能这个文件的设定并不符合你的习惯。另外,这个文件的设定,可能也不能在你的工作环境中运行。

[参考文档]

vi/vim使用进阶: vimrc初步的更多相关文章

  1. 【转载】vi/vim使用进阶: 指随意动,移动如飞 (二)

    本节所用命令的帮助入口: :help usr_03.txt :help motion.txt :help usr_29.txt :help scroll.txt :help folding 上一篇文章 ...

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

    原文:https://blog.easwy.com/archives/advanced-vim-skills-netrw-bufexplorer-winmanager-plugin/ 本节所用命令的帮 ...

  3. vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb

    vi/vim使用进阶: 在VIM中使用GDB调试 – 使用vimgdb << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help vimgdb 在UNIX系统最初设计时,有一 ...

  4. 【转载】vi/vim使用进阶: 指随意动,移动如飞 (一)

    vi/vim使用进阶: 指随意动,移动如飞 (一) << 返回vim使用进阶: 目录 本节所用命令的帮助入口: :help usr_03.txt :help motion.txt :hel ...

  5. vi/vim使用进阶: 剑不离手 – quickfix

    转载:http://easwy.com/blog/archives/advanced-vim-skills-quickfix-mode/ 本节所用命令的帮助入口: :help quickfix :he ...

  6. vi / vim 删除以及翻页 其它命令

    vim中翻页的命令 vim中翻页的命令 整页翻页 ctrl-f ctrl-b f就是forword b就是backward 翻半页 ctrl-d ctlr-u d=down u=up 滚一行 ctrl ...

  7. Linux vi/vim(转载)

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  8. 解决vi/vim中粘贴会在行首多很多缩进和空格的问题

    解决vi/vim中粘贴会在行首多很多缩进和空格的问题 secureCRT会将你原来的文本原封不动的按照字符串的样式发送给服务器.所以当你的服务器上的vim设置为autoindent的话,在i模式下,那 ...

  9. Linux vi/vim

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

随机推荐

  1. 在eclipse中启动tomcat加载不了项目的解决方法

    一.在server视图右键选择Add and Remove时,如果想要部署的项目不在左侧的待选列表中,或是弹出警告There are no resources that can be added or ...

  2. truncate和delete之间有什么区别

    TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源 ...

  3. spring mvc 第四天【注解实现springmvc 配合使用Exception Resolver 的配置】

    Tips:这里使用具体springmvc的异常处理只是拿一个简单的案例来说明问题,并不做实用,如有需求可做更改: 这里演示的仅是能够实现service验证的一种方案,如有更好的请留言我会努力学习!! ...

  4. 使用SeasLog打造PHP项目中的高性能日志组件(一)

    云智慧(北京)科技有限公司 高驰涛 什么是SeasLog SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便.规范.高效地写日志,以及快速地读取和查询日志. 为 ...

  5. C# 获取excel架构并的导入sqlserver的方法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 禁止复制放在js文件中

    1.使右键和复制失效 方法1: 在网页中加入以下代码: 复制代码代码如下: <script language="Javascript"> document.oncont ...

  7. [题解]noip2016普及组题解和心得

    [前言] 感觉稍微有些滑稽吧,毕竟每次练的题都是提高组难度的,结果最后的主要任务是普及组抱一个一等奖回来.至于我的分数嘛..还是在你看完题解后写在[后记]里面.废话不多说,开始题解. 第一题可以说的内 ...

  8. 使用dom元素和jquery元素实现简单增删改的练习

    软件开发实际就是数据的增删改查,javascript前端开发也不例外.今天学了jquery框架的简单使用.于是用它实现简单的增删改,接着也用原始的javascript实现同样的功能,以便看出jquer ...

  9. CodeSmith Merge策略--小白教程

        为了让 自动产生的代码 和 程序员手写的代码 互不干涉, 提出了Merge策略, 包括以下三种 InsertRegion: 只插入(覆盖)到指定 #region区域 InsertClass: ...

  10. oracle pl/sql split函数

    在软件开发过程中程序员经常会遇到字符串的拼接和拆分工作. 以java开发为例: 前台传入字符串拼接形式的一个JSON数据,如:"1001,1002,1003",这可能代表了一组序号 ...