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.csdn.net/wooin/article/details/1887737
[5] http://www.csdn.net/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: [email protected]
" Homepage: http://blog.csdn.net/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