vim学习心得

尝试使用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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章