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


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