正常模式:正則表達式
可使用快捷鍵命令,或按:輸入命令行。
插入模式:shell
能夠輸入文本,在正常模式下,按i、a、o等均可以進入插入模式。
可視模式編程
正常模式下按v能夠進入可視模式, 在可視模式下,移動光標能夠選擇文本。按V進入可視行模式, 老是整行整行的選中。ctrl+v進入可視塊模式。
替換模式vim
正常模式下,按R進入。
vim -c cmd file 在打開文件前,先執行指定的命令 vim -r file 恢復上次異常退出的文件 vim -R file 以只讀的方式打開文件,但能夠強制保存 vim -M file 以只讀的方式打開文件,不能夠強制保存 vim -y num file 將編輯窗口的大小設爲num行 vim + file 從文件的末尾開始 vim +num file 從第num行開始 vim +/string file 打開file,並將光標停留在第一個找到的string上 vim --remote file 用已有的vim進程打開指定的文件。 若是你不想啓用多個vim會話,這個頗有用。但要注意, 若是你用vim,會尋找名叫VIM的服務器;若是你已經有一個gvim在運行了, 你能夠用gvim --remote file在已有的gvim中打開文件
:e file 關閉當前編輯的文件,並開啓新的文件 若是對當前文件的修改未保存,vi會警告 :e! file 放棄對當前文件的修改,編輯新的文件 :e+file 開始新的文件,並從文件尾開始編輯 :e+n file 開始新的文件,並從第n行開始編輯 :enew 編譯一個未命名的新文檔。(CTRL-W n) :e 從新加載當前文檔 :e! 從新加載當前文檔,並丟棄已作的改動 :e#或ctrl+^ 回到剛纔編輯的文件,很實用 :f或ctrl+g 顯示文檔名,是否修改,和光標位置 :f filename 改變編輯的文件名,這時再保存至關於另存爲。 gf 打開以光標所在字符串爲文件名的文件。 :w 保存修改 :n1,n2w filename 選擇性保存從某n1行到另n2行的內容 :wq 保存並退出 ZZ 保存並退出 :x 保存並退出 :q[uit] 退出當前窗口(CTRL-W q或CTRL-W CTRL-Q) :saveas newfilename 另存爲 :Sex 水平分割一個窗口,瀏覽文件系統 :Vex 垂直分割一個窗口,瀏覽文件系統
在normal模式下windows
h或退格 左移一個字符 l或空格 右移一個字符 j 下移一行 k 上移一行 gj 移動到一段內的下一行 gk 移動到一段內的上一行 +或Enter 把光標移至下一行第一個非空白字符 - 把光標移至上一行第一個非空白字符 w 前移一個單詞,光標停在下一個單詞開頭 W 移動下一個單詞開頭,但忽略一些標點 e 前移一個單詞,光標停在下一個單詞末尾 E 移動到下一個單詞末尾,若是詞尾有標點,則移動到標點 b 後移一個單詞,光標停在上一個單詞開頭 B 移動到上一個單詞開頭,忽略一些標點 ge 後移一個單詞,光標停在上一個單詞末尾 gE 同 ge ,不過‘單詞’包含單詞相鄰的標點 ( 前移1句 ) 後移1句 { 前移1段 } 後移1段 fc 把光標移到同一行的下一個c字符處 Fc 把光標移到同一行的上一個c字符處 tc 把光標移到同一行的下一個c字符前 Tc 把光標移到同一行的上一個c字符後 ; 配合f & t使用,重複一次 , 配合f & t使用,反向重複一次 0 移動到行首 g0 移到光標所在屏幕行行首 ^ 移動到本行第一個非空白字符 g^ 同 ^ ,可是移動到當前屏幕行第一個非空字符處 $ 移動到行尾 g$ 移動光標所在屏幕行行尾 n| 把光標移到遞n列上 nG 到文件第n行 :n<cr> 移動到第n行 :$<cr> 移動到最後一行 H 把光標移到屏幕最頂端一行 M 把光標移到屏幕中間一行 L 把光標移到屏幕最底端一行 gg 到文件頭部 G 到文件尾部
ctrl+f 下翻一屏 ctrl+b 上翻一屏 ctrl+d 下翻半屏 ctrl+u 上翻半屏 ctrl+e 向下滾動一行 ctrl+y 向上滾動一行 n% 到文件n%的位置 zz 將當前行移動到屏幕中央 zt 將當前行移動到屏幕頂端 zb 將當前行移動到屏幕底端
m{a-z} 標記光標所在位置,局部標記,只用於當前文件 m{A-Z} 標記光標所在位置,全局標記。標記以後,退出Vim, 從新啓動,標記仍然有效 `{a-z} 移動到標記位置 '{a-z} 移動到標記行的行首 `{0-9} 回到上[2-10]次關閉vim時最後離開的位置 `` 移動到上次編輯的位置。''也能夠,不過``精確到列,而''精確到行 。若是想跳轉到更老的位置,能夠按C-o,跳轉到更新的位置用C-i `" 移動到上次離開的地方 `. 移動到最後改動的地方 :marks 顯示全部標記 :delmarks a b 刪除標記a和b :delmarks a-c 刪除標記a、b和c :delmarks a c-f 刪除標記a、c、d、e、f :delmarks! 刪除當前緩衝區的全部標記 :help mark-motions 查看更多關於mark的知識
i 在光標前插入;一個小技巧:按8,再按i,進入插入模式,輸入=, 按esc進入命令模式,就會出現8個=。 這在插入分割線時很是有用,如30i+<esc>就插入了36個+組成的分割線 I 在當前行第一個非空字符前插入 gI 在當前行第一列插入 a 在光標後插入 A 在當前行最後插入 o 在下面新建一行插入 O 在上面新建一行插入 :r filename 在當前位置插入另外一個文件的內容 :[n]r filename 在第n行插入另外一個文件的內容 :r !date 在光標處插入當前日期與時間。同理,:r !command能夠將其它shell命令的輸出插入當前文檔
c[n]w 改寫光標後1(n)個詞。 c[n]l 改寫光標後n個字母。 c[n]h 改寫光標前n個字母。 [n]cc 修改當前[n]行。 [n]s 以輸入的文本替代光標以後1(n)個字符,至關於c[n]l。 [n]S 刪除指定數目的行,並以所輸入文本代替之。
[n]x 剪切光標右邊n個字符,至關於d[n]l [n]X 剪切光標左邊n個字符,至關於d[n]h y 複製在可視模式下選中的文本 yy or Y 複製整行文本 y[n]w 複製一(n)個詞 y[n]l 複製光標右邊1(n)個字符 y[n]h 複製光標左邊1(n)個字符 y$ 從光標當前位置複製到行尾 y0 從光標當前位置複製到行首 :m,ny<cr> 複製m行到n行的內容 y1G或ygg 複製光標以上的全部行 yG 複製光標如下的全部行 yaw和yas 複製一個詞和複製一個句子,即便光標不在詞首和句首也不要緊 d 刪除(剪切)在可視模式下選中的文本 d$ or D 刪除(剪切)當前位置到行尾的內容 d[n]w 刪除(剪切)1(n)個單詞 d[n]l 刪除(剪切)光標右邊1(n)個字符 d[n]h 刪除(剪切)光標左邊1(n)個字符 d0 刪除(剪切)當前位置到行首的內容 [n] dd 刪除(剪切)1(n)行 :m,nd<cr> 剪切m行到n行的內容 d1G或dgg 剪切光標以上的全部行 dG 剪切光標如下的全部行 daw和das 剪切一個詞和剪切一個句子,即便光標不在詞首和句首也不要緊 d/f<cr> 這是一個比較高級的組合命令,它將刪除當前位置 到下一個f之間的內容 p 在光標以後粘貼 P 在光標以前粘貼
aw 一個詞 as 一句 ap 一段 ab 一塊(包含在圓括號中的)
a-z 均可以用做寄存器名。"ayy把當前行的內容放入a寄存器 A-Z 用大寫字母索引寄存器,能夠在寄存器中追加內容。 如"Ayy把當前行的內容追加到a寄存器中 :reg 顯示全部寄存器的內容 "" 不加寄存器索引時,默認使用的寄存器 "* 當前選擇緩衝區,"*yy把當前行的內容放入當前選擇緩衝區 "+ 系統剪貼板。"+yy把當前行的內容放入系統剪貼板
/something 在後面的文本中查找something ?something 在前面的文本中查找something /pattern/+number 將光標停在包含pattern的行後面第number行上 /pattern/-number 將光標停在包含pattern的行前面第number行上 n 向後查找下一個 N 向前查找下一個
:s/old/new 用new替換當前行第一個old :s/old/new/g 用new替換當前行全部的old :n1,n2s/old/new/g 用new替換文件n1行到n2行全部的old :%s/old/new/g 用new替換文件中全部的old :%s/^/xxx/g 在每一行的行首插入xxx,^表示行首 :%s/$/xxx/g 在每一行的行尾插入xxx,$表示行尾全部替換命令末尾加上c,每一個替換都將須要用戶確認。 如:%s/old/new/gc,加上i則忽略大小寫(ignore)若是不指定range,則表示當前行。 m,n 從m行到n行。 0 最開始一行(多是這樣)。 $ 最後一行 . 當前行 % 全部行
\d 表示十進制數 \s 表示空格 \S 非空字符 \a 英文字母 \| 表示 或 \. 表示. {m,n} 表示m到n個字符。這要和 \s與\a等連用,如 \a\{m,n} 表示m 到n個英文字母 {m,} 表示m到無限多個字符 ** 當前目錄下的全部子目錄 :help pattern獲得更多幫助
<< 向左縮進一個shiftwidth >> 向右縮進一個shiftwidth :ce(nter) 本行文字居中 :le(ft) 本行文字靠左 :ri(ght) 本行文字靠右 gq 對選中的文字重排,即對過長的文字進行斷行 gqq 重排當前行 gqnq 重排n行 gqap 重排當前段 gqnap 重排n段 gqnj 重排當前行和下面n行 gqQ 重排當前段對文章末尾 J 拼接當前行和下一行 gJ 同 J ,不過合併後不留空格
:set spell 開啓拼寫檢查功能 :set nospell 關閉拼寫檢查功能 ]s 移到下一個拼寫錯誤的單詞 [s 做用與上一命令相似,但它是從相反方向進行搜索 z= 顯示一個有關拼寫錯誤單詞的列表,可從中選擇 zg 告訴拼寫檢查器該單詞是拼寫正確的 zw 與上一命令相反,告訴拼寫檢查器該單詞是拼寫錯誤的
使用:next(:n)編輯下一個文件 :2n 編輯下2個文件 使用:previous或:N編輯上一個文件 使用:wnext,保存當前文件,並編輯下一個文件 使用:wprevious,保存當前文件,並編輯上一個文件 使用:args 顯示文件列表 :n filenames或:args filenames 指定新的文件列表 vi -o filenames 在水平分割的多個窗口中編輯多個文件 vi -O filenames 在垂直分割的多個窗口中編輯多個文件
vim -p files 打開多個文件,每一個文件佔用一個標籤頁 :tabe, tabnew 若是加文件名,就在新的標籤中打開這個文件, 不然打開一個空緩衝區 ^w gf 在新的標籤頁裏打開光標下路徑指定的文件 :tabn 切換到下一個標籤。Control + PageDown,也能夠 :tabp 切換到上一個標籤。Control + PageUp,也能夠 [n] gt 切換到下一個標籤。若是前面加了 n , 就切換到第n個標籤。第一個標籤的序號就是1 :tab split 將當前緩衝區的內容在新頁籤中打開 :tabc[lose] 關閉當前的標籤頁 :tabo[nly] 關閉其它的標籤頁 :tabs 列出全部的標籤頁和它們包含的窗口 :tabm[ove] [N] 移動標籤頁,移動到第N個標籤頁以後。 如 tabm 0 當前標籤頁,就會變成第一個標籤頁
:buffers或:ls或:files 顯示緩衝區列表 ctrl+^ 在最近兩個緩衝區間切換 :bn 下一個緩衝區 :bp 上一個緩衝區 :bl 最後一個緩衝區 :b[n]或:[n]b 切換到第n個緩衝區 :nbw(ipeout) 完全刪除第n個緩衝區 :nbd(elete) 刪除第n個緩衝區,並未真正刪除,還在unlisted列表中 :ba[ll] 把全部的緩衝區在當前頁中打開,每一個緩衝區佔一個窗口
vim -o file1 file2 水平分割窗口,同時打開file1和file2 vim -O file1 file2 垂直分割窗口,同時打開file1和file2
:split(:sp) 把當前窗水平分割成兩個窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意若是在終端下,CTRL-S可能會凍結終端,請按CTRL-Q繼續 :split filename 水平分割窗口,並在新窗口中顯示另外一個文件 :nsplit(:nsp) 水平分割出一個n行高的窗口 :[N]new 水平分割出一個N行高的窗口,並編輯一個新文件。 (CTRL-W n或 CTRL-W CTRL-N) ctrl+w f 水平分割出一個窗口,並在新窗口打開名稱爲光標所在詞的文件 C-w C-^ 水平分割一個窗口,打開剛纔編輯的文件
:vsplit(:vsp) 把當前窗口分割成水平分佈的兩個窗口 (CTRL-W v或CTRL CTRL-V) :[N]vne[w] 垂直分割出一個新窗口 :vertical 水平分割的命令: 相應的垂直分割
:qall 關閉全部窗口,退出vim :wall 保存全部修改過的窗口 :only 只保留當前窗口,關閉其它窗口(CTRL-W o) :close 關閉當前窗口,CTRL-W c能實現一樣的功能 (象 :q :x一樣工做 )
ctrl+w + 當前窗口增高一行。也能夠用n增高n行 ctrl+w - 當前窗口減少一行。也能夠用n減少n行 ctrl+w _ 當前窗口擴展到儘量的大。也能夠用n設定行數 :resize n 當前窗口n行高 ctrl+w = 全部窗口一樣高度 n ctrl+w _ 當前窗口的高度設定爲n行 ctrl+w < 當前窗口減小一列。也能夠用n減小n列 ctrl+w > 當前窗口增寬一列。也能夠用n增寬n列 ctrl+w | 當前窗口儘量的寬。也能夠用n設定列數
ctrl+w ctrl+w 切換到下一個窗口或者是ctrl+w w ctrl+w p 切換到前一個窗口 ctrl+w h(l,j,k) 切換到左(右,下,上)的窗口 ctrl+w t(b) 切換到最上(下)面的窗口<BR> ctrl+w H(L,K,J) 將當前窗口移動到最左(右、上、下)面 ctrl+w r 旋轉窗口的位置 ctrl+w T 將當前的窗口移動到新的標籤頁上
~ 反轉光標所在字符的大小寫 可視模式下的U或u 把選中的文本變爲大寫或小寫 gu(U)接範圍(如$,或G),能夠把從光標當前位置到指定位置之間字母所有 轉換成小寫或大寫。如ggguG,就是把開頭到最後一行之間的字母所有變爲小 寫。再如gu5j,把當前行和下面四行所有變成小寫
r 替換光標處的字符,一樣支持漢字 R 進入替換模式,按esc回到正常模式
[n] u 取消一(n)個改動。 :undo 5 撤銷5個改變。 :undolist 你的撤銷歷史。 ctrl + r 重作最後的改動。 U 取消當前行中全部的改動。 :earlier 4m 回到4分鐘前 :later 55s 前進55秒
. 重複上一個編輯動做 qa 開始錄製宏a(鍵盤操做記錄) q 中止錄製 @a 播放宏a
vim -x file 開始編輯一個加密的文件 :X 爲當前文件設置密碼 :set key= 去除文件的密碼
:e ++enc=utf8 filename 讓vim用utf-8的編碼打開這個文件 :w ++enc=gbk 無論當前文件什麼編碼,把它轉存成gbk編碼 :set fenc或:set fileencoding 查看當前文件的編碼 fileencoding=ucs-bom,utf-8,cp936 vim會根據要打開的文件選擇合適的編碼。 注意:編碼之間不要留空格。 cp936對應於gbk編碼。 ucs-bom對應於windows下的文件格式
大體有三種文件格式:unix, dos, mac. 三種格式的區別主要在於回車鍵的編碼:dos 下是回車加換行,unix 下只有 換行符,mac 下只有回車符。服務器
:e ++ff=dos filename 讓vim用dos格式打開這個文件 :w ++ff=mac filename 以mac格式存儲這個文件 :set ff 顯示當前文件的格式 在vimrc中添加set fileformats=unix,dos,mac,讓vim自動識別文件格式
gd 跳轉到局部變量的定義處 gD 跳轉到全局變量的定義處,從當前文件開頭開始搜索 g; 上一個修改過的地方 g, 下一個修改過的地方 [[ 跳轉到上一個函數塊開始,須要有單獨一行的{ ]] 跳轉到下一個函數塊開始,須要有單獨一行的{ [] 跳轉到上一個函數塊結束,須要有單獨一行的} ][ 跳轉到下一個函數塊結束,須要有單獨一行的} [{ 跳轉到當前塊開始處 ]} 跳轉到當前塊結束處 [/ 跳轉到當前註釋塊開始處 ]/ 跳轉到當前註釋塊結束處 % 不只能移動到匹配的(),{}或[]上,並且能在#if,#else, #endif之間跳躍 ci', di', yi' 修改、剪切或複製'之間的內容 ca', da', ya' 修改、剪切或複製'之間的內容,包含' ci", di", yi" 修改、剪切或複製"之間的內容 ca", da", ya" 修改、剪切或複製"之間的內容,包含" ci(, di(, yi( 修改、剪切或複製()之間的內容 ca(, da(, ya( 修改、剪切或複製()之間的內容,包含() ci[, di[, yi[ 修改、剪切或複製[]之間的內容 ca[, da[, ya[ 修改、剪切或複製[]之間的內容,包含[] ci{, di{, yi{ 修改、剪切或複製{}之間的內容 ca{, da{, ya{ 修改、剪切或複製{}之間的內容,包含{} ci<, di<, yi< 修改、剪切或複製<>之間的內容 ca<, da<, ya< 修改、剪切或複製<>之間的內容,包含<>
ctags -R 生成tag文件,-R表示也爲子目錄中的文件生成tags :set tags=path/tags 告訴ctags使用哪一個tag文件 :tag xyz 跳到xyz的定義處,或者將光標放在xyz上按C-],返回用C-t :stag xyz 用分割的窗口顯示xyz的定義,或者C-w ], 若是用C-w n ],就會打開一個n行高的窗口 :ptag xyz 在預覽窗口中打開xyz的定義,熱鍵是C-w } :pclose 關閉預覽窗口。熱鍵是C-w z :pedit abc.h 在預覽窗口中編輯abc.h :psearch abc 搜索當前文件和當前文件include的文件,顯示包含abc的行 :[n]tnext 下一[n]個匹配 :[n]tprev 上一[n]個匹配 :tfirst 第一個匹配 :tlast 最後一個匹配 :tselect tagname 打開選擇列表 :tag xyz<tab> 補齊以xyz開頭的tag名,繼續按tab鍵,會顯示其餘的 :tag /xyz<tab> 會用名字中含有xyz的tag名補全
cscope -Rbq 生成cscope.out文件 cs add /path/to/cscope.out /your/work/dir :cs find c func 查找func在哪些地方被調用 :cw 打開quickfix窗口查看結果
Gtags綜合了ctags和cscope的功能。 使用Gtags以前,你須要安裝GNU Gtags。 而後在工程目錄運行 gtags 。ide
:Gtags funcname 定位到 funcname 的定義處 :Gtags -r funcname 查詢 funcname被引用的地方 :Gtags -s symbol 定位 symbol 出現的地方 :Gtags -g string Goto string 出現的地方。 :Gtags -gi string 忽略大小寫 :Gtags -f filename 顯示 filename 中的函數列表。 你能夠用 :Gtags -f % 顯示當前文件 :Gtags -P pattern 顯示路徑中包含特定模式的文件。 如 :Gtags -P .h$ 顯示全部頭文件, :Gtags -P /vm/ 顯示vm目錄下的文件
:copen 打開快速修改窗口 :cclose 關閉快速修改窗口
快速修改窗口在make程序時很是有用,當make以後:函數
:cl 在快速修改窗口中列出錯誤 :cn 定位到下一個錯誤 :cp 定位到上一個錯誤 :cr 定位到第一個錯誤
C-x C-s 拼寫建議 C-x C-v 補全vim選項和命令 C-x C-l 整行補全 C-x C-f 自動補全文件路徑。彈出菜單後,按C-f循環選擇,固然也能夠按 C-n和C-p C-x C-p 和C-x C-n 用文檔中出現過的單詞補全當前的詞。 直接按C-p和C-n也能夠 C-x C-o 編程時能夠補全關鍵字和函數名啊 C-x C-i 根據頭文件內關鍵字補全 C-x C-d 補全宏定義 C-x C-n 按緩衝區中出現過的關鍵字補全。 直接按C-n或C-p便可
當彈出補全菜單後:ui
C-p 向前切換成員 C-n 向後切換成員 C-e 退出下拉菜單,並退回到原來錄入的文字 C-y 退出下拉菜單,並接受當前選項
正常模式下,按兩下>;光標所在行會縮進 若是先按了n,再按兩下>;,光標如下的n行會縮進 對應的,按兩下<;,光標所在行會縮出 若是在編輯代碼文件,能夠用=進行調整 在可視模式下,選擇要調整的代碼塊,按=,代碼會按書寫規則縮排好 或者n =,調整n行代碼的縮排
zf 建立摺疊的命令,能夠在一個可視區域上使用該命令 zd 刪除當前行的摺疊 zD 刪除當前行的摺疊 zfap 摺疊光標所在的段 zo 打開摺疊的文本 zc 收起摺疊 za 打開/關閉當前摺疊 zr 打開嵌套的折行 zm 收起嵌套的折行 zR (zO) 打開全部折行 zM (zC) 收起全部折行 zj 跳到下一個摺疊處 zk 跳到上一個摺疊處 zi enable/disable fold
上下方向鍵 上一條或者下一條命令。若是已經輸入了部分命令,則找上一 條或者下一條匹配的命令 左右方向鍵 左/右移一個字符 C-w 向前刪除一個單詞 -h 向前刪除一個字符,等同於Backspace C-u 從當前位置移動到命令行開頭 C-b 移動到命令行開頭 C-e 移動到命令行末尾 Shift-Left 左移一個單詞 Shift-Right 右移一個單詞 @ 重複上一次的冒號命令 q 正常模式下,q而後按':',打開命令行歷史緩衝區, 能夠像編輯文件同樣編輯命令 q/和q? 能夠打開查找歷史記錄
:! cmd 執行外部命令 :!! 執行上一次的外部命令 :sh 調用shell,用exit返回vim :r !cmd 將命令的返回結果插入文件當前位置 :m,nw !cmd 將文件的m行到n行之間的內容作爲命令輸入執行命令