vim学习心得

来源:互联网 发布:图案设计软件 编辑:程序博客网 时间:2024/06/16 06:45

尝试使用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=gb2312map <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 configurationautocmd FileType text setlocal textwidth=78  "自动断行set number "show row number"set history=100set autoindent  "另起一行时施以上一行的缩进set smartindentset showcmd" display incomplete commandsset tabstop=4  "tab space numbers"set softtabstop=4 "soft tab"set shiftwidth=4 "shift space numbers"set guioptions=tset incsearchset ignorecaseset fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1set cindent "c/c++ cin dent"设置C/C++方式自动对齐set autoindentset cindent"设置匹配模式 类似当输入一个左括号时会匹配相应的那个右括号set showmatch"开启针对不同文件类型的相应plugin的应用filetype plugin indent on  "检测文件类型filetype on"针对不同的文件采用不同的缩进方式filetype indent on"程序中跳转set tags=tags; set autochdir"taglist浏览源码let Tlist_Show_One_File=1let Tlist_Exit_OnlyWindow=1"map T :TaskList<CR>"winmanager 文件浏览器和窗口管理器let g:winManagerWindowLayout='FileExplorer|TagList' nmap wm :WMToggle<cr>"miniBufExplorer快速浏览和操作bufferlet g:miniBufExplMapCTabSwitchBufs=1 let g:miniBufExplMapWindowsNavVim=1 let g:miniBufExplMapWindowNavArrows=1"h\c切换 针对c,c++文件nnoremap <silent> <F12> :A<CR> "在工程中快速查找grepnnoremap <silent> <F3> :Grep<CR> "-------------------------------Basic Editing and Debugging Start------------------------------------"Code Foldingset foldmethod=indentset foldlevel=99"Windows SPlitsmap <c-j> <c-w>j map <c-k> <c-w>kmap <c-l> <c-w>lmap <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.vimbehave mswinset 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 . eqendfunction


0 0
原创粉丝点击