1、基本知識
1.vim模式介紹
2.三種經常使用模式的切換
2、Vim文檔編輯
1.vim重複命令
2.遊標的快速跳轉
3.複製粘貼和剪切
4.刪除文本
5.字符的替換及撤銷(Undo操做)
6.快速縮進
7.查找
3、高級功能
1.多文件編輯
2.可視模式
3.視窗操做
4.文檔加密
5.幫助系統
6.功能設定
4、實用技巧
1.中文支持
2.鼠標支持
3.空格、製表符和縮進
4.模式行
5.寄存器
6.搜索、替換和正則表達式
7.自動完成和路徑設定
8.文件跳轉和 Tags
9.Make 和 grep
10.執行外部命令
11.定寬文本排版
12.其它小技巧
5、經常使用命令集合
6、C編程IDE的打造 && C語言編程插件 && 經常使用快捷鍵的支持html
如下介紹內容來自維基百科Vimjava
從vi演生出來的Vim具備多種模式,這種獨特的設計容易使初學者產生混淆。幾乎全部的編輯器都會有插入和執行命令兩種模式,而且大多數的編輯器使用了與Vim大相徑庭的方式:命令目錄(鼠標或者鍵盤驅動),組合鍵(一般經過control鍵(CTRL)和alt鍵(ALT)組成)或者鼠標輸入。Vim和vi同樣,僅僅經過鍵盤來在這些模式之中切換。這就使得Vim能夠不用進行菜單或者鼠標操做,而且最小化組合鍵的操做。對文字錄入員或者程序員能夠大大加強速度和效率。
Vim具備6種基本模式和5種派生模式,咱們這裏只簡單介紹下6種基本模式:linux
1.普通模式(Normal mode)
在普通模式中,用的編輯器命令,好比移動光標,刪除文本等等。這也是Vim啓動後的默認模式。這正好和許多新用戶期待的操做方式相反(大多數編輯器默認模式爲插入模式)。
Vim強大的編輯能來自於其普通模式命令。普通模式命令每每須要一個操做符結尾。例如普通模式命令dd刪除當前行,可是第一個"d"的後面能夠跟另外的移動命令來代替第二個d,好比用移動到下一行的"j"鍵就能夠刪除當前行和下一行。另外還能夠指定命令重複次數,2dd(重複dd兩次),和dj的效果是同樣的。用戶學習了各類各樣的文本間移動/跳轉的命令和其餘的普通模式的編輯命令,而且可以靈活組合使用的話,可以比那些沒有模式的編輯器更加高效的進行文本編輯。
在普通模式中,有不少方法能夠進入插入模式。比較普通的方式是按a(append/追加)鍵或者i(insert/插入)鍵。
2.插入模式(Insert mode)
在這個模式中,大多數按鍵都會向文本緩衝中插入文本。大多數新用戶但願文本編輯器編輯過程當中一直保持這個模式。
在插入模式中,能夠按ESC鍵回到普通模式。
3.可視模式(Visual mode)
這個模式與普通模式比較類似。可是移動命令會擴大高亮的文本區域。高亮區域能夠是字符、行或者是一塊文本。當執行一個非移動命令時,命令會被執行到這塊高亮的區域上。Vim的"文本對象"也能和移動命令同樣用在這個模式中。
4.選擇模式(Select mode)
這個模式和無模式編輯器的行爲比較類似(Windows標準文本控件的方式)。這個模式中,能夠用鼠標或者光標鍵高亮選擇文本,不過輸入任何字符的話,Vim會用這個字符替換選擇的高亮文本塊,而且自動進入插入模式。
5.命令行模式(Command line mode)
在命令行模式中能夠輸入會被解釋成並執行的文本。例如執行命令(:鍵),搜索(/和?鍵)或者過濾命令(!鍵)。在命令執行以後,Vim返回到命令行模式以前的模式,一般是普通模式。
6.Ex模式(Ex mode)
這和命令行模式比較類似,在使用:visual命令離開Ex模式前,能夠一次執行多條命令。c++
這其中咱們經常使用到就是普通模式、插入模式和命令行模式。程序員
vim啓動進入普通模式,處於插入模式或命令行模式時只須要按Esc或者Ctrl+[(這在vim課程環境中無論用)便可進入普通模式。普通模式中按i(插入)或a(附加)鍵均可以進入插入模式,普通模式中按:進入命令行模式。命令行模式中輸入wq回車後保存並退出vim。正則表達式
1.使用vim命令進入vim界面chrome
vim後面加上你要打開的已存在的文件名或者不存在(則做爲新建文件)的文件名。 打開Xfce終端,輸入如下命令shell
$ vim practice_1.txt
直接使用vim也能夠打開vim編輯器,可是不會打開任何文件。數據庫
$ vim
進入命令行模式後輸入:e 文件路徑 一樣能夠打開相應文件。編程
2.遊標移動
在進入vim後,按下i鍵進入插入模式。
按Esc進入普通模式,在該模式下使用方向鍵或者h,j,k,l鍵能夠移動遊標。
按鍵 說明 h 左 l 右(小寫L) j 下 k 上 w 移動到下一個單詞 b 移動到上一個單詞
在普通模式下使用下面的鍵將進入插入模式,並能夠從相應的位置開始輸入
命令 說明 i 在當前光標處進行編輯 I 在行首插入 A 在行末插入 a 在光標後插入編輯 o 在當前行後插入一個新行 O 在當前行前插入一個新行 cw 替換從光標所在位置後到一個單詞結尾的字符
命令行模式下保存文檔
從普通模式輸入:進入命令行模式,輸入w回車,保存文檔。輸入:w 文件名能夠將文檔另存爲其餘文件名或存到其它路徑下
1.命令行模式下退出vim
從普通模式輸入:進入命令行模式,輸入wq回車,保存並退出編輯
如下爲其它幾種退出方式:
命令 說明 :q! 強制退出,不保存 :q 退出 :wq! 強制保存並退出 :w <文件路徑> 另存爲 :saveas 文件路徑 另存爲 :x 保存並退出 :wq 保存並退出
2.普通模式下退出vim
普通模式下輸入Shift+zz便可保存退出vim
1.重複執行上次命令
在普通模式下.(小數點)表示重複上一次的命令操做
拷貝測試文件到本地目錄
$ cp /etc/protocols .
打開文件進行編輯
$ vim protocols
普通模式下輸入x,刪除第一個字符,輸入.(小數點)會再次刪除一個字符,除此以外也能夠重複dd的刪除操做
2.執行指定次數相同的命令
進入普通模式輸入N
打開文件文件進行編輯
$ vim protocols
下面你能夠依次進行以下操做練習:
輸入10x,刪除10個連續字符
輸入3dd,將會刪除3行文本
在普通模式下,你還能夠使用dw或者daw(delete a word)刪除一個單詞,因此你能夠很容易的聯想到dnw(n替換爲相應數字)表示刪除n個單詞
普通模式下,下列命令可讓光標快速調轉到指定位置,咱們分別討論快速實現行間跳轉和行內跳轉
1.行間跳轉
命令 說明
nG(n Shift+g) 遊標移動到第 n 行(若是默認沒有顯示行號,請先進入命令模式,輸入:set nu以顯示行號)
gg 遊標移動到到第一行
G(Shift+g) 到最後一行
仍是來練習一下吧:
使用vim打開練習文檔
$ vim protocols
依次進行以下操做練習:
快速跳轉到第9行,而後將其該行刪除
回到第一行,向下刪除8行
跳轉到文檔末,而後刪除該行
小技巧:你在完成依次跳轉後,能夠使用Ctrl+o快速回到上一次(跳轉前)光標所在位置,這個技巧很實用,好比當你在寫代碼時,突然想起有個bug,須要修改,這時候你跳過去改好了,只須要按下Ctrl+o就能夠回到你以前的位置。vim中會用不少相似的小技巧就等着你去發掘。
2.行內跳轉
普通模式下使用下列命令在行內按照單詞爲單位進行跳轉
命令 說明 w 到下一個單詞的開頭 e 到下一個單詞的結尾 b 到前一個單詞的開頭 ge 到前一個單詞的結尾 0或^ 到行頭 $ 到行尾 f<字母> 向後搜索<字母>並跳轉到第一個匹配的位置(很是實用) F<字母> 向前搜索<字母>並跳轉到第一個匹配的位置 t<字母> 向後搜索<字母>並跳轉到第一個匹配位置以前的一個字母(不經常使用) T<字母> 向前搜索<字母>並跳轉到第一個匹配位置以後的一個字母(不經常使用)
1.複製及粘貼文本
普通模式中使用y複製
普通模式中,yy複製遊標所在的整行(3yy表示複製3行)
普通模式中,y^ 複製至行首,或y0。不含光標所在處字符。
普通模式中,y$ 複製至行尾。含光所在處字符。
普通模式中,yw 複製一個單詞。
普通模式中,y2w 複製兩個單詞。
普通模式中,yG 複製至文本末。
普通模式中,y1G 複製至文本開頭。
普通模式中使用p粘貼
普通模式中,p(小寫)表明粘貼至光標後(下)
普通模式中,P(大寫)表明粘貼至光標前(上)
打開文件進入普通模式練習上述命令,這會兒你就能夠隨意yy了,一 一+
$ vim protocols
2.剪切及粘貼
其實前面講得dd刪除命令就是剪切,你每次dd刪除文檔內容後,即可以使用p來粘貼,也這一點可讓咱們實現一個很爽快的功能——交換上下行:
ddp,就這麼簡單,即實現了快速交換光標所在行與它下面的行
普通模式下刪除vim文本信息
進入普通模式,使用下列命令能夠進行文本快速刪除:
命令 說明 x 刪除遊標所在的字符 X 刪除遊標所在前一個字符 Delete 同x dd 刪除整行 dw 刪除一個單詞(不適用中文) d$或D 刪除至行尾 d^ 刪除至行首 dG 刪除到文檔結尾處 d1G 刪至文檔首部
除此以外,你還能夠在命令以前加上數字,表示一次刪除多行,如:
2dd表示一次刪除2行
1.替換和撤銷(Undo)命令
替換和Undo命令都是針對普通模式下的操做
命令 說明 r+<待替換字母> 將遊標所在字母替換爲指定字母 R 連續替換,直到按下Esc cc 替換整行,即刪除遊標所在行,並進入插入模式 cw 替換一個單詞,即刪除一個單詞,並進入插入模式 C(大寫) 替換遊標之後至行末 ~ 反轉游標所在字母大小寫 u{n} 撤銷一次或n次操做 U(大寫) 撤銷當前行的全部修改 Ctrl+r redo,即撤銷undo的操做
1.使用命令進行快速調整縮進操做
這一小節學習如何在vim中進行快速縮進,縮進操做均在普通模式下有效
打開文件進行編輯
$ vim protocols
普通模式下輸入15G,跳轉到15行
普通模式下輸入>> 整行將向右縮進(使用,用於格式化代碼超爽)
普通模式下輸入<< 整行向左回退
普通模式下輸入:進入命令行模式下對shiftwidth值進行設置能夠控制縮進和回退的字符數
2.shiftwidth命令
shiftwidth命令是指上一節>>命令產生的縮進(能夠簡寫成sw) 普通模式下輸入:進入命令行模式下對shiftwidth值進行設置能夠控制縮進和回退的字符數 獲取目前的設定值
:set shiftwidth?
設置縮進爲10個字符
:set shiftwidth=10
輸入ESC回到普通模式,再次嘗試>>看縮進量是否變化
3.調整文本位置
命令行模式下輸入:ce(center)命令使本行內容居中
:ce
命令行模式下輸入:ri(right)命令使本行文本靠右
:ri
命令行模式下輸入:le(left)命令使本行內容靠左
:le
1.快速查找
普通模式下輸入/而後鍵入須要查找的字符串 按回車後就會進行查找。 ?與/功能相同,只不過?是向上而/是向下查找。 進入查找以後,輸入n和N能夠繼續查找 n表示繼續查找,N反向查找
2.快速查找練習
使用vim打開文件進行編輯
$ vim protocols
普通模式下輸入/icmp查找字符串icmp
普通模式下輸入n查找下一個icmp
普通模式下輸入?tcp向上查找字符串tcp
普通模式下輸入N查找上一個出現的tcp
3.高級查找
普通模式下輸入*尋找遊標所在處的單詞
普通模式下輸入#同上,但 * 是向前(上)找,#則是向後(下)找
普通模式下輸入g*同* ,但部分符合該單詞便可
普通模式下輸入g#同# ,但部分符合該單詞便可
以上查找n,N 的繼續查找命令依然能夠用
1.使用vim編輯多個文件
編輯多個文件有兩種形式,一種是在進入vim前使用的參數就是多個文件。另外一種就是進入vim後再編輯其餘的文件。 同時建立兩個新文件並編輯
$ vim 1.txt 2.txt
默認進入1.txt文件的編輯界面
命令行模式下輸入:n編輯2.txt文件,能夠加!即:n!強制切換,以前一個文件的輸入沒有保存,僅僅切換到另外一個文件
命令行模式下輸入:N編輯1.txt文件,能夠加!即:N!強制切換,以前文件內的輸入沒有保存,僅僅是切換到另外一個文件
2.進入vim後打開新文件
命令行模式下輸入:e 3.txt 打開新文件3.txt
命令行模式下輸入:e# 回到前一個文件
命令行模式下輸入:ls能夠列出之前編輯過的文檔
命令行模式下輸入:b 2.txt(或者編號)能夠直接進入文件2.txt編輯
命令行模式下輸入:bd 2.txt(或者編號)能夠刪除之前編輯過的列表中的文件項目
命令行模式下輸入:e! 4.txt,新打開文件4.txt,放棄正在編輯的文件
命令行模式下輸入:f 顯示正在編輯的文件名
命令行模式下輸入:f new.txt,改變正在編輯的文件名字爲new.txt
3.恢復文件
若是由於斷電等緣由形成文檔沒有保存,能夠採用恢復方式,vim -r進入文檔後,輸入:ewcover 1.txt來恢復
$ vim -r 1.txt
1.可視模式命令簡介
在普通模式下輸入v(小寫),進入字符選擇模式,就能夠移動光標,光標走過的地方就會選取。再次按下v會後就會取消選取。
在普通模式下輸入Shift+v(小寫),進入行選擇模式,按下V以後就會把整行選取,您能夠上下移動光標選更多的行,一樣,再按一次Shift+v就能夠取消選取。
在普通模式下輸入 Ctrl+v(小寫),這是區域選擇模式,能夠進行矩形區域選擇,再按一次Ctrl+v取消選取。
在普通模式下輸入d刪除選取區域內容
在普通模式下輸入y複製選取區域內容
2.可視模式命令練習
拷貝練習文件到當前目錄
$ cp /etc/protocols .
打開練習文件
$ vim protocols
在普通模式下9G跳轉到第9行,輸入Shift+v(小寫V),進入可視模式進行行選擇,選中5行,按下>>縮進,將5行總體縮進一個shiftwidth
在普通模式下輸入 Ctrl+v(小寫v),進入可視模式進行矩形區域選擇,選中第一列字符而後x刪除整列
1.視窗操做簡介
vim能夠在一個界面裏打開多個窗口進行編輯,這些編輯窗口稱爲vim的視窗。 打開方法有不少種,例如能夠使用在命令行模式下輸入:new 打開一個新的vim視窗,並進入視窗編輯一個新文件(普通模式下輸入Ctrl+w也能夠,可是Ctrl+w在chrome下會與chrome關閉標籤頁的快捷鍵衝突,因此使用該快捷鍵你能夠在IE或其它瀏覽器進行練習),除了:new命令,下述列舉的多種方法也能夠在命令模式或普通模式下打開新的視窗:
命令行模式下輸入:sp 1.txt 打開新的橫向視窗來編輯1.txt
命令行模式下輸入:vsp 2.txt 打開新的縱向視窗來編輯1.txt
普通模式下Ctrl-w s 將當前窗口分割成兩個水平的窗口
普通模式下Ctrl-w v 將當前窗口分割成兩個垂直的窗口
普通模式下Ctrl-w q 即 :q 結束分割出來的視窗。若是在新視窗中有輸入須要使用強制符!即:q!
普通模式下Ctrl-w o 打開一個視窗而且隱藏以前的全部視窗
普通模式下Ctrl-w j 移至下面視窗
普通模式下Ctrl-w k 移至上面視窗
普通模式下Ctrl-w h 移至左邊視窗
普通模式下Ctrl-w l 移至右邊視窗
普通模式下Ctrl-w J 將當前視窗移至下面
普通模式下Ctrl-w K 將當前視窗移至上面
普通模式下Ctrl-w H 將當前視窗移至左邊
普通模式下Ctrl-w L 將當前視窗移至右邊
普通模式下Ctrl-w - 減少視窗的高度
普通模式下Ctrl-w + 增長視窗的高度
2.視窗操做練習
打開練習文件
$ vim 1.txt
命令行模式下輸入:new 打開一個新的vim視窗
命令行模式下輸入:sp 2.txt 打開新的橫向視窗來編輯2.txt
命令行模式下輸入:vsp 3.txt 打開新的橫向視窗來編輯3.txt
若是使用非chrome瀏覽器能夠使用Ctrl+w進行視窗間的跳轉
分別在不一樣視窗的命令行模式下輸入:q!退出多視窗編輯
建立加密文檔
$ vim -x file1
輸入您的密碼 確認密碼 這樣在下一次打開時,vim就會要求你輸入密碼
在命令行模式中輸入!能夠執行外部的shell命令
:!ls 用於顯示當前目錄的內容
:!rm FILENAME用於刪除名爲 FILENAME 的文件
:w FILENAME可將當前 VIM 中正在編輯的文件另存爲 FILENAME 文件
vim中的查看幫助
普通模式下按F1打開vim本身預設的幫助文檔
命令行模式下輸入:h shiftwidth 打開名爲shiftwidth的幫助文件
命令行模式下輸入:ver 顯示版本及參數
1.vim的功能設定
能夠在編輯文件的時候進行功能設定,如命令行模式下輸入:set nu(顯示行數),設定值退出vim後不會保存。要永久保存配置須要修改vim配置文件。 vim的配置文件~/.vimrc,能夠打開文件進行修改,不過務必當心不要影響vim正常使用
2.獲取目前的設定
命令行模式下輸入:set或者:se顯示全部修改過的配置
命令行模式下輸入:set all 顯示全部的設定值
命令行模式下輸入:set option? 顯示option的設定值
命令行模式下輸入:set nooption 取消當期設定值
3.set功能的說明
命令行模式下輸入:set autoindent(ai) 設置自動縮進
命令行模式下輸入:set autowrite(aw) 設置自動存檔,默認未打開
命令行模式下輸入:set background=dark或light,設置背景風格
命令行模式下輸入:set backup(bk) 設置自動備份,默認未打開
命令行模式下輸入: set cindent(cin) 設置C語言風格縮進
Vim 支持世界上的主要語言,固然也包括中文。若是你用 Vim 編輯中文,而中文不能正確顯示,那有兩種可能性:一是使用的 Vim 不完整,不含多字節語言支持(multi_byte 特性);二是某個配置出了問題。
說到多語言支持,最基本的概念有兩個:一是文件的語言編碼,而是環境的內部編碼。在較老的操做系統中,無論 Linux 仍是 Windows,這兩個編碼都是同樣的,也就意味着,一次只能處理一種編碼的文件:要麼只能處理西文編碼(Latin1,即 ISO-8859-1 [5]),要麼只能處理中文編碼(GB2312 [2])。而在新的操做系統中,這二者能夠是不同的。在 Linux 上,常見的狀況是環境的內部編碼使用 UTF-8 [6],而 UTF-8 能夠同任何一種語言編碼做無損轉換,這就保證了系統的多語言處理能力。Vim 這方面秉承了 Unix/Linux 的傳統,在內部編碼使 UTF-8 的時候,能夠同時處理不一樣意語言編碼的文件。
如下列出了和語言編碼的相關的設置:
●環境變量 LANG(使用的語言); ●環境變量 LC_CTYPE(使用的內部編碼); ●Vim 選項 encoding(Vim 的內部編碼); ●Vim 選項 termencoding(Vim 在與屏幕/鍵盤交互時使用的編碼); ●Vim 選項 fileencoding(Vim 當前編輯的文件在存儲時的編碼); ●Vim 選項 fileencodings(Vim 打開文件時的嘗試使用的編碼); ●Vim 選項 ambiwidth(對「不明寬度」字符的處理方式;Vim 6.1.455 後引入)
若是你的環境只須要處理簡體中文的話,那麼,最簡單的方式就是全部的設定所有使用簡體中文。只須要:設定 LANG=zh_CN.GB2312,不設定 LC_CTYPE(默認跟 LANG 同樣),不設定與編碼相關的 Vim 選項(默認由 LANG 和 LC_CTYPE 決定),也無需設定 Vim 選項 ambiwidth。也就是說,咱們把語言設定爲中國(CN)使用的中文(zh),編碼爲 GB2312(注意:Vim 內部並不識別國標 GB18030 [3],因此此處只能設 GB2312;參看下面關於 UTF-8 的討論)。
不過,若是按照目前 Linux 下的慣例,內部編碼一概使用 UTF-8 的話,會有一些額外的好處,其中之一就是在這種狀況下 Vim 支持同時編輯多種不一樣編碼的文件,如簡體中文和繁體中文(參見圖 2);另外,此時 Vim 也能夠經過編碼轉換支持 GBK [4] 和 GB18030了。這樣,衆多關於語言編碼的 Vim 選項就有了用武之地了。下面進一步說明一下這些選項和推薦設定(若是適用的話):
●encoding=utf-8:無論文件的編碼如何,無論如何顯示和輸入,Vim 內部使用的編碼是 UTF-8;這是國際化支持的基礎。 ●termencoding:取決於實際的終端或 X Window 的設定。舉例來講,若是選擇語言簡體中文登陸到 X Window,或者正在使用 CXTERM [10] 的話,那麼該選項應被設爲 GB2312;若是使用缺省的語言(LANG=en_US.UTF-8)登陸到 X Window,或者使用 PuTTY [11] 遠程訪問 Linux 機器、而且設定裏的字符編碼(配置中 Window-Translation)設爲 UTF-8 的話,該選項就應該設爲 utf-8。從 Windows 下使用 PuTTY 遠程鏈接 Linux 的請特別注意,測試代表,僅在使用 UTF-8 的狀況下,PuTTY 才能可靠地支持中文的顯示和輸入(顯示字體必須設成中文字體)。 ●fileencoding:文件載入時,該選項被置爲 Vim 認定的文件編碼,所以,存儲時文件的編碼不會改變。此處和下面 fileencodings 可以使用的編碼爲 libiconv 支持的全部幾百種編碼(若是編譯時包含了 iconv 特性的話),與中文相關的有 gb23十二、gbk、gb18030、hz-gb-23十二、iso-2022-cn、big五、cp93六、cp950 等。若是建立新文件,你又不但願使用 UTF-8 做爲文件編碼時,那麼,你可能須要手工設定該選項,如「:set fileencoding=gb2312」。須要注意的一點是,使用「set」來設定該選項的話會改變之後新建文件的缺省編碼,而使用 「setlocal」的話則隻影響當前文件(參考「:help setlocal」)。 ●fileencodings=ucs-bom,utf-8,chinese:Vim 會首先判斷文件的開頭是不是一個 Unicode [7] 的 BOM(byte order mark)字符 [8],是的話則把文件的其他內容解釋成相應的 Unicode 序列;否的話再試圖把文件內容解釋成 UTF-8 的序列;再失敗的話,則把文件解釋爲簡體中文(chinese 是一個跨平臺的簡體中文字符集的別名,Linux 下至關於 gb2312 和 euc-cn;此處也能夠根據須要以 gb23十二、gbk 或 gb18030 等編碼替代)。須要注意的是,該順序不能顛倒,而且在後面再添加其它編碼如 big五、latin1 也是沒有意義的,由於 Vim 不能識別 8 比特編碼中的錯誤,所以這些編碼後列的編碼永遠不會被用到。 ●ambiwidth=double:把全部的「不明寬度」字符 [9]——指的是在 Unicode 字符集中某些同時在東西方語言中使用的字符,如省略號、破折號、書名號和全角引號,在西方文字中一般字符寬度等同於普通 ASCII 字符,而在東方文字中一般字符寬度等同於兩倍的普通 ASCII 字符,於是其寬度「不明」——的寬度置爲雙倍字符寬度(中文字符寬度)。此數值只在 encoding 設爲 utf-8 或某一 Unicode 編碼時纔有效。須要額外注意的是,若是你經過終端使用 Vim 的話,須要令終端也將這些字符顯示爲雙寬度。好比,XTERM [12] 的狀況下應該使用選項「-cjk」,即便用命令「uxterm -cjk」來啓動使用雙寬度顯示這些字符的 Unicode X 終端;使用 PuTTY 遠程鏈接的話則應在配置的 Window-Translation 中選中「Treat CJK ambiguous characters as wide」(參見圖 3)。
須要設定的選項一般放在用戶的 Vim 資源配置文件中,即在 ~/.vimrc 文件中加入:
set encoding=utf-8 set fileencoding=chinese set fileencodings=ucs-bom,utf-8,chinese set ambiwidth=double
若是想進一步瞭解這些選項的話,能夠使用「:help ‘選項’」查看幫助文檔中的相關(英文)信息。幫助中也能夠查到這些選項(以及命令)的縮寫:本文中爲方便理解,除一些極少有人使用完整拼寫的命令如 「:e(dit)」、「:s(ubstitute)」等以外,通常使用完整拼寫而不說明或使用縮寫。關於配置文件 .vimrc,能夠使用「:help .vimrc」查看相關信息。
在使用內部編碼 UTF-8 的狀況下,如需編輯 fileencodings 以外(其不能自動識別)的文件,則能夠使用如下命令:「:e ++enc=編碼 文件名」。詳情可參考「:help ++enc」。
無論是文本界面仍是圖形界面的 Vim,都支持鼠標。不過,在文本界面中,鼠標支持缺省沒有被激活;這就意味着,在終端上使用鼠標,全部的功能仍和沒有使用 Vim 時相同,並不受 Vim 影響。要激活文本界面中的鼠標支持也很容易,只須要執行一句「:set mouse=a」便可。
啓用了鼠標支持以後,Vim 主要支持的鼠標操做有:
●單擊移動光標到點擊的位置; ●在幫助的關鍵字上雙擊顯示該關鍵字相關的幫助信息; ●在普通文本上雙擊選中點擊位置的單詞; ●拖動鼠標選中文本; ●使用鼠標滾輪滾動當前緩衝區中的文本; ●多窗口編輯時能夠拖動窗口分欄的位置。
進一步的信息可參看「:help ‘mouse’」、「:help mouse-using」和「:help scroll-mouse-wheel」。
特別須要值得一提的是,在遠程訪問 Linux 系統時也是能夠使用鼠標的。若是使用 X Window 系統,天然沒必要說;而使用 SSH 遠程鏈接時,大部分 Linux 下的終端客戶程序,如 XTERM、GNOME-Terminal [13]、較新版本的 Konsole [14],以及 Windows 下的 PuTTY,支持鼠標的使用:你只需簡單地啓動 Vim、執行一句「:set mouse=a」就能夠了(固然,也能夠把上面的語句去掉起始的冒號放到 .vimrc 文件中)。
對於編寫代碼,縮進是最基本的概念之一。至於縮進是使用空格仍是製表符(Tab),或者縮進是否正好使用一個製表符來表示,不少程序員,特別是 Windows 開發出身的程序員,很容易混淆。幸虧,Vim 對於這些概念有很是完整的支持,足以應付各類複雜的狀況。如下是相關的主要 Vim 選項:
●shiftwidth(縮進的空格數); ●tabstop(製表符的寬度); ●expandtab(是否在縮進和遇到 Tab 鍵時使用空格替代;使用 noexpandtab 取消設置); ●softtabstop(軟製表符寬度,設置爲非零數值後使用 Tab 鍵和 Backspace 時光標移動的格數等於該數值,但實際插入的字符仍受 tabstop 和 expandtab 控制); ●autoindent(自動縮進,即每行的縮進值與上一行相等;使用 noautoindent 取消設置); ●cindent(使用 C 語言的縮進方式,根據特殊字符如「{」、「}」、「:」和語句是否結束等信息自動調整縮進;在編輯 C/C++ 等類型文件時會自動設定;使用 nocindent 取消設置); ●cinoptions(C 語言縮進的具體方式,請參考「:help cinoptions-values」); ●paste(粘貼模式,會取消全部上述選項的影響來保證後面的操做——一般是從剪貼板粘貼代碼——保持原有代碼的風格;使用 nopaste 取消設置)。 下面給出一些經常使用的組合: ●shiftwidth=4 tabstop=4:不少 Windows 出身的程序員會習慣這樣的設置,讓縮進等於製表符寬度。 ●shiftwidth=4 tabstop=8:不少 Unix 程序員的設置,仍使用較經常使用的 4 格縮進,但製表符寬度爲標準的 8。 ●cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:標準的 GNU 編碼風格的設置,對 Vim 缺省的 C 縮進風格做了不少微調,好比,if 語句下的「{」、「}」要在「if」後縮進兩格,但函數定義部分「{」、「}」仍和函數名一行對齊。開源軟件常用該種縮進風格。
在編輯代碼時一個頗有用的命令是調整代碼縮進,能夠很方便地增長(或減小)若干級縮進,並自動根據選項設定使用正確的空格或製表符。只須要使用 「V」選中你要調整的代碼行,而後鍵入「<」(或「>」)便可增長(或減小)一級縮進;在鍵入「<」(或「>」)以前鍵入數字則 能夠指定增長(或減小)的縮進級數。
咱們要討論的最後一個相關的命令是「:retab」。在設定了 expandtab 選項時,該選項會把全部的製表符轉換成空格。在沒有設定 expandtab 選項時,使用「:retab!」可把空白字符轉換成製表符(可能誤轉換,慎用),使用「:retab n」能夠把 tabstop 重置爲 n,並轉換含製表符的連續空白字符爲適當的製表符和空格的組合以保證含製表符的行看起來沒有任何變化。詳細信息請參看「:help :retab」。
沒人願意每次都手工輸入一大堆的 Tab 和縮進設定。但是,放在 .vimrc 文件中彷佛也不是個好主意:若是我編輯的代碼不止一種風格呢?——考慮一下,若是你參加開源軟件項目,你能保證你參加的全部項目,還有你公司裏的軟件項 目,代碼風格都同樣嗎?——Vim 是我用過的第一個支持在文件中記錄代碼風格設定的編輯器。這個特性在 Vim 中叫作模式行,實際上,它所作的是在打開文件時根據文件中的 Vim 指令設定相關的 Vim 選項。下面就是一個嵌在 C 源代碼中的模式行:
/* vim: set tabstop=4 shiftwidth=4 expandtab: /
模式行有好幾種形式。本文只介紹上面的這種形式(其它形式相似,請自行參考「:help modeline」):行首的「/」和尾部的「*/」告訴 C 編譯器這是一行註釋,不是代碼的一部分;而 Vim 可經過後面的「vim:」識別出模式行的開始(必須出如今行首或前面有一個空白字符);後面則是「set」和空格間隔開的一串 Vim 選項;「:」表示模式行結束。
這種方式很是簡單,功能也很是強大。另外請注意,出於安全的考慮,模式行中的選項隻影響當前文件(「:help modeline-local」),也不能作任何設置選項之外的工做。
一般的編輯器有一個剪貼板,以存儲複製和剪切的內容。Vim 中的相似概念叫作寄存器(register)。除了有一個無名寄存器外,Vim 還有一大堆有名的寄存器,能夠經過「」」(參見「:help 「」)或「Ctrl-R」(參見「:help i_CTRL-R」和「:help c_CTRL-R」)加寄存器名(字母、數字和某些特殊字符,參見「:help registers」;「無名」寄存器的名字是「」」)來訪問。好比,你先使用「」ayy」複製了一行,而後使用「dd」刪掉了一行,而後移動光標到要復 制到的位置,就能夠使用「」aP」把先前複製的內容粘貼上去了。手工編輯是有名寄存器的做用還不是很大,但當你想讓 Vim 經過相似於宏的方式自動完成工做時,有名寄存器就變成不可缺乏的重要功能了。下面咱們還會用到。
在使用 X Window 系統時,有兩個特殊的寄存器是須要注意一下的:「」*」訪問的寄存器是 X 的主選擇區域(primary selection),「」+」訪問的寄存器是 X 的剪貼板(clipboard)。若是你要在 Vim 和其它的 X 應用程序之間複製文本內容,你能夠試一下這兩個寄存器。
還有一個很特殊的「寄存器」:「=」。在插入模式或命令模式中,鍵入「Ctrl-R=」,Vim 會提示你輸入一個表達式,普通的整數運算在此徹底有效。若是想要進行浮點運算,請參見第 3.2 節中的技巧。
你們應該都已經知道 Vim 裏使用「/模式」(或「?模式」)進行搜索,使用「:s/模式/字符串/標誌」進行替換,其中的「模式」是一個正則表達式。關於正則表達式,不熟悉的話可 以邊用邊學,本節也不打算對 Vim 的正則表達式做完整的闡述(那可能能夠專門寫一本小冊子了),而只拋磚引玉式地給出一些有用的例子加以說明,以及一些實用技巧。
先說一點點搜索。搜索裏最最有用的一個快捷方式是「」(向下完整匹配光標下的單詞)。把光標移動到你要搜索的詞(變量名、函數名等)上,好比 「test」,而後按「」,Vim 將自動產生一個對「<test>」(參見「:help /<」和「:help />」)的搜索,也就是說,搜索完整的單詞「test」。不要小看這個技巧,它常常能夠大幅度地提升搜索的速度。事實上,這是 Vim 網站上公佈的第 1 號技巧,也是被評價最高的技巧。類似的技巧還有「#」(向上完整匹配光標下的單詞)、「g*」(向下部分匹配光標下的單詞)等,請自行查看(「:help #」等)。
Vim 在搜索和替換時會對匹配成功的文本進行加亮,在已經完成搜索和替換任務後,這種加亮有時反而會妨礙顯示。Vim 專門提供一個命令取消這種加亮(直到用戶再一次使用搜索或替換命令):「:nohlsearch」。建議用戶建立一個鍵盤映射(key mapping)加入到 .vimrc 中,如:
nmap:nohlsearch
以上命令表示,在正常模式下按 F2 鍵至關於輸入「:nohlsearch」後面跟一個回車,即取消搜索加亮顯示。
再看幾個搜索替換的實用例子。
●去掉全部的行尾空格:「:%s/\s\+$//」。「%」表示在整個文件範圍內進行替換,「\s」表示空白字符(空格和製表符),「\+」對 前面的字符匹配一次或屢次(越多越好),「$」匹配行尾(使用「\$」表示單純的「$」字符);被替換的內容爲空;因爲一行最多隻需替換一次,不須要特殊 標誌。這個仍是比較簡單的。 ●去掉全部的空白行:「:%s/\(\s*\n\)\+/\r/」。這回多了「\(???\)」、「\n」、「\r」和「*」。「*」表明對前 面的字符(此處爲「\s」)匹配零次或屢次(越多越好;使用「\*」表示單純的「*」字符),「\n」表明換行符,「\r」表明回車符,「\(??? \)」對錶達式進行分組,使其被視做一個不可分割的總體。所以,這個表達式的完整意義是,把連續的換行符(包含換行符前面可能有的連續空白字符)替換成爲 一個單個的換行符。惟一很特殊的地方是,在模式中使用的是「\n」,而被替換的內容中卻不能使用「\n」,而只能使用「\r」。緣由是歷史形成的,詳情如 果有興趣的話能夠查看「:help NL-used-for-Nul」。 ●去掉全部的「//」註釋:「:%s!\s*//.*!!」。首先能夠注意到,這兒分隔符改用了「!」,緣由是在模式或字符串部分使用了「/」 字符,不換用其餘分隔符的話就得在每次使用「/」字符自己時寫成「\/」,上面的命令得寫成「:%s/\s*\/\/.*//」,可讀性較低。命令自己倒 是至關簡單,用過正則表達式的人估計都知道「.」匹配表示除換行符以外的任何字符吧。 ●去掉全部的「/* */」註釋:「:%s!\s*/\*\_.\{-}\*/\s*! !g」。這個略有點複雜了,用到了幾個不太經常使用的 Vim 正則表達式特性。「\_.」匹配包含換行在內的全部字符;「\{-}」表示前一個字符可出現零次或屢次,但在整個正則表達式能夠匹配成功的前提下,匹配的 字符數越少越好;標誌「g」表示一行裏能夠匹配和替換屢次。替換的結果是個空格的目的是保證像「int/* space not necessary around comments */main()」這樣的表達式在替換以後仍然是合法的。
但願上面的這些簡單的例子可以引發你使用 Vim 的正則表達式高效完成任務的興趣。進一步的信息可參考「:help regexp」。
Vim 支持單詞的自動完成。好比,你前面使用了一個很長的變量名,叫 aLongVariable,下面你在輸入時,就不用完整鍵入了。極可能,你只須要鍵入「aL」,而後按下「Ctrl-P」(向前搜索可匹配的單詞並完 成)就能夠獲得完整的變量名(沒有獲得想要的結果的話,多按幾下「Ctrl-P」;或者前面多輸入幾個字符,如「aLongV」)。相似的命令還有 「Ctrl-N」(向後搜索可匹配的單詞並完成)、「Ctrl-X Ctrl-L」(搜索可匹配的行並完成)、「Ctrl-X Ctrl-F」(搜索可匹配的文件名並完成)等,具體可參看「:help ins-completion」。
若是你並不熟悉這些功能,但也並不以爲這有什麼稀奇的話,下面這個例子可能會讓你以爲吃驚。請嘗試打開一個空白的 C 文件(vim test.c),並輸入:
#include int main() { pri
最後一行不要回車,直接在「pri」後面輸入「Ctrl-P」,你將看到「printf」出現。是的,雖然文件裏沒有「printf」,但 Vim 知道到哪裏去尋找它!在做關鍵字匹配完成時,若是當前文件和其它打開的文件中沒有想要的結果,Vim 會自動到「#include」的文件中進行進一步的搜索(爲何是「#include」呢?請查閱「:help ‘include’」),搜尋的目錄則由選項 path 決定,其缺省值在 Unix(含 Linux)下爲「.,/usr/include,,」,表明搜索的目錄依次是文件所在目錄、/usr/include 和當前目錄。根據實際狀況,你可能須要在 .vimrc 文件中設置該選項,加入項目相關的包含目錄,注意通常要保留最後的「,,」,除非你不須要在當前目錄下搜索。
設置了合適的 path 後,另外帶來的一個便利就是能夠使用「gf」命令方便地跳轉到光標下的文件名所表明的文件中。在上面的例子中,把光標移到「stdio.h」的任一字符 上,鍵入「gf」,則 Vim 會自動打開 /usr/include/stdio.h 文件。使用「Ctrl-O」(參見「:help CTRL-O」)可返回到原先的文件中。
你們通常都知道,在 Vim 的幫助窗口中的關鍵字上雙擊鼠標或者鍵入「Ctrl-]」便可跳轉至該關鍵字相關的幫助主題。不過,「跳轉至匹配的關鍵字」這一功能並不只僅侷限於幫助文 件。只要有合適的 tags 文件(參見「:help tags-file-format」),咱們一樣能夠在源代碼中使用這個方便的功能,跳轉到與關鍵字匹配的「標記」處(一般是源代碼中某一函數、類型、變 量或宏的定義位置)。
要產生 tags 文件,一般咱們使用 Exuberant Ctags [15]。通常的 Linux 發佈版中均帶有這一工具。Ctags 帶有的選項數量極多,此處咱們僅簡單介紹如何在一個典型的多文件、多層目錄的項目中使用其基本功能:咱們只需在項目的根目錄處鍵入「ctags -R .」,Ctags 便可自動在文件中查找、識別支持的文件格式、生成 tags 文件。目前 Exuberant Ctags 支持多達 33 種編程語言 [16],包括了 Linux 下經常使用的 C、C++、Java、Perl、PHP 等。有了 tags 文件,如下的 Vim 命令就能夠方便使用了(進一步的信息可參考「:help tags-and-searches」):
●:tag 關鍵字(跳轉到與「關鍵字」匹配的標記處) ●:tselect [關鍵字](顯示與「關鍵字」匹配的標記列表,輸入數字跳轉到指定的標記) ●:tjump [關鍵字](相似於「:tselect」,但當匹配項只有一個時直接跳轉至標記處而再也不顯示列表) ●:tn(跳轉到下一個匹配的標記處) ●:tp(跳轉到上一個匹配的標記處) ●Ctrl-](跳轉到與光標下的關鍵字匹配的標記處;除「關鍵字」直接從光標位置自動得到外,功能與「:tags」相同 ●g](與「Ctrl-]」功能相似,但使用的命令是「:tselect」) ●g Ctrl-](與「Ctrl-]」功能相似,但使用的命令是「:tjump」) ●Ctrl-T(跳轉回上次使用以上命令跳轉前的位置)
當咱們在項目的根目錄下工做時,上面這些命令工做得很好。但若是咱們進到多層目錄的裏層再運行 Vim 打開文件時,這些命令的執行結果一般就變成了錯誤信息「E433: No tags file」。這是由於缺省 Vim 只在文件所在目錄和當前目錄下尋找 tags 文件,而咱們前面只在項目的根目錄下生成了 tags 文件,Vim 沒法找到該文件。解決方法有好幾種,我認爲通常較簡單的作法是對每一個項目都在 .vimrc 文件中增長一個路徑相關設定。假設咱們有兩個項目,位置分別是 /home/my/proj1 和 /home/my/proj2,那咱們能夠使用:
au BufEnter /home/my/proj1/* setlocal tags+=/home/my/proj1/tags au BufEnter /home/my/proj2/* setlocal tags+=/home/my/proj2/tags
Vim 選項 tags 用於控制檢查的 tags 文件,缺省值爲「./tags,tags」,即前面所說的文件所在目錄下和當前目錄下的 tags 文件。上面兩行自動命令告訴 Vim,在打開項目目錄下的文件時,tags 選項中的內容要增長項目的 tags 文件的路徑。進一步信息可參看「:help ‘tags’」。
Make [17] 和grep [18] 應當算是 Unix 世界裏無人不曉的基本工具了吧。很天然的,Vim 對它們有着特殊的支持。該支持主要經過訪問一個特殊的快速修訂窗口(quickfix window)來實現。直接在 Vim 的命令模式裏輸入相應的 make 或 grep 命令(如「:grep foo *.c」)便可將命令的執行結果放入該窗口,同時根據返回的結果跳轉到第一個錯誤(make 的狀況;在使用 grep 時是匹配成功之處)。如下是經常使用的「快速修訂」命令:
●:cn(顯示下一個錯誤) ●:cp(顯示上一個錯誤) ●cl(列出全部的錯誤及其編號) ●:cc(跳轉到指定編號的錯誤) ●:copen(打開快速修訂窗口,在其中顯示全部錯誤,可在錯誤上雙擊鼠標或按回車鍵跳轉至該錯誤;示例參見圖 4) ●:cclose(關閉快速修訂窗口)
Vim 的這個特性也能夠與 make 和 grep 之外的程序一塊兒工做(事實上,在 Windows XP 上,「:grep」命令通常調起的是「findstr /n」)。具體調用那個程序由選項 makeprg(Linux 下缺省爲「make」)和 grepprg(Linux 下缺省爲「grep -n $* /dev/null」)控制,而如何解析返回的內容則由選項 errorformat 和 grepformat 控制。鑑於在 Unix/Linux 下通常不需更改這些選項的內容,此處再也不詳述。
在「:make」這樣的命令中,Vim 會自動調用外部的程序。用戶固然也能夠本身執行外部的程序:估計不少的人都已經知道了用「:!命令」能夠在 Vim 中執行一個外部命令。不過,估計大部分人都不知道,還有其它一些命令能夠執行外部命令,而且,即便「:!」命令裏面也有一些技巧能夠使用。
最正規的執行外部命令的方法,如前所述,就是「:!」。好比,咱們想要顯示當前目錄下的全部文件,就能夠直接執行:「:!ls」。Vim 會在一個終端窗口中進行文件列表,而後提示咱們按鍵返回 Vim 中。事實上,這種方式對於「cp」、「rm」這樣基本不須要輸出的命令比較實用,而對於「ls」這樣關注於輸出的命令並不太適用。
若是想把外部命令執行的結果插入到當前編輯的緩衝區中,能夠考慮使用「:r!」。好比,咱們使用「:r!ls」,就能夠把「ls」命令的執行結果插入到緩衝區中光標所在行下面。在使用宏時,這可能會特別有用。
Vim 的「:!」命令還有一個特別強大的技巧能夠使用。拿一個實際例子,咱們須要對在一個文件的每一行以前插入一個編號,該怎麼作呢?——用 Vim 的宏或者腳本能夠完成這一工做,但這不是最高效、最靈活的工做方式。Linux 下通常帶有的 GNU 的 nl,能夠用很是靈活的方式來完成這一任務——要對全部的非空行進行編號,只須要「:%!nl」;要對包含空行的全部行進行編號?OK,「:%!nl -ba」。
稍做一點解釋。當使用可視模式選中文本行後而後鍵入「:!」(命令行上將出現「:’<,’>!」,表示命令的範圍是選定的文本),或者 使用「:%!」(表示命令的範圍是整個緩衝區中的文本),Vim 在執行後面的命令時,將把命令範圍裏的文本行做爲後面執行的命令標準輸入,並用命令執行後的標準輸出替換當前緩衝區中的這些文本行。這就是上面的命令行的 工做原理。
在傳統的 Unix 環境下,文本文件的定義是具備必定長度限制的文本行的組合 [19]。雖然 Vim 自己對行的長度沒有任何實際的限制,但有一些工具備這樣的限制。爲了最大程度的兼容性,也爲了在顯示、打印等處理上比較方便,通常推薦在郵件和源代碼中一 般不要超出 72 列(最多不超出 80 列)。Vim 在處理定寬的文本方面具備特殊的支持能力。下面是一個在 Vim 中把行寬(使用選項 textwidth)設爲 40 後輸入 Harry Potter and the Half-Blood Prince 的第一句話的結果:
It was nearing midnight and the Prime Minister was sitting alone in his office, reading a long memo that was slipping through his brain without leaving the slightest trace of meaning behind.
輸入時我只使用了英文字母和空格,換行符都是 Vim 自動插入的。若是在某一行加入或刪除了一些字符後行不就不齊了嗎,該如何處理?很簡單,把光標移到要從新格式化的文本開頭,使用「gq」命令後面跟一個光 標移動命令肯定從新格式化的範圍。好比「gq}」(格式化一段),「gq5j」(格式化 5 行),「gqG」(格式化至文件末尾)。
除了選項 textwidth 外,選項 formatoptions 肯定了跟文本格式化有關的基本選項,經常使用的數值有:
●t:根據 textwidth 自動折行; ●c:在(程序源代碼中的)註釋中自動折行,插入合適的註釋起始字符; ●r:插入模式下在註釋中鍵入回車時,插入合適的註釋起始字符; ●q:容許使用「gq」命令對註釋進行格式化; ●n:識別編號列表,編號行的下一行的縮進由數字後的空白決定(與「2」衝突,須要「autoindent」); ●2:使用一段的第二行的縮進來格式化文本; ●l:在當前行長度超過 textwidth 時,不自動從新格式化; ●m:在多字節字符處能夠折行,對中文特別有效(不然只在空白字符處折行); ●M:在拼接兩行時(從新格式化,或者是手工使用「J」命令),若是前一行的結尾或後一行的開頭是多字節字符,則不插入空格,很是適合中文
上面提到的註釋,能夠是 C/C++ 中的「//」和「/*」,也能夠是郵件中引用原文使用的「>」等字符(具體由 comments 選項控制;參見「:help ‘comments’」)。Vim 在遇到這些字符時,可以至關智能地進行處理,足以完成平常編輯源代碼和郵件的須要。在使用一些處理純文本不夠強大的郵件客戶端時,我一般使用 Vim 編輯郵件(特別是英文郵件),而後把結果貼回到郵件編輯窗口中進行發送。
Vim 中 formatoptions 的缺省值是「tcq」,通常我會在 .vimrc 文件中加入一行「set formatoptions+=mM」來確保 Vim 能在中文字符之間折行而不要求空格的存在,而且在大部分狀況下能夠正確地處理中文從新格式化。
= ctrl+w
:split 文件名 同時在一個頁面顯示多個文件的內容,相似多窗口,用切換當前窗口
f 切分顯示光標在處的文件名,VIM 會在 path 中搜索該文件名,好比經常使用它打開 #include 語句中的文件
_ 當同時打開幾個文件時,按 _ 使當前窗口最大化
用Ctrl-W命令指定光標移動:
Ctrl-W + 擴大窗口 Ctrl-W - 縮小窗口 Ctrl-W h 移動到窗口左邊 Ctrl-W j 移動到窗口下邊 Ctrl-W k 移動到窗口上邊 Ctrl-W l 移動到窗口右邊
等因而按下後,鬆開鍵盤,再按下一個命令就能夠了.
若是要關閉分割窗口能夠用:close,剩下只有一個窗口的話就不能關了。
多窗口是split,像用e打開多個文件是將文件放在緩衝區中。
能夠zf進行摺疊, 用zo打開摺疊,也能夠方向鍵向右打開摺疊,zc 關閉摺疊(只要在被摺疊的塊中的任一個語句就行)
:n 編輯下一個文件。
:2n 編輯下二個文件。
:N 編輯前一個文件。注意,這種用法只能用於 argument list 的情形。
:rew 回到首文件
:args 查看當前編輯緩衝文件狀態
:e# 或 Ctrl-^ 編輯前一個檔案,用於兩文件互相編輯時至關好用。這種用法無論是 argument list 或buffer list 檔案間皆可以使用。 使用Ctrl-^ 命令更便捷,但如終端類型不正確該功能將無效。
用:ls來顯示緩衝區中的文件,編號後邊有#的表明是前一個文件,能夠經過:e#來進入,有%a的表明是當前文件,什麼也沒有的能夠經過:bn來進入,這裏的n表明文件編號。
:b文件名或編號 移至該文件。
在 :ls 中就會出示各文件的編號,這個編號在未離開 vim 前是不會變的。這個指令 elvis 也是能夠使用。固然 :e#編號 也是能夠的,這樣的用法則是全部 vi clone 都通用了。
在 buffers 中,減號 - 表示這個 buffer 並未載入,不過,沒必要擔憂,載入至關快速的。加號 + 表示這個 buffer 已經修改過了。
:bn buffer next。這裏的n表明字母n
:bl buffer last。
以上兩個指令 elvis 不適用。
若是您是使用 vim 的 GUI,那就在菜單上就會有 Buffers 這個選項,能夠很容易的知道及移動各buffer 間。
:bd(elete) buffer 在未離開 vim 前是不會移除的,可以使用這個指令移除。其實移除它幹什麼呢?vim是您在叫用時纔會載入的,所以這些 buffers 並非像 cache 通常要佔內存的。
自動完成
i 向上搜索,補全一個詞 i 向下搜索,補全一個詞 i 補全一行。 好比你寫過一行 for (int i = 0; i 便可。若是補全出來的不是你想要的那一行,你能夠按 或 選擇上一個或下一個匹配行i 在文件系統中搜索,補全一個文件名 若是按 或 補全一個詞,在當前文件中沒有找到匹配,VIM 將搜索 #include 語句中的文件,而文件的位置將在 path 中搜索。 i 把上一行對應列的字符抄下來 i 把下一行對應列的字符抄上來,這兩個均可以一直按下去,到了行尾本身會停的.
註釋塊的方法:
選定要註釋掉的行 I // Esc
I以後輸入的東西就是插入到選定的行前邊的,直至Esc.
要去掉註釋的辦法:選定註釋符//,而後d
列塊選定後I是在前邊都插入,A是在後邊都插入
是按列塊模式的選定,是行選定,v是普通選定
放棄一修改過的文件,從新編輯。
(1)使用命令 :q!強行退出後再vi flname從新進入。
(2)使用命令 :e!強行重編輯更便捷。這樣也是會打開文件,但會放棄目前編輯文件的改變,不然若是文件已有變更,vim 預設是不讓您隨便離開的。:e! 後不接什麼的話,表明捨棄一切修改,從新載入編輯中文件。
●%(跳轉到與之匹配的括號處) ●.(重複上次的修改命令) ●`.(跳轉到最近修改過的位置) ●ZQ(無條件退出 ●ZZ(存盤退出) ●ga(顯示光標下的字符在當前使用的 encoding 下的內碼) ●guw(光標下的單詞變爲小寫) ●gUw(光標下的單詞變爲大寫) ●:TOhtml(根據 Vim 的語法加亮的方式生成 HTML 代碼;在圖形界面中也能夠使用菜單「Syntax—Convert to HTML」達到一樣效果) 無聊的時候,還能夠試試: ●:help! ●:help 42 ●:help holy-grail ●:files 或 :buffers 或 :ls 會列出目前 buffer 中的全部文件。 ●在 elvis 中可以使用 :b 來叫出 buffers。 ●:f 或 Ctrl-g 顯示目前編輯的文件名、是否通過修改及目前光標所在之位置。 ●:f 文件名 改變編輯中的文件名。(file) ●:r 文件名 在光標所在處插入一個文件的內容。(read) ●:35 r 文件名 將文件插入至 35 行以後。 ●gf 這是 vim 的特殊打開文件的方法,會打開光標所在處的 word 爲名的文件,固然,這個文件要在當前目錄內,不然會建立新文件。
1.查找
/xxx(?xxx) 表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示 向上查找.其中xxx能夠是正規表達式,關於正規式就很少說了. 通常來講是區分大小寫的, 要想不區分大小寫, 那得先輸入 :set ignorecase 查找到之後, 再輸入 n 查找下一個匹配處, 輸入 N 反方向查找. *(#) 當光標停留在某個單詞上時, 輸入這條命令表示查找與該單詞匹配的 下(上)一個單詞. 一樣, 再輸入 n 查找下一個匹配處, 輸入 N 反方 向查找. g*(g#) 此命令與上條命令類似, 只不過它不徹底匹配光標所在處的單詞, 而 是匹配包含該單詞的全部字符串. gd 本命令查找與光標所在單詞相匹配的單詞, 並將光標停留在文檔的非 註釋段中第一次出現這個單詞的地方. %本命令查找與光標所在處相匹配的反括號, 包括 () [] {} f(F)x 本命令表示在光標所在行進行查找, 查找光標右(左)方第一個x字符. 找到後: 輸入 ; 表示繼續往下找 輸入 , 表示反方向查找
2.快速移動光標
在 vi 中, 移動光標和編輯是兩件事, 正由於區分開來, 因此能夠很方便的進行光標定位和編輯. 所以能更快一點移動光標是頗有用的.
w(e) 移動光標到下一個單詞. b 移動光標到上一個單詞. 0 移動光標到本行最開頭. ^ 移動光標到本行最開頭的字符處. $ 移動光標到本行結尾處. H 移動光標到屏幕的首行. M 移動光標到屏幕的中間一行. L 移動光標到屏幕的尾行. gg 移動光標到文檔首行. G 移動光標到文檔尾行. c-f (即 ctrl 鍵與 f 鍵一同按下) 本命令即 page down. c-b (即 ctrl 鍵與 b 鍵一同按下, 後同) 本命令即 page up. '' 此命令至關有用, 它移動光標到上一個標記處, 好比用 gd, * 等查 找到某個單詞後, 再輸入此命令則回到上次停留的位置. '. 此命令至關好使, 它移動光標到上一次的修改行. `. 此命令至關強大, 它移動光標到上一次的修改點.
3.拷貝, 刪除與粘貼
在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標移動命令
結合的, 看幾個例子就可以明白了.
yw 表示拷貝從當前光標到光標所在單詞結尾的內容. dw 表示刪除從當前光標到光標所在單詞結尾的內容. y0 表示拷貝從當前光標到光標所在行首的內容. d0 表示刪除從當前光標到光標所在行首的內容. y$ 表示拷貝從當前光標到光標所在行尾的內容. d$ 表示刪除從當前光標到光標所在行尾的內容. yfa 表示拷貝從當前光標到光標後面的第一個a字符之間的內容. dfa 表示刪除從當前光標到光標後面的第一個a字符之間的內容. 特殊地: yy 表示拷貝光標所在行. dd 表示刪除光標所在行. D表示刪除從當前光標到光標所在行尾的內容.
關於拷貝, 刪除和粘貼的複雜用法與寄存器有關, 能夠自行查詢.
4.數字與命令
在 vi 中數字與命令結合每每表示重複進行此命令, 若在擴展模式的開頭出現則表示行
號定位. 如:
5fx 表示查找光標後第 5 個 x 字符. 5w(e) 移動光標到下五個單詞. 5yy 表示拷貝光標如下 5 行. 5dd 表示刪除光標如下 5 行. y2fa 表示拷貝從當前光標到光標後面的第二個a字符之間的內容. :12,24y 表示拷貝第12行到第24行之間的內容. :12,y 表示拷貝第12行到光標所在行之間的內容. :,24y 表示拷貝光標所在行到第24行之間的內容. 刪除相似.
5.快速輸入字符
在 vi 中, 不要求你輸入每個字符, 能夠有不少種方法快速輸入一些字符.
使用 linux/unix 的同窗必定有一個經驗, 在命令行下輸入命令時敲入頭幾個字符再按
TAB 系統就會自動將剩下的字符補齊, 假若有多個匹配則會打印出來. 這就是著名的命令
補齊(其實windows中也有文件名補齊功能). vi 中有許多的字符串補齊命令, 很是方便.
c-p(c-n) 在編輯模式中, 輸入幾個字符後再輸入此命令則 vi 開始向上(下)搜 索開頭與其匹配的單詞並補齊, 不斷輸入此命令則循環查找. 此命令 會在全部在這個 vim 程序中打開的文件中進行匹配. c-x-l 在編輯模式中, 此命令快速補齊整行內容, 可是僅在本窗口中出現的 文檔中進行匹配. c-x-f 在編輯模式中, 這個命令表示補齊文件名. 如輸入: /usr/local/tom 後再輸入此命令則它會自動匹配出: /usr/local/tomcat/ abbr 即縮寫. 這是一個宏操做, 能夠在編輯模式中用一個縮寫代替另外一個 字符串. 好比編寫java文件的經常輸入 System.out.println, 這很 是麻煩, 因此應該用縮寫來減小敲字. 能夠這麼作: :abbr sprt System.out.println 之後在輸入sprt後再輸入其餘非字母符號, 它就會自動擴展爲System. out.println
6.替換
替換是 vi 的強項, 由於能夠用正規表達式來匹配字符串.如下提供幾個例子.
:s/aa/bb/g 將光標所在行出現的全部包含 aa 的字符串中的 aa 替換爲 bb :s/\/bb/g 將光標所在行出現的全部 aa 替換爲 bb, 僅替換 aa 這個單詞 :%s/aa/bb/g 將文檔中出現的全部包含 aa 的字符串中的 aa 替換爲 bb :12,23s/aa/bb/g 將從12行到23行中出現的全部包含 aa 的字符串中的 aa 替換爲 bb :12,23s/^/#/ 將從12行到23行的行首加入 # 字符 :%s= *$== 將全部行尾多餘的空格刪除 :g/^\s*$/d 將全部不包含字符(空格也不包含)的空行刪除.
7.多文件編輯
在一個 vim 程序中打開不少文件進行編輯是挺方便的.
:sp(:vsp) 文件名 vim 將分割出一個橫(縱)向窗口, 並在該窗口中打開新文件. 從 vim6.0 開始, 文件名能夠是一個目錄的名稱, 這樣, vim 會 把該目錄打開並顯示文件列表, 在文件名上按回車則在本窗口打 開該文件, 若輸入 O 則在新窗口中打開該文件, 輸入 ? 能夠看 到幫助信息. :e 文件名vim 將在原窗口中打開新的文件, 若舊文件編輯過, 會要求保存. c-w-wvim 分割了好幾個窗口怎麼辦? 輸入此命令能夠將光標循環定位 到各個窗口之中. :ls 此命令查看本 vim 程序已經打開了多少個文件, 在屏幕的最下方 會顯示出以下數據: 1%a "usevim.html" 行 162 2#"xxxxxx.html" 行 0 其中: 1表示打開的文件序號, 這個序號頗有用處. %a 表示文件代號, % 表示當前編輯的文件, #表示上次編輯的文件 "usevim.html"表示文件名. 行 162 表示光標位置. :b 序號(代號)此命令將指定序號(代號)的文件在本窗口打開, 其中的序號(代號) 就是用 :ls 命令看到的. :set diff 此命令用於比較兩個文件, 能夠用 :vsp filename命令打開另外一個文件, 而後在每一個文件窗口中輸入此命令,就能看 到效果了.
8.宏替換
vi 不只能夠用 abbr 來替換文字, 也能夠進行命令的宏定義. 有些命令輸起來很費勁,
所以我把它們定義到 - 上, 這樣就很方便了.這些配置能夠預先寫到 ~/.vimrc
(windows 下爲 $VIM/_vimrc) 中, 寫進去的時候不用寫前面的冒號.
:nmap :nohls 取消被搜索字串的高亮 :nmap w 命令模式下轉移光標到不一樣窗口 :imap 輸入模式下運行 :nmap :%s= *$== 刪除全部行尾多餘的空格. :imap同上 :java 中: (注, 這裏爲何說 java 中, 由於如下定義對其餘文件格式不起做用, 下文 會說到如何實現這一點) :nmap :comp javac:mak -d . % 此命令用 javac 編譯 java 文件, 它會自動將光標定位到出錯點. 不過這須要定 義一個 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 裏面只有兩行字: setlocal makeprg=javac setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%# :nmap :comp ant:mak 此命令用 ant 編譯 java 文件, 它會自動將光標定位到出錯點. 通常來講, 安裝 vim 後已經有了compiler/ant.vim文件, 所以這個命令能夠直接使用. 可是須要 在當前目錄下有 build.xml 文件, 固然還必須安裝 ant 才行. :nmap :cl 此命令用於查看全部的編譯錯誤. :imap :nmap :cc 此命令用於查看當前的編譯錯誤. :imap :nmap :cn 此命令用於跳到下一個出錯位置. :imap :nmap :cp 此命令用於跳到上一個出錯位置. :imap :nmap :JavaBrowser 此命令用於在窗口左部分割出一個新窗口, 裏面的內容是 java 的資源樹, 包括 本文件中出現的類, 類的成員變量及成員方法, 就好像 JCreator 表現的那樣. 在這個窗口中輸入 ? 會看到幫助. 嘿嘿, 很好用, 不過須要 ctags 支持. :imap
9.TAB
TAB 就是製表符, 單獨拿出來作一節是由於這個東西確實頗有用. > 輸入此命令則光標所在行向右移動一個 tab. 5>> 輸入此命令則光標後 5 行向右移動一個 tab. :12,24> 此命令將12行到14行的數據都向右移動一個 tab. :12,24>> 此命令將12行到14行的數據都向右移動兩個 tab. 那麼如何定義 tab 的大小呢? 有人願意使用 8 個空格位, 有人用4個, 有的用2個. 有的人但願 tab 徹底用空格代替, 也有的人但願 tab 就是 tab. 不要緊, vim 能 幫助你.如下的設置通常也都先寫入配置文件中, 省得老敲. :set shiftwidth=4 設置自動縮進 4 個空格, 固然要設自動縮進先. :set sts=4 即設置 softtabstop 爲 4. 輸入 tab 後就跳了 4 格. :set tabstop=4 實際的 tab 即爲 4 個空格, 而不是缺省的 8 個. :set expandtab 在輸入 tab 後, vim 用恰當的空格來填充這個 tab.
10.autocmd
這個命令十分的強大, 能夠用這個命令實現對不一樣的文件格式應用不一樣的配置; 能夠
在新建文件時自動添加上版權聲明等等. 這些命令通常定義在 ~/.vimrc 這樣的配置文件
裏面. 因爲他很強大, 因此我不能給出很具體的說明, 只能舉幾個例子, 詳細的請看幫助.
:autocmd!刪除全部以前的自動命令. autocmd FileType java source ~/.vim/files/java.vim autocmd FileType java source ~/.vim/files/jcommenter.vim 以上兩條命令讓我在打開 java 文件時才應用後面提到的兩個配置文件. autocmd BufNewFile *.java 0r ~/.vim/files/skeletons/java.skel 以上這條命令讓我在新建 java 文件時自動加入 java.skel 文件的內容. autocmd BufNewFile *.java normal gnp 以上這條命令讓我在新建 java 文件時自動運行 gnp 命令, 這個命令進行一些特殊化 處理, 好比將新 java 文件中的 __date__ 替換成今天的日期什麼的.
11.經常使用腳本
在 vim.sf.net 你能夠發現不少腳本(script), 這些腳本經常有讓你意想不到的做用.
我經常使用的有:
jcommenter.vim 自動加入 javadoc 風格的註釋. JBrowser.vim 類資源瀏覽. C, C++ 等能夠用 Tlist 還有許多有用的, 好比 checkstyle.vim 能夠檢驗你的編程風格, jad.vim 能夠直接 反編譯 .class 文件等等.
12.經常使用配置
在~/.vimrc 配置文件中你經常須要一些個性化配置. 好比上面寫的一些宏定義, 一些
autocmd 定義等等. 好比:
set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc 這樣在vim中打開文件時, 按 tab 鍵補齊文件名時它會忽略上述文件. set nu 顯示行號 set ai 設置自動縮進 map Y y$ 讓 Y 和 D 同樣, 要否則 Y 的本意和 yy 同樣.
13.其餘
還有許多有意思的命令, 記錄在這裏省得忘記.
. 重複上次編輯命令. :g/^/exec "s/^/".strpart(line(".")." ", 0, 4) 在行首插入行號 :runtime! syntax/2html.vim 轉換 txt 成 html, 會按照你的顏色配置來轉
Ctags工具是用來遍歷源代碼文件生成tags文件,這些tags文件能被編輯器或其它工具用來快速查找定位源代碼中的符號(tag/symbol),如變量名,函數名等。好比,tags文件就是Taglist和OmniCppComplete工做的基礎。
1.首先要在你的 ~/.vimrc 文件中增長下面幾句話:
syntax enable syntax on
2.再從新啓動vim, 並打開一個c程序文件, 是否是以爲眼前忽然色彩繽紛了起來。
1.進入咱們的項目代碼根目錄,執行如下命令:(咱們也能夠進入代碼根目錄後,打開Vim,按下Ctrl-F12快捷鍵自動生成tags文件。)
2.命令執行完後,會在源代碼目錄生成tags文件。Vim默認會自動讀取當前目錄下的tags文件,因此不須要修改~/.vimrc文件。
如下兩組快捷鍵是最經常使用的經常使用命令
Ctrl-] 跳轉到光標所在符號的定義。 Ctrl-t 回到上次跳轉前的位置。
經過命令man ctags或在Vim命令行下運行help ctags查詢。
help ctags幫助(或者man ctags)
3.向vim註冊索引文件tags的路徑
4.打開文件的最後添加以下內容
"--ctags setting-- " 按下F5從新生成tag文件,並更新taglist map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR> imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR> set tags=tags set tags+=./tags "add current directory's generated tags file set tags+=~/arm/linux-2.6.24.7/tags "add new tags file(剛剛生成tags的路徑,在ctags -R 生成tags文件後,不要將tags移動到別的目錄,不然ctrl+]時,會提示找不到源碼文件) set tags+=./tags表示在當前工做目錄下搜索tags文件 set tags+=~/arm/linux-2.6.24.7/tags表示在搜尋tags文件的時候,也要搜尋~/arm/linux-2.6.24.7/文件夾下的tags文件。
5.保存並退出vi。這樣,你就能夠用vim在任意地方查看有關Linux的函數原形
6.tag命令用法:
經常使用命令
(在當前窗口顯示標籤) Ctrl+] 跳到當前光標下單詞的標籤 Ctrl+O 返回上一個標籤 Ctrl+T 返回上一個標籤 :tag TagName 跳到TagName標籤 (不但願在當前窗口顯示標籤) :stag TagName 新窗口顯示TagName標籤,光標跳到標籤處 Ctrl+W + ] 新窗口顯示當前光標下單詞的標籤,光標跳到標籤處 當一個標籤有多個匹配項時,":tags" 命令會跳轉到第一處。若是在當前文件中存在匹配,那它將會被首先使用。 (在各匹配的標籤間移動命令) :tfirst 到第一個匹配 :[count]tprevious 向前 [count] 個匹配 :[count]tnext 向後 [count] 個匹配 :tlast 到最後一個匹配 (如下命令選擇要跳轉到哪個) :tselect TagName (在預覽窗口顯示標籤) :ptag TagName 預覽窗口顯示TagName標籤,光標跳到標籤處 Ctrl+W + } 預覽窗口顯示當前光標下單詞的標籤,光標跳到標籤處 :pclose 關閉預覽窗口 :pedit file.h 在預覽窗口中編輯文件file.h(在編輯頭文件時頗有用) :psearch atoi 查找當前文件和任何包含文件中的單詞並在預覽窗口中顯示匹配,在使用沒有標籤文件的庫函數時十分有用。
1.用vi在任意目錄寫一個Test.c文件
2.寫好後末行模式輸入w保存好(不要退出vi),按Esc回到指令模式,把光標停留在printf上。而後按 Ctrl+W + ],vi會自動跳到Linux系統函數printf()處,這時咱們能查看printf()的原形。
3.查看完了,按Ctrl+o(回到上一個標籤) 就回到原來的地方。
1.系統中已有的vim-scripts中包含的插件及其狀態
1.安裝OmniCppComplete
2.配置OmniCppComplete
"-- omnicppcomplete setting -- " 按下F3自動補全代碼,注意該映射語句後不能有其餘字符,包括tab;不然按下F3會自動補全一些亂碼 imap <F3> <C-X><C-O> " 按下F2根據頭文件內關鍵字補全 imap <F2> <C-X><C-I> set completeopt=menu,menuone " 關掉智能補全時的預覽窗口 let OmniCpp_MayCompleteDot = 1 " autocomplete with . let OmniCpp_MayCompleteArrow = 1 " autocomplete with -> let OmniCpp_MayCompleteScope = 1 " autocomplete with :: let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert) let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window let OmniCpp_GlobalScopeSearch=1 " enable the global scope search let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members "let OmniCpp_DefaultNamespaces=["std"] let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column let OmniCpp_ShowAccess=1
3.使用下列命令生成tags文件,就能夠與OmniCppComplete配合運做:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --c++-kinds=+p :爲C++文件增長函數原型的標籤 --fields=+iaS :在標籤文件中加入繼承信息(i)、類成員的訪問控制信息(a)、以及函數的指紋(S) --extra=+q :爲標籤增長類修飾符。注意,若是沒有此選項,將不能對類成員補全
4.爲了測試自動補全功能,咱們先下載C++一份C++標準庫的源代碼
5.在/usr/include/c++下就能夠找到標準庫的頭文件了
在此文件夾下生成能與OmniCppComplete配合運做的tags文件
6.在vim的配置文件中以下內容,而後在編程的時候就能夠使用自動補全功能了
用vi打開前面的Test.c文件,在printf("Hello World!\n")下一行中,輸入pri,而後按下Ctrl+X Ctrl+O
當自動補全下拉窗口彈出後,一些可用的快捷鍵:
Ctrl+P 向前切換成員 Ctrl+N 向後切換成員 Ctrl+E 表示退出下拉窗口, 並退回到原來錄入的文字 Ctrl+Y 表示退出下拉窗口, 並接受當前選項 其餘補全方式: Ctrl+X Ctrl+L 整行補全 Ctrl+X Ctrl+N 根據當前文件裏關鍵字補全 Ctrl+X Ctrl+K 根據字典補全 Ctrl+X Ctrl+T 根據同義詞字典補全 Ctrl+X Ctrl+I 根據頭文件內關鍵字補全 Ctrl+X Ctrl+] 根據標籤補全 Ctrl+X Ctrl+F 補全文件名 Ctrl+X Ctrl+D 補全宏定義 Ctrl+X Ctrl+V 補全vim命令 Ctrl+X Ctrl+U 用戶自定義補全方式 Ctrl+X Ctrl+S 拼寫建議 幫助文檔:help omnicppcomplete
1.echofunc能夠在命令行中提示當前輸入函數的原型。
Taglist用於列出了當前文件中的全部標籤(宏, 全局變量, 函數名等)
1.安裝Taglist
2.配置Taglist
"-- Taglist setting -- let Tlist_Ctags_Cmd='ctags' "由於咱們放在環境變量裏,因此能夠直接執行 let Tlist_Use_Right_Window=1 "讓窗口顯示在右邊,0的話就是顯示在左邊 let Tlist_Show_One_File=0 "讓taglist能夠同時展現多個文件的函數列表 let Tlist_File_Fold_Auto_Close=1 "非當前文件,函數列表摺疊隱藏 let Tlist_Exit_OnlyWindow=1 "當taglist是最後一個分割窗口時,自動推出vim "是否一直處理tags.1:處理;0:不處理 let Tlist_Process_File_Always=1 "實時更新tags let Tlist_Inc_Winwidth=0
3.進入vim後用命令":Tlist"打開/關閉taglist窗口。
幫助文檔:help taglist.txt
WinManager用於管理文件瀏覽器和緩衝區(buffer)
1.安裝WinManager
2.配置WinManager
"-- WinManager setting -- let g:winManagerWindowLayout='FileExplorer|TagList' " 設置咱們要管理的插件 "let g:persistentBehaviour=0 " 若是全部編輯文件都關閉了,退出vim nmap wm :WMToggle<cr>
3.經常使用命令
:WMToggle 打開/關閉WinManage,不過咱們在配置文件.vimrc中作了快捷鍵映射,因此直接按wm就能夠打開/關閉WinManage 文件瀏覽器命令(在文件瀏覽器窗口中使用) <enter>或雙擊 若是光標下是目錄, 則進入該目錄; 若是光標下文件, 則打開該文件 <tab> 若是光標下是目錄, 則進入該目錄; 若是光標下文件, 則在新窗口打開該文件 <F5> 刷新列表 - 返回上一層目錄 c 使瀏覽目錄成爲vim當前工做目錄 d 建立目錄 D 刪除當前光標下的目錄或文件 i 切換顯示方式 R 文件或目錄重命名 s 選擇排序方式 r 反向排序列表 x 定製瀏覽方式, 使用你指定的程序打開該文件 winmanager幫助文檔:help winmanager netrw幫助文檔:help netrw
MiniBufferExplorer用於瀏覽和管理buffer,若是隻打開一個文件,是不會顯示在屏幕上的,而打開多個文件以後,會自動出如今屏幕上。
vim也有自帶的buffer管理工具,不過只有:ls, :bnext, :bdelete 等的命令
Vim 窗口"。一個屏幕包含一個或多個窗口,被狀態行和屏幕底部的命令行分割。
1.安裝MiniBufferExplorer
2.配置MiniBufferExplorer
" -- MiniBufferExplorer -- let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,能夠切換到當前窗口的上下左右窗口 let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭頭,能夠切換到當前窗口的上下左右窗口 let g:miniBufExplMapCTabSwitchBufs = 1 " 啓用如下兩個功能:Ctrl+tab移到下一個buffer並在當前窗口打開;Ctrl+Shift+tab移到上一個buffer並在當前窗口打開;ubuntu好像不支持 "let g:miniBufExplMapCTabSwitchWindows = 1 " 啓用如下兩個功能:Ctrl+tab移到下一個窗口;Ctrl+Shift+tab移到上一個窗口;ubuntu好像不支持 let g:miniBufExplModSelTarget = 1 " 不要在不可編輯內容的窗口(如TagList窗口)中打開選中的buffer
3.經常使用命令
<Tab> 移到上一個buffer <Shift-Tab> 移到下一個buffer <Enter> 打開光標所在的buffer d 刪除光標所在的buffer
摺疊用於把緩衝區內某一範圍內的文本行顯示爲屏幕上的一行。
摺疊的好處是,經過把多行的一節摺疊成帶有摺疊提示的一行,會使你更好地瞭解對文本
的宏觀結構。
vim提供如下6種方法來選定摺疊方式:
manual 手工定義摺疊
indent 更多的縮進表示更高級別的摺疊
expr 用表達式來定義摺疊
syntax 用語法高亮來定義摺疊
diff 對沒有更改的文本進行摺疊
marker 對文中的標誌摺疊
摺疊級別foldlevel
'foldlevel' 是個數值選項:數字越大則打開的摺疊更多。
當 'foldlevel' 爲 0 時,全部的摺疊關閉。
當 'foldlevel' 爲正數時,一些摺疊關閉。
當 'foldlevel' 很大時,全部的摺疊打開。
摺疊欄foldcolumn
'foldcolumn' 是個數字,它設定了在窗口的邊上表示摺疊的欄的寬度。當爲0時,沒有摺疊欄。最大是12。
一個打開的摺疊由一欄來表示,頂端是 '-',其下方是 '|'。這欄在摺疊結束的地方結束。當摺疊嵌套時,嵌套的摺疊出如今被包含的摺疊右方一個字符位置。
一個關閉的摺疊由 '+' 表示。
1.在vim配置文件/home/user/.vimrc中加入以下的配置
"--fold setting-- set foldmethod=syntax " 用語法高亮來定義摺疊 set foldlevel=100 " 啓動vim時不要自動摺疊代碼 set foldcolumn=5 " 設置摺疊欄寬度
2.經常使用命令
za 打開/關閉在光標下的摺疊 zA 循環地打開/關閉光標下的摺疊 zo 打開 (open) 在光標下的摺疊 zO 循環打開 (Open) 光標下的摺疊 zc 關閉 (close) 在光標下的摺疊 zC 循環關閉 (Close) 在光標下的全部摺疊 zM 關閉全部摺疊 zR 打開全部的摺疊 幫助文檔 :help usr_28.txt :help fold.txt
1.安裝Project
2.Project目錄樹能夠經過下面的步驟生成
1)打開vim在命令模式下輸入 :Project,在屏幕的最左邊就會出現一個project框。不過由於沒有初始化暫時是空的 2)在命令模式下(不是插入模式)輸入\C (大寫的C),會出現下面這些信息: (可是我敲擊「\C」以後變成了插入模式) Enter the Name of the Entry: xxxx (輸入項目名稱) Enter the Absolute Directory to Load: /xxx/xxx/xxx (輸入項目根目錄的絕對路徑) Enter the CD parameter: . (「.」爲當前目錄)或者和項目根目錄一致 Enter the File Filter: *.* (符合條件的源文件,能夠是*.cpp/*.h等)
1.在vim配置文件/home/user/.vimrc中加入以下的配置
"-- QuickFix setting -- " 按下F6,執行make clean map <F6> :make clean<CR><CR><CR> " 按下F7,執行make編譯程序,並打開quickfix窗口,顯示編譯信息 map <F7> :make<CR><CR><CR> :copen<CR><CR> " 按下F8,光標移到上一個錯誤所在的行 map <F8> :cp<CR> " 按下F9,光標移到下一個錯誤所在的行 map <F9> :cn<CR> " 以上的映射是使上面的快捷鍵在插入模式下也能用 imap <F6> <ESC>:make clean<CR><CR><CR> imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR> imap <F8> <ESC>:cp<CR> imap <F9> <ESC>:cn<CR>
2.經常使用命令
幫助文檔 :help usr_30 :help quickfix 下面的命令運行 "make" (包括你所給出的參數) 程序並捕捉其運行結果: > :make {arguments} 若是編譯時出現錯誤,按 <Enter>,回到vim界面,看不到出錯信息了!這時,能夠運行如下命令 :cw[indow] 打開quickfix窗口來查看出錯信息,它會自動跳到第一處出錯的地方。而後,你能夠雙擊出錯某一條出錯信 息,vim就會自動跳轉到相應的出錯位置 :cn[ext] 光標移到下一個錯誤所在的行 :cp[revious] 光標移到上一個錯誤所在的行 :cfirst 到第一處錯誤 :clast 到最後一處錯誤 :cc 空間不夠時,Vim 會縮短出錯信息。若是你想查看詳細信息,能夠使用此命令 :cl[ist] 列出全部出錯信息的概覽(只有那些含有文件名或行數的錯誤信息會被顯示,須要查看那些並不含文件名或行數的信息可用「:cl[ist]!」命令)
1.安裝Cscope
2.在vim配置文件/home/user/.vimrc中加入以下的配置:
"-- Cscope setting -- if has("cscope") set csprg=/usr/bin/cscope " 指定用來執行cscope的命令 set csto=0 " 設置cstag命令查找次序:0先找cscope數據庫再找標籤文件;1先找標籤文件再找cscope 數據庫 set cst " 同時搜索cscope數據庫和標籤文件 set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix窗口來顯示cscope查找結果 set nocsverb if filereadable("cscope.out") " 若當前目錄下存在cscope數據庫,添加該數據庫到vim cs add cscope.out elseif $CSCOPE_DB != "" " 不然只要環境變量CSCOPE_DB不爲空,則添加其指定的數據庫到vim cs add $CSCOPE_DB endif set csverb endif map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR> imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR> " 將:cs find c等Cscope查找命令映射爲<C-_>c等快捷鍵(按法是先按Ctrl+Shift+-, 而後很快再按下 c) nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><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> :copen<CR><CR>
cs find c|d|e|f|g|i|s|t name 0 或 s 查找這個 C 符號(能夠跳過註釋) 1 或 g 查找這個定義 2 或 d 查找這個函數調用的函數 3 或 c 查找調用過這個函數的函數 4 或 t 查找這個字符串 6 或 e 查找這個 egrep 模式 7 或 f 查找這個文件 8 或 i 查找包含這個文件的文件
% 跳轉到配對的括號去 [[ 跳轉到當前或者上一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨佔一行) ][ 跳轉到當前代碼塊(函數定義、類定義等)的結尾去(但要求代碼塊中'{'必須單獨佔一行) ]] 跳轉到下一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨佔一行) [/ 跳到註釋開頭(只對/* */註釋有效) ]/ 跳到註釋結尾(只對/* */註釋有效) gD 跳轉到當前文件內標識符首次出現的位置,可用於跳轉到所有變量的定義處;查找局部變量時,要是多 個函數中定義了該局部變量,使用gD進行查找,找到的變量定義可能不是你須要的 gd 跳轉到當前函數內標識符首次出現的位置,可用於跳轉到局部變量的定義處 '' 跳轉到光標上次停靠的地方, 是兩個', 而不是一個" mx 設置書籤,x只能是a-z的26個字母 `x 跳轉到書籤處("`"是1左邊的鍵) > 增長縮進,"x>"表示增長如下x行的縮進 < 減小縮進,"x<"表示減小如下x行的縮進
看到vim手冊100頁,發現真心很強大,若是可以記清楚那些命令,應該說速度能夠提高的很快,至少,能夠到達腦子思考的速度,不會由於敲的很慢而減慢速度。原來鼠標也是一種落後了,可是記清楚那些命令不是一件容易的事情,只有不斷的使用,不斷的鞏固,才能夠熟練掌握。
經過此次實踐vim一共花費了兩週,前期看到實踐標準那些插件該作什麼,因而按照教程去嘗試,其實開始的時候也不知道本身作得對不對,就是在實踐中慢慢摸索。
雖然如今也不能說已經對VIM研究透徹,但經過安裝插件、修改配置,咱們瞭解了文字高亮、自動補全、函數原型等功能,同時也學會了是如何添加配置、如何實現功能、如何讓vim變得強大。
http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html
http://www.oschina.net/news/43167/130-essential-vim-commands