Vim史上最全面的知識點總結

Vim總結

一. Vim的簡介

Vim是一個基於vi編輯器發展出來的一個運行在類Unix系統的文本編輯器,由BramMoolenaar1991年發佈了它的第一版本,最初簡稱爲ViImitation,之後隨着功能的不斷增加,正式改名成ViImproved,具有代碼補充編譯及錯誤跳轉等方便編程的功能,在程序員中被廣泛使用,和Emacs並列成爲類Unix系統用戶最喜歡的編輯器。Vim同時支持命令行模式和gui模式(gVim),是一款自由和開源的軟件程序。儘管Vim最初是爲Amiga系統設計的,但現在已經被發展成多平臺的編輯器,並且在2006linux社區評爲最受歡迎的編輯器。

二. Vim的前世今生

上世紀80年代,BramMoolenaarAmiga系統工作時沒有之前Unix系統中的Vi編輯器,非常不習慣,故Moolenaar決定仿照Vi編輯器,自己編寫可在Amiga系統中運行的編輯器,併成功於1988年寫出類似這樣的編輯器,當時簡稱爲ViIMitation,並於1991年發佈Vim(v1.14),很快該版本的Vim就被“FredFish Disk #591”(Amiga免費軟件集)收錄了。次年Vim就被移植到了UnixMS-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,此時vimNormal模式下(等待命令模式),注意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>
:xZZ: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
FT →ft一樣,只不過是相反方向
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) →代碼塊解註釋

上面是最常用的命令,建議你每天都學12個新的命令,在兩到三週後,你會感到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]

Firstpublic release for the Amiga on FredFish disk#591[23]

1992

1.22[8]

Port to Unix.Vim now competes with vi.

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

4.0[8][24]

Graphicaluser interface

February 19, 1998

5.0[8][25]

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

6.0[8][26]

Foldingplugins,multi-language, etc.

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]

Spellcheckingcodecompletion,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


發佈了36 篇原創文章 · 獲贊 25 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章