Vim总结
一. Vim的简介
Vim是一个基于vi编辑器发展出来的一个运行在类Unix系统的文本编辑器,由BramMoolenaar在1991年发布了它的第一版本,最初简称为ViImitation,之后随着功能的不断增加,正式改名成ViImproved,具有代码补充编译及错误跳转等方便编程的功能,在程序员中被广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器。Vim同时支持命令行模式和gui模式(gVim),是一款自由和开源的软件程序。尽管Vim最初是为Amiga系统设计的,但现在已经被发展成多平台的编辑器,并且在2006被linux社区评为最受欢迎的编辑器。
二. Vim的前世今生
上世纪80年代,BramMoolenaar在Amiga系统工作时没有之前Unix系统中的Vi编辑器,非常不习惯,故Moolenaar决定仿照Vi编辑器,自己编写可在Amiga系统中运行的编辑器,并成功于1988年写出类似这样的编辑器,当时简称为ViIMitation,并于1991年发布Vim(v1.14),很快该版本的Vim就被“FredFish Disk #591”(Amiga免费软件集)收录了。次年Vim就被移植到了Unix和MS-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,此时vim在Normal模式下(等待命令模式),注意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>
:x
,
ZZ
或
: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
F和 T →和 f和 t一样,只不过是相反方向
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) →代码块解注释
上面是最常用的命令,建议你每天都学1到2个新的命令,在两到三周后,你会感到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.youkuaiyun.com/wooin/article/details/1887737
[5] http://www.youkuaiyun.com/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] | |
1992 | 1.22[8] | |
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 | ||
February 19, 1998 | 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 | ||
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] | Spellchecking, codecompletion,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.youkuaiyun.com/lvjing2
" Created: 20013-8-23
"===============================================================================
"set encoding=gb2312
set guifont=Luxi/Mono/9 " 设置字体,字体名称和字号
set tabstop=4 " 设置tab键的宽度
set backspace=2 " 设置退格键可用
set nu! " 显示行号
":hi linenr ctermfg=darkblue
set 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 line
set ruler "在编辑过程中,在右下角显示光标位置的状态行
"--------------------------------------------------------------------------------
"编程相关的设置
"--------------------------------------------------------------------------------
set completeopt=longest,menu " 关掉智能补全时的预览窗口
filetype plugin indent on "加了这句才可以用智能补全
:set tags=/home/nfs/microwindows/src/tags
syn on " 打开语法高亮
set showmatch "设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set smartindent " 智能对齐方式
set shiftwidth=4 " 换行时行间交错使用4个空格
set autoindent " 自动对齐
set ai! " 设置自动缩进
colorscheme peachpuff
"--------------------------------------------------------------------------------
"代码折叠
"--------------------------------------------------------------------------------
"set foldmarker={,}
"set foldmethod=marker
set foldmethod=syntax
set 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> "yy
vmap<C-x> "yd
nmap<C-v> "yp
vmap<C-v> "yp
nmap<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=1
let 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 = 1
let g:miniBufExplMapWindowNavArrows = 1
let 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 = 2
let 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