尝试使用vim有一段时间了,现在总结下有关于vim的学习
vim作为程序员的编辑神器,可以提供编辑文本的效率,我觉得主要表现在以下几点:
1. 众多的快捷键,使得几乎可以回到terminal的时代,减少鼠标的参与。毕竟鼠标提供的相关功能有限,然与快捷键如果能娴熟使用,速度能显著提高,何况快捷键可以提供众多的功能,使得一些复杂的操作只要一些按键操作就可以完成。
2. 丰富的plugin,用于可以自己定制相关的plugin,提供很多便利,例如方便的浏览文件,cpp文件和h文件的切换等等。
3. 用户可以自由定制自己的.vimrc文件,配置出一款自己最熟悉的文本编辑器。
首先可以参考这个网址http://edyfox.codecarver.org/html/vim_for_beginners.html开始vim的入门学习,其中讲述了vim的安装,基本的配置,以及vim从入门到进阶的学习路线。
最开始我相信大部分人都会浏览下vim的入门教程,在terminal中运行vumtutor即可,只要花大概半个小时就可以大致的了解vim的一些基本操作,例如光标的移动,文本复制粘贴等等。
接下来我在网上狂搜了一些vim资料,实在是太多了,看到vim的一些高效编辑的示例,坚信自己继续学习vim的道路。其次大家可以参考以下网址对vim进行一些基本的配置,主要是语法高亮,一些经典的plugin配置,可以大大的提高vim的效率,相信熟悉了这些plugin大家就可以见识到vim的强大,我想这只是vim初显庐山真面目。刚开始不要把vim配置的过于复杂,只要一些基本的配置足矣应付几乎所有的操作。
http://blog.csdn.net/wooin/article/details/1858917经典之作,这是linux下的配置
http://www.cnblogs.com/xiekeli/archive/2012/08/13/2637176.html这是windows下的配置,不过后面有关于python的配置中有些快捷键貌似与系统原有的冲突了
配置完以上的相关plugin,你可以看到语法高亮,文件浏览变得异常方便,浏览源码非常清晰等等。
最后应该是“VIM用户手册”(正在学习中),大约400多页,讲述了vim操作的方方面面,下面列出阅读该书辑的一些笔记,用于备忘:(会陆续更新...)
添加菜单栏,工具条和滚动条
:set guioptions+=m
:set guioptions+=T
:set guioptions+=l
/*-------------------------------"."命令的强大用法-----------------
"."命令会执行上一次所执行的更改命令
案例:
/four<Enter> 找到第一个字符串"four"
cwfive<Esc> 把它改为"five"
n 找到下一个字符串"four"
. 同样改为"five"
n 继续找下一个
. 做同样的修改
----------------------------------"."命令的强大用法--------------*/
/*-------------------------------文件保存--------------------------
:saveas xxx 另存为xx
:vim -R xxx 以只读方式打开文件xxx
---------------------------------文件保存------------------------*/
/*-------------------------------"."命令的强大用法-----------------
i:在字符后面插入 I:在行末插入
a:在字符前面插入 A:在行首插入
o:在下一行另起一行插入 O:在上一行另起一行插入
-----------------------------------insert:------------------------*/
/*-----------------------------------move------------------------
字符间的移动:w,e:前进(字符串首部/尾部) b:后退(字符串首部)
W:前进 B:后退(以空白字符作为WORD边界)
$:移动到行首
0:移动到行末
22G:跳转到第22行
%:括号间跳转
20%:跳转到文件20%位置处
H:跳转到文件最前面 M:跳转到文件中间 L:跳转到文件最后面
fx:移动到本行指定的字符x上(向右搜索)
fX:移动到本行制定的字符x上(向左搜索)
ctrl+g:显示光标当前所在位置
屏幕移动:
ctrl+u:使文本向下滚动半屏 ctrl+d:使文本向上滚动半屏
ctrl+f:使文本向下滚动一个屏幕 ctrl+b:使文本向上滚动一个屏幕
ctrl+y:使文本向下滚动一行 ctrl+e:使文本向上滚动半屏
zt:把当前行置于屏幕顶端 zz:把当前行置于屏幕中央 zb:把当前行置于屏幕底端
-----------------------------------move------------------------*/
/*---------------------------------change------------------------
1.delete:
在move的基础上,加上d即可
例如:d$删除字符直至本行尾部
2.modify:
和delete操作类似,在move基础上,加上c即可
例如:c2wasd删除2个字符串接下来输入asd(等价于d2wiasd)
ps:ccasd删除改行并输入asd(ddiasd)
3.一些等价的命令
D 代表d$(删除到行尾的内容)
C 代表c$(修改到行尾的内容)
s 代表cl(修改一个字符)
S 代表cc(修改一整行)
4.replace
5.交换两个相邻的字符
xp
6.yank
yy:复制一整行
yw:复制一整个字符串
-----------------------------------change------------------------*/
/*---------------------------------visual模式(选择复制的内容)------------------------
v,V:进入选择模式
ctrl+v:进入矩形文本选择模式
h,j,k,l用于控制选择的方向
其实还可以使用shift+方向键直接用于选择文本的内容
-----------------------------------visual模式(选择复制的内容)-----------------------*/
/*---------------------------------利用寄存器复制黏贴------------------------
首先选择需要复制的内容,然后"wy则可以将内容复制到寄存器w中,"wp可以黏贴寄存器w中的内容
其次,同样的选择需要复制的内容,"wd则可以将内容复制到寄存器w中,"wp可以黏贴寄存器w中的内容
+寄存器代表剪贴板(可用于各个地方黏贴),所以如果想复制内容到剪贴板,则可以使用"+y
-----------------------------------利用寄存器复制黏贴----------------------*/
/*---------------------------------mark(重要)------------------------
``:两点间来回跳转
ctrl+o:跳转到早些时候的光标位置
ctrl+i:跳转到后来光标更新的位置
mx:定义自己的标记x(局部的标记,只对于当前文件有效) `x:返回标记x处
mX:定义自己的标记X(全局标记,对于所有文件均有效) `X:返回标记x处
:marks(查看文本所有的标记)
-----------------------------------mark------------------------*/
/*-----------------------------------search------------------------
/word:向后查找字符串word ?word:向前查找字符串word
/\<word:向后搜索字符串(以word开头)
/word\<:向后搜索字符串(以word结束)
/^word$:查找文本中只有word的那一行
:set ignorecase 忽略大小写匹配
:set noignorecase 不忽略大小写匹配
方便的搜索方法:
将光标置于所要查找的字符串上,按*(向后搜索)或者#(向前搜索)即可
-----------------------------------search------------------------*/
/*---------------------------------添加plugin------------------------
将相应的plugin文件放入对应的文件夹中,全局的plugin放入plugin中,文件类型plugin放入ftplugin中
-----------------------------------添加plugin------------------------*/
/*---------------------------------编辑多个文件------------------------
`" 回到上次离开文件时光标所在位置
`. 回到最后一次对文件所做改动处
ctrl+^ 跳到前一个编辑的文件
-----------------------------------编辑多个文件------------------------*/
/*---------------------------------多个窗口的操作--------------------------
水平分割:split 垂直分割:vsplit
:split(:vsplit) xxx 分割出一个新的窗口,新的窗口存放xxx文件内容
:new(:vnew) 分割出一个新的窗口,新窗口存放一个新的未命名的文件
:only 关闭所有窗口,仅保留当前窗口
对所有窗口均有效的命令操作 :wall :qall :wqall :wqall!
gvim -o(O) xxx1 xxx2 xxx3 同时打开三个文件以垂直(水平)分割表示
-----------------------------------多个窗口的操作------------------------*/
/*---------------------------------vimdiff命令的使用--------------------------
在terminal中运行 vimdiff xxx1 xxx2(不过windows中貌似没有提供vimdiff命令)
在gvim运行后使用vimdiff命令比较两个文件的不同 :vertical diffsplit xxx,当然当前窗口的文件是即将用于比较的文件
比较结果中,相同的地方很多会被折叠起来,使用"zo"可以展开折叠,使用"zc"可以将他们折起
do 代表diff obtain
dp 代表diff put,dp和do用于更新不同的地方
-----------------------------------vimdiff命令的使用--------------------------*/
最后列出网上找的关于vim的一些经典资料以及自己的一点说明:
http://xbeta.info/vim-tutorials.htm比较全的经典vim资料收集
http://easwy.com/blog/archives/advanced-vim-skills-catalog/vim的另一份经典的学习资料,讲述了vimrc的配置以及一些经典的plugin使用
http://blog.csdn.net/wklken/article/details/7533272vim快捷键备忘录
http://coolshell.cn/articles/5426.html展示了vim从最基础到一些高级的操作案例,从中可以看到vim编辑的强大之处
http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/将vim配置成python IDE
http://blog.zilongshanren.com/blog/2013/01/15/vim-the-killer/一位vim狂人,看过他的视频,见识到vim可以为日常的编辑工作带来相当大的便利
http://haridas.in/vim-as-your-ide.html一位老外的vim基本plugin配置
http://www.thegeekstuff.com/2009/01/tutorial-make-vim-as-your-cc-ide-using-cvim-plugin/将vim打造成熟悉的c++ IDE,为c++的编辑提供相当大的方便
http://www.thegeekstuff.com/category/vim-2/老外的vim教程,讲述很多vim的skills
总结来说,主要是vim的快捷键以及基本命令,还有就是plugin的配置,打造出一份最适合自己的.vimrc
最后是我的.vimrc配置,不是很成熟
" An example for a vimrc file. "---------------------------------------------User Configuration Start----------------------------------- " Naviagations using keys up/down/left/right " Disabling default keys to learn the hjkl "nnoremap <up> <nop> "nnoremap <down> <nop> "nnoremap <left> <nop> "nnoremap <right> <nop> "inoremap <up> <nop> "inoremap <down> <nop> "inoremap <left> <nop> "inoremap <right> <nop> "nnoremap j gj "nnoremap k gk "help document language is chinese "set helplang=cn "set encoding=utf-8 "添加菜单栏和工具条 :set guioptions+=m :set guioptions+=t "chinese menu occurs "set encoding=gb2312 map <F5> i{<Esc>ea}<Esc> " 配置多语言环境,解决中文乱码问题 if has("multi_byte") " UTF-8 编码 set encoding=utf-8 set termencoding=utf-8 set formatoptions+=mM set fencs=utf-8,gbk if v:lang =~? ‘^/(zh/)/|/(ja/)/|/(ko/)‘ set ambiwidth=double endif if has("win32") source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim language messages zh_CN.utf-8 endif else echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte" endif "保存原始的文件版本 set patchmode=.orig "设置主题模式 colorscheme desert "设置语法高亮 syntax enable syntax on "显示行号 set nu! "设置在编辑过程中右下角显示光标的行列信息 set ruler "initial configuration autocmd FileType text setlocal textwidth=78 "自动断行 set number "show row number" set history=100 set autoindent "另起一行时施以上一行的缩进 set smartindent set showcmd " display incomplete commands set tabstop=4 "tab space numbers" set softtabstop=4 "soft tab" set shiftwidth=4 "shift space numbers" set guioptions=t set incsearch set ignorecase set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 set cindent "c/c++ cin dent "设置C/C++方式自动对齐 set autoindent set cindent "设置匹配模式 类似当输入一个左括号时会匹配相应的那个右括号 set showmatch "开启针对不同文件类型的相应plugin的应用 filetype plugin indent on "检测文件类型 filetype on "针对不同的文件采用不同的缩进方式 filetype indent on "程序中跳转 set tags=tags; set autochdir "taglist浏览源码 let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 "map T :TaskList<CR> "winmanager 文件浏览器和窗口管理器 let g:winManagerWindowLayout=‘FileExplorer|TagList‘ nmap wm :WMToggle<cr> "miniBufExplorer快速浏览和操作buffer let g:miniBufExplMapCTabSwitchBufs=1 let g:miniBufExplMapWindowsNavVim=1 let g:miniBufExplMapWindowNavArrows=1 "h\c切换 针对c,c++文件 nnoremap <silent> <F12> :A<CR> "在工程中快速查找grep nnoremap <silent> <F3> :Grep<CR> "-------------------------------Basic Editing and Debugging Start------------------------------------ "Code Folding set foldmethod=indent set foldlevel=99 "Windows SPlits map <c-j> <c-w>j map <c-k> <c-w>k map <c-l> <c-w>l map <c-h> <c-w>h "-------------------------------Basic Editing and Debugging Start------------------------------------ "-------------------------------Vundle插件管理------------------------------------------------------- "启动Vundle "set nocompatible " be iMproved "filetype off " required! "set rtp+=~/.vim/bundle/vundle/ "call vundle#rc() "Bundle ‘L9‘ "Bundle ‘git://vim-latex.git.sourceforge.net/gitroot/vim-latex/vim-latex‘ "文件类型检测 "filetype plugin indent on "-------------------------------Vundle插件管理------------------------------------------------------- "-------------------------------C IDE Setting Start-------------------------------------------------- let g:C_UseTool_cmake = ‘yes‘ let g:C_UseTool_doxygen = ‘yes‘ "-------------------------------C IDE Setting End-------------------------------------------------- "-------------------------------Python IDE Setting Start--------------------------------------------- "Python代码补全 "filetype plugin on "允许使用插件 "let g:pydiction_location = ‘c:\Program Files (x86)\Vim\vimfiles\ftplugin\pydiction\complete-dict‘ "let g:pydiction_menu_height = 20 "设置弹出菜单的高度,默认是15 " ""Python编译 "python << EOF "import time "import vim "def SetBreakpoint(): " nLine = int( vim.eval( ‘line(".")‘)) " strLine = vim.current.line " i = 0 " strWhite = "" " while strLine[i] == ‘ ‘ or strLine[i] == "\t": " i += 1 " strWhite += strLine[i] " vim.current.buffer.append( " "%(space)spdb.set_trace() %(mark)s Breakpoint %(mark)s" % " {‘space‘:strWhite, ‘mark‘: ‘#‘ * 30}, nLine - 1) " for strLine in vim.current.buffer: " if strLine == "import pdb": " break " else: " vim.current.buffer.append( ‘import pdb‘, 0) " vim.command( ‘normal j1‘) " break "vim.command( ‘map <C-M> :py SetBreakpoint()<cr>‘) " "def RemoveBreakpoints(): " nCurrentLine = int( vim.eval( ‘line(".")‘)) " nLines = [] " nLine = 1 " for strLine in vim.current.buffer: " if strLine == ‘import pdb‘ or strLine.lstrip()[:15] == ‘pdb.set_trace()‘: " nLines.append( nLine) " nLine += 1 " nLines.reverse() " for nLine in nLines: " vim.command( ‘normal %dG‘ % nLine) " vim.command( ‘normal dd‘) " if nLine < nCurrentLine: " nCurrentLine -= 1 " vim.command( ‘normal %dG‘ % nCurrentLine) "vim.command( ‘map <C-N> :py RemoveBreakpoints()<cr>‘) "vim.command( ‘map <C-R> :!python %<cr>‘) "EOF "-------------------------------Python IDE Setting Start--------------------------------------------- "---------------------------------------------User Configuration End----------------------------------- "---------------------原有的文件从此开始至结束--------------------------- set nocompatible "关闭vi的一致性模式 避免以前版本的一些Bug和局限“ source $VIMRUNTIME/vimrc_example.vim "source $VIMRUNTIME/mswin.vim behave mswin set diffexpr=MyDiff() function MyDiff() let opt = ‘-a --binary ‘ if &diffopt =~ ‘icase‘ | let opt = opt . ‘-i ‘ | endif if &diffopt =~ ‘iwhite‘ | let opt = opt . ‘-b ‘ | endif let arg1 = v:fname_in if arg1 =~ ‘ ‘ | let arg1 = ‘"‘ . arg1 . ‘"‘ | endif let arg2 = v:fname_new if arg2 =~ ‘ ‘ | let arg2 = ‘"‘ . arg2 . ‘"‘ | endif let arg3 = v:fname_out if arg3 =~ ‘ ‘ | let arg3 = ‘"‘ . arg3 . ‘"‘ | endif let eq = ‘‘ if $VIMRUNTIME =~ ‘ ‘ if &sh =~ ‘\<cmd‘ let cmd = ‘""‘ . $VIMRUNTIME . ‘\diff"‘ let eq = ‘"‘ else let cmd = substitute($VIMRUNTIME, ‘ ‘, ‘" ‘, ‘‘) . ‘\diff"‘ endif else let cmd = $VIMRUNTIME . ‘\diff‘ endif silent execute ‘!‘ . cmd . ‘ ‘ . opt . arg1 . ‘ ‘ . arg2 . ‘ > ‘ . arg3 . eq endfunction
原文:http://blog.csdn.net/newner/article/details/19637169