Vim史上最全面的知识点总结

来源:互联网 发布:蛮牛unity3d 编辑:程序博客网 时间:2024/06/10 05:37

Vim总结

一. Vim的简介

Vim是一个基于vi编辑器发展出来的一个运行在类Unix系统的文本编辑器,由BramMoolenaar1991年发布了它的第一版本,最初简称为ViImitation,之后随着功能的不断增加,正式改名成ViImproved,具有代码补充编译及错误跳转等方便编程的功能,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器。Vim同时支持命令行模式和gui模式(gVim),是一款自由和开源的软件程序。尽管Vim最初是为Amiga系统设计的,但现在已经被发展成多平台的编辑器,并且在2006linux社区评为最受欢迎的编辑器。

二. Vim的前世今生

上世纪80年代,BramMoolenaarAmiga系统工作时没有之前Unix系统中的Vi编辑器,非常不习惯,故Moolenaar决定仿照Vi编辑器,自己编写可在Amiga系统中运行的编辑器,并成功于1988年写出类似这样的编辑器,当时简称为ViIMitation,并于1991年发布Vim(v1.14),很快该版本的Vim就被“FredFish Disk #591”(Amiga免费软件集)收录了。次年Vim就被移植到了UnixMS-DOS系统中,并更名为ViImproved,之后Vim不断改版加入了不计其数的新功能(详见附录一:Vim版本发布历史),并发展成为支持跨平台的文本编辑器,现已经支持AmigaOS(theinitial target platform),AtariMiNT,BeOS,DOS,MicrosoftWindows 95/98/Me/NT/2000/XP/Server2003/Vista/Server2008/7/8IBM OS/2 andOS/390,MorphOS,OpenVMS,QNX,RISCOS,Unix,Linux,BSD,andMacOS, andAlso,AppleOS X。需要补充的是Vim现在已经开始支持android系统了。

目前,VIM是按照VIM许可证发布的开源软件,这个协议兼容GPL。它的协议中包含一些慈善条款,建议用户向荷兰ICCF捐款,用于帮助乌干达艾滋病患者.VIM启动时会显示”Helppoor children in Uganda”的字样,在中文版本中则是”请帮助乌干达的可怜孩童”。

三. Vim相比于Vi的功能特点

Vim拥有Vi兼容模式,但并不是100%的兼容。在非兼容模式下Vim则会体现出它超出Vi的功能特点,包括多缓冲编辑,任意个数分区窗口,具备列表和字典功能的脚本语言,可在脚本中调用Lua,Perl, Ruby, Python, Tcl,MzScheme,单词缩写功能,代码折叠,动态单词补全,多次撤销和重做,400种以上文本文件语法高亮,40种以上语言的自动所排,利用ctags的标签中跳转,崩溃后文件恢复,光标位置和打开的缓冲状态的保存和复原,可对两文件进行差分,远程文件编辑,Omni补全……

四. Vim 优缺点

优点:

简洁高效快速,占用资源少可在各种嵌入式等linux系统中运行,强大的可扩展行强和定制性,性感让人欲罢不能的配色,比较酷。

缺点:

大文件读取速度很慢(可在vim.org下载并安装名为LargeFile的Script来优化)即使文件不大,如果有非常长的行的话,处理也会变慢(同上)。vim自己的脚本语言处理速度不快,若是安插过多脚本包,启动速度会变慢。存在类似Ctrl-1等不能被映射的键(限于某些字符终端的性能)


五. Vim常用命令简介

1. 入门级

bashshell中输入vim即启动了Vim,此时vimNormal模式下(等待命令模式),注意Vim命令是区分大小写的。按下i键进入Insert模式(文本输入模式),此时可像记事本一样进行输入了。如需返回Normal模式,请按ESC键。入门级命令包含如下:

i进入Insert模式

ESC进入Normal模式

x删当前光标所在的一个字符

:wq存盘+退出(w存盘,:q退出)

dd删除当前行,并存入临时缓冲区(即剪贴板)

p粘帖剪贴板

h左移

j下移

k上移

l右移

2. 进阶级

各种插入模式

l在光标左侧输入文本

a在光标右侧输入文本

A在光标所在行行尾输入文本

o在当前行后插入一个新行
O在当前行前插入一个新行
r 替换光标位置的一个字符
R →替换光标位置开始的字符,并进入输入模式
cw替换光标所在位置的一个单词

移动光标

0数字零,到行头
^到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
$到本行行尾
g_到本行最后一个不是blank字符的位置。
w 右移一字
b →左移一字
e →移至字尾
Return() →下一行行首
Spacebar →右移一位
Backspace →左移一位
/pattern搜索 pattern 的字符串(陈皓注:如果搜索出多个匹配,可按n键到下一个)
ctrl+d 下移12
ctrl+u →上移12
ctrl+f →下移24
ctrl+b →上移24
NG →移至第N
gg →移至第一行
G →移至最后一行
w/e→到下一个单词的开头/结尾
W/E→到下移个单词的开头/结尾(以空格为分隔符)
%→匹配括号移动

拷贝/粘贴

P →将制定缓冲区的内容放到当前光标位置之上
p →将制定缓冲区的内容放到当前光标位置之下
d →删除当前指定文本,存于临时缓冲区,可用put操作符(P/p)访问
dd →删除当前行,并存入临时缓冲区(即剪贴板)
y将指定文本复制到临时缓冲区,可用put操作符(P/p)访问
yy →拷贝当前行当行于临时缓冲区中,类似于ddP

撤销/重复

u撤销
U →撤销对当前行上做的所有修改
ctrl+r →重复

打开/保存/退出/改变文件(Buffer)

:e<path>打开一个文件
:w存盘
:saveas<path>另存为<path/to/file>
:xZZ:wq保存并退出(:x表示仅在需要时保存,ZZ不需要输入冒号并回车)
:q!强制退出不保存
:qa!强行退出所有的正在编辑的文件,就算别的文件有更改
:wqa!保存所有正在编辑的文件并退出
:bn/:bp你可以同时打开很多文件,使用这两个命令来切换下一个/上一个文件

3. 高级篇

v可视化选择
gU变大写
gu →变小写
. →重复上一次命令
N<command> →重复某个命令N
<startposition><command><end position>0y$表示0到行头,y拷贝,$到本行最后一个字符
fa →到下一个为a的字符处,a可替换其他字符
t, →,前的第一个字符,,可以替换其他字符
3fa →在当前行查找第三个出现的a
FT →ft一样,只不过是相反方向
dt →删除所有的内容,则到遇到双引号
ctrl+n/ctrl+p →insert模式下可以自动补齐输入单词

split/vsplit →创建分屏/创建垂直分屏

visual select lines, then input command (:norm i${comment text like # or //}) →代码块注释

visual select lines, then input command (:norm x) or (:norm xx) or (:norm ^x) →代码块解注释

上面是最常用的命令,建议你每天都学12个新的命令,在两到三周后,你会感到vim的强大的。有时候,学习VIM就像是在死背一些东西。幸运的是,vim有很多很不错的工具和优秀的文档。运行vimtutor直到你熟悉了那些基本命令。其在线帮助文档中你应该要仔细阅读的是 :helpusr_02.txt.你会学习到诸如  ! 目录,寄存器,插件等很多其它的功能。学习vim就像学弹钢琴一样,一旦学会,受益无穷。


五. Vim配置

1. 更换Vimcolorscheme:

myVimColorScheme.vim文件放入VIMRUNTIME/vim7x/colors/中,打开Vim编辑器,在Normal模式下输入:colorschememyVimColorScheme即可。

2. 自定义Vim编辑功能和特点 

新建文件~/.vimrc,打开并编辑(具体可参考附录二:.vimrc样例)。

set nocompatible " 关闭 vi 兼容模式
syntax on " 自动语法高亮
colorscheme molokai " 设定配色方案
set number " 显示行号
set cursorline " 突出显示当前行
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
set tabstop=4 " 设定 tab 长度为 4
set nobackup " 覆盖文件时不备份
set autochdir " 自动切换当前目录为当前文件所在的目录
filetype plugin indent on " 开启插件
set backupcopy=yes " 设置备份时的行为为覆盖
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set nowrapscan " 禁止在搜索到文件两端时重新搜索
set incsearch " 输入搜索内容时就显示搜索结果
set hlsearch " 搜索时高亮显示被找到的文本
set noerrorbells " 关闭错误信息响铃
set novisualbell " 关闭使用可视响铃代替呼叫
set t_vb= " 置空错误铃声的终端代码
" set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
" set matchtime=2 " 短暂跳转到匹配括号的时间
set magic " 设置魔术
set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start
" 不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\ 
" 设置在状态行显示的信息
set foldenable " 开始折叠
set foldmethod=syntax " 设置语法折叠
set foldcolumn=0 " 设置折叠区域的宽度
setlocal foldlevel=1 " 设置折叠层数为
" set foldclose=all " 设置为自动关闭折叠 
" nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
" 用空格键来开关折叠

六. 参考文献

[1] http://en.wikipedia.org/wiki/Vim_(text_editor)

[2] http://zh.wikipedia.org/wiki/Vim

[3] http://www.baike.com/wiki/VIM

[4] http://blog.csdn.net/wooin/article/details/1887737

[5] http://www.csdn.net/article/2011-09-08/304226


附录一  Vim版本发布历史

Release history

Date

Version

Changes andadditions

June, 1987

N/A

Tim Thompson releases Stevie(ST editor for VI enthusiasts), a limited vi clone for the AtariST,posting the source on Usenet.[20][21]

June, 1988

N/A

Tony Andrews improves Stevie,and ports it to Unix and OS/2,releasing version 3.10 on Usenet.[20][22]

1988

1.0

Bram Moolenaar creates ViIMitation for the Amiga, based on Stevie, never publiclyreleased

November 2, 1991

1.14[8]

Firstpublic release for the Amiga on FredFish disk#591[23]

1992

1.22[8]

Port to Unix.Vim now competes with vi.

December 14, 1993

2.0[7]

This is the first releaseusing the name Vi IMproved.

August 12, 1994

3.0[8]

Support for multiplewindows

May 29, 1996

4.0[8][24]

Graphicaluser interface

February 19, 1998

5.0[8][25]

Syntaxhighlighting,basic scripting (userdefined functions, commands, etc.)

April 6, 1998

5.1

Bug fixes,various improvements

April 27, 1998

5.2

Long line support, filebrowser, dialogs, popup menu, select mode, session files, userdefined functions and commands, Tcl interface,etc.

August 31, 1998

5.3

Bug fixes, etc.

July 25, 1999

5.4

Basic file encryption,various improvements

September 19, 1999

5.5

Bug fixes, variousimprovements

January 16, 2000

5.6

New syntax files, bugfixes, etc.

June 24, 2000

5.7

New syntax files, bugfixes, etc.

May 31, 2001

5.8

New syntax files, bugfixes, etc.

September 26, 2001

6.0[8][26]

Foldingplugins,multi-language, etc.

March 24, 2002

6.1

Bug fixes

June 1, 2003

6.2

GTK2, Arabic languagesupport, :try command, minor features, bug fixes

June 7, 2004

6.3

Bug fixes, translationupdates, mark improvements

October 15, 2005

6.4

Bug fixes, updates toPerl, Python, and Ruby support

May 7, 2006

7.0[27]

Spellcheckingcodecompletion,tab pages (multiple viewports/window layouts), current line andcolumn highlighting, undo branches, and more

May 12, 2007

7.1

Bug fixes, new syntax andruntime files, etc.

August 9, 2008

7.2[28]

Floating point support inscripts, refactored screen drawing code, bug fixes, new syntaxfiles, etc.

August 15, 2010

7.3

Lua support,Python3 support, Blowfish encryption,persistent undo/redo

August 10, 2013

7.4[29]

A new, faster regularexpression engine.


附录二  .vimrc样例

"==============================================================================="       Filename: vimrc"         Author: ZZL(赵真灵)"          Email: zzl_ing@126.com"       Homepage: http://blog.csdn.net/lvjing2"        Created: 20013-8-23"==============================================================================="set encoding=gb2312set guifont=Luxi/Mono/9   " 设置字体,字体名称和字号set tabstop=4       " 设置tab键的宽度set backspace=2     " 设置退格键可用set nu!            " 显示行号":hi linenr ctermfg=darkblueset vb t_vb=        "vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声"setwrap           "自动换行"setnowrap         " 不自动换行set linebreak       " 整词换行set whichwrap=b,s,<,>,[,]       "光标从行首和行末时可以跳到另一行去"setlist                      " 显示制表符"setlistchars = tab:>-,trail:- " 将制表符显示为'>---',将行尾空格显示为'-'set listchars=tab:./,trail:.   " 将制表符显示为'.  'set autochdir                  " 自动设置目录为正在编辑的文件所在的目录set hidden          "没有保存的缓冲区可以自动被隐藏set scrolloff=5"--------------------------------------------------------------------------------"查找/替换相关的设置"--------------------------------------------------------------------------------set hlsearch        " 高亮显示搜索结果set incsearch       "查询时非常方便,如要查找book单词,当输入到/b时,会自动找到                    "第一个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的                    "单词,依次类推,进行查找时,使用此设置会快速找到答案,当你                    "找要匹配的单词时,别忘记回车set gdefault        "替换时所有的行内匹配都被替换,而不是只有第一个"--------------------------------------------------------------------------------"状态栏相关的设置"--------------------------------------------------------------------------------set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]set laststatus=2    " always show the status lineset ruler           "在编辑过程中,在右下角显示光标位置的状态行"--------------------------------------------------------------------------------"编程相关的设置"--------------------------------------------------------------------------------set completeopt=longest,menu    " 关掉智能补全时的预览窗口filetype plugin indent on       "加了这句才可以用智能补全:set tags=/home/nfs/microwindows/src/tagssyn on             " 打开语法高亮set showmatch       "设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号set smartindent     " 智能对齐方式set shiftwidth=4    " 换行时行间交错使用4个空格set autoindent      " 自动对齐set ai!            " 设置自动缩进colorscheme peachpuff"--------------------------------------------------------------------------------"代码折叠"--------------------------------------------------------------------------------"set foldmarker={,}"set foldmethod=markerset foldmethod=syntaxset foldlevel=100       " Don'tautofold anything (but I can still fold manually)"set foldopen-=search   " don't open folds when you searchinto them"set foldopen-=undo     " don't open folds whenyou undo stuff"set foldcolumn=4"--------------------------------------------------------------------------------"模仿MSWindows中的快捷键"--------------------------------------------------------------------------------vmap<C-c> "yyvmap<C-x> "ydnmap<C-v> "ypvmap<C-v> "ypnmap<C-a> ggvG$"--------------------------------------------------------------------------------"窗口操作的快捷键"--------------------------------------------------------------------------------nmap wv     <C-w>v     "垂直分割当前窗口nmap wc     <C-w>c     "关闭当前窗口nmap ws     <C-w>s     "水平分割当前窗口"--------------------------------------------------------------------------------"模仿MSWindows中的保存命令:Ctrl+S"--------------------------------------------------------------------------------imap<C-s> <Esc>:wa<cr>i<Right>nmap<C-s> :wa<cr>"###############################################################################"The following is the Plugins' setting"###############################################################################"--------------------------------------------------------------------------------"TagList :Tlist"--------------------------------------------------------------------------------let Tlist_Show_One_File=1let Tlist_Exit_OnlyWindow = 1"let Tlist_Use_Right_Window=1"--------------------------------------------------------------------------------"netrw 文件浏览器:e<PATH>"--------------------------------------------------------------------------------"letg:netrw_winsize = 30       "浏览器宽度"--------------------------------------------------------------------------------"QuickFix"--------------------------------------------------------------------------------nmap<F6> :cn<cr>   " 切换到下一个结果nmap<F7> :cp<cr>   " 切换到上一个结果"--------------------------------------------------------------------------------"WinManager :WMToggle"--------------------------------------------------------------------------------let g:winManagerWindowLayout='FileExplorer|TagList'"let g:winManagerWidth = 30"let g:defaultExplorer = 0"nmap<C-w><C-b> :BottomExplorerWindow<cr> "切换到最下面一个窗格"nmap<C-w><C-f> :FirstExplorerWindow<cr>   "切换到最上面一个窗格nmap wm :WMToggle<cr> " 是nomal模式的命令,不是Ex模式的"--------------------------------------------------------------------------------"MiniBufExp"--------------------------------------------------------------------------------"let g:miniBufExplMapWindowNavVim = 1let g:miniBufExplMapWindowNavArrows = 1let g:miniBufExplMapCTabSwitchBufs = 1"let g:miniBufExplModSelTarget = 1"--------------------------------------------------------------------------------"cscope"--------------------------------------------------------------------------------cs add /home/nfs/microwindows/src/cscope.out /home/nfs/microwindows/src:set cscopequickfix=s-,c-,d-,i-,t-,e-:set cscopetag"按下面这种组合键有技巧,按了<C-_>后要马上按下一个键,否则屏幕一闪"就回到nomal状态了"<C-_>s的按法是先按"Ctrl+Shift+-",然后很快再按"s"nmap<C-_>s :cs find s <C-R>=expand("<cword>")<cr><cr>:cw<cr>nmap<C-_>g :cs find g <C-R>=expand("<cword>")<cr><cr>:cw<cr>nmap<C-_>c :cs find c <C-R>=expand("<cword>")<cr><cr>:cw<cr>nmap<C-_>t :cs find t <C-R>=expand("<cword>")<cr><cr>:cw<cr>nmap<C-_>e :cs find e <C-R>=expand("<cword>")<cr><cr>:cw<cr>nmap<C-_>f :cs find f <C-R>=expand("<cfile>")<cr><cr>nmap<C-_>i :cs find i <C-R>=expand("<cfile>")<cr><cr>:cw<cr>nmap<C-_>d :cs find d <C-R>=expand("<cword>")<cr><cr>:cw<cr>"--------------------------------------------------------------------------------"Grep"--------------------------------------------------------------------------------"直接按下<F3>键来查找光标所在的字符串nnoremap<silent> <F3> :Rgrep<CR>"--------------------------------------------------------------------------------"A"--------------------------------------------------------------------------------nnoremap<silent> <F12> :A<CR>"--------------------------------------------------------------------------------"NERD_commenter"--------------------------------------------------------------------------------let NERD_c_alt_style = 1    " 将C语言的注释符号改为//,默认是/**/"nmap<F5> ,cc"--------------------------------------------------------------------------------"SuperTab :SuperTabHelp"--------------------------------------------------------------------------------let g:SuperTabRetainCompletionType = 2let g:SuperTabDefaultCompletionType = "<C-X><C-O>""--------------------------------------------------------------------------------"CVim :help csupport"--------------------------------------------------------------------------------let g:C_Comments = "no"        " 用C++的注释风格let g:C_BraceOnNewLine = "no"   " '{'是否独自一行let g:C_AuthorName = "zzl"let g:C_Project="F9"let g:Cpp_Template_Function = "c-function-description-wuyin"let g:C_TypeOfH = "c"          " *.h文件的文件类型是C还是C++"##################################################################"##########################End Of Vimrc ##########################"##################################################################"if filetype is C"  TODO"fi


原创粉丝点击