歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> vi編輯器的學習使用

vi編輯器的學習使用

日期:2017/2/28 11:25:30   编辑:關於Unix


vi編輯器是Unix的世界中一個相當強大的可視化編輯器,有人曾這樣的說過在世界上有三種人:一種是使用Vi的,另一種是使用是Emacs的,剩下的是第三種人。
由此可以看出Vi和Emacs的強大。在有關Linux的論壇中關於Vi和Emacs的論爭也是一直不斷的。現在看來這樣的論爭也實在是沒有辦法的,這兩個編輯器是同樣的強大,同樣有不同的人在支持。在個人看來就是同時喜歡這兩個的。然而他的這種強大也是要會付出一定的代價,他的學習和使用也是相當的復雜的,在學習的起點常常會面臨著一個巨大的學習困難。但是只要過了這樣的一段時間你就可以來體會Vi的強大了。
一 Vi的啟動與退出
在現在的Linux世界中還有一個發行版本被稱為是Vi的改進版本,所以被稱為是Vim,也就是Vi Improved的意思。在現在的一般的Linux的發行版本中常常是Vim的。要啟動Vi可以終端窗口輸入vi或是vim,這樣就可以終端窗口打開一個 Vi的編輯窗口。或者是輸入gvim,這樣就可以打開一個類似於gedit這樣的文本編輯器,他有一些菜單,但是大部分的功能仍是通過命令行的方式來完成的。在vi中有兩種模式:一是命令模式,一是編輯。命令模式是用來輸入命令行來完成工作的。而編輯模式是用來編輯文本的。在兩種模式中切換可以通過Esc 來完成。在我們完成了文本編輯以後可以這樣的來退出:
:q 這是退出的命令,如果你已經做過了改動,那麼就會提示錯誤。
:q! 這也是一個退出命令,與上一個不同的是,我已經做過了改動,但是我想放棄這些改動,從而用這樣的命令。
:w 這是文件寫入的命令,但是執行完這個命令後並沒有退出vi.
:wq 這個命令的意思是保存並退出
二 Vi的基本編輯命令
在啟動了Vi以後是在命令模式的,這是可以輸入i(insert)進入插入模式。這時會在Vi窗口的下端顯示出你這時的狀態。這時你就可以來輸入文本了。在這樣的情況下,你可以用Backspace來Delete來刪除一個字符。用方向鍵來控制光標。其實在知道了這樣的幾個命令後就可以用來編輯文檔了。但是這樣的幾個命令並不能保證你能高效的來完成你的工作。而事實上在命令模式下我們用鍵盤來移動光標而不用將手離開鍵盤去按方向鍵,這樣就可以大大的增強你的編輯速度。我們可以用h(left),j (down),k(up),l(right)這幾個鍵來移動光標。我們可以將光標放在一個字符上同時按下x鍵來刪除這個字符。我們可以將光標放在某一行同時按下dd,這樣就可以將這一行刪除。當然有的時候也許我們做了一些事情,不過我我們覺得以前的要更好一些,我們想要恢復到以前的狀態,在這樣的情況下我們可以u和U這兩個命令。u要撤銷上一次的修改,而U將是撤銷所記錄的所有的修改。而有的時候我們覺得現在的工作要好一些,我們希望撤銷剛才所做的撤銷工作,也就是我們要重做這些工作,這時我們可以使用CTRL_R命令來達到我們的目的。有時我們可以使用新增的命令,使用a和A來完成這樣的工作。a在當前光標所在的字符後面進入插入狀態,而A是在一行的末尾進入插入狀態。使用這兩個命令可以方便我們進行文本的插入操作。在vi的編輯模式中,是將回車換行看作新的一行的開始。有時我們希望新插入一行,這時可以使用o和O這兩個命令來完成。o是在文本的下面新增一行並進入插入模式,而O是在文本的上一行新增一行並進入插入模式。有了這些命令,現在的我們就可以比較方便的來完成我們的文本編輯工作了。但是有時候得到在線的幫助對於我們來說顯得更為重要,要得到 vi的幫助,可以在命令的模式下輸入:help,這樣就可以得到vi的在線幫助了。要想退出幫助,可以輸入退出命令,:q.為得到更明確的幫助,我們可以明確的指明我們所需要知道的內容。例如我們想知道x一些更詳細的內容我們可以輸入:help x.我們要想得到其他的幫助,我們就可以這樣來得到我們想要的幫助。在vi中可以使用數字和命令組合的方式得到新的命令,例如3h,這樣就可向左移動3個字符。同樣可以使用數字和其他的移動鍵進行組合來達到快速移到的目的。也可以是數字和其他的命令組合形成新的命令,例如3x就可一次刪除3個字符。為了我們更快速的掌握vi的使用,vi本身也提供了一個學習的教程,只要你能耐心的做下來,我想使用vi對你來說應不再是一件難事了。進入vi的學習教程,可以在終端輸入vitutor.這樣就可以進入vi的學習教程,為了得到更多的幫助信息,可以在vi的窗口內輸入:help tutor.這樣就會得到更多的關開Tutor的幫助信息的。
在上一節的學習中,我們只是學習一些使用vi進行文本編輯的基本的命令。有了這些的基本命令我們就可以完成一般的文本編輯任務。在這一節中我們要學習一些其他的一些編輯命令,這些命令將包括其他的一些光標移動命令,如何在一行中快速的查找我們想要的東西,其他的一些文本刪除和更改的命令,鍵盤宏和特殊字符的輸入。啊:)
在vi的編輯中,我們可以有多種的光標移動命令:
我們可以用w命令向前移動一個字符,用b命令向後移動一個字符。就像其他的vi命令一樣,我們也可以用數字來做前綴從而組成新的命令,來快速的移動。例如4w就是向前移動4個單詞,而5b則是向後移動5個單詞。而我們在編輯的過程中又如何來快速的移到一行的開始或是結尾處呢?在vi中$和^可以來完成這樣的工作。$可以使光標移到一行的結尾處,而^可以使光標移到一行的開始處。$命令可以和數字進行組合形成新的移動命令,而^也可以和數字進行組合,但是組合後組成的新的命令中數字卻不起任何的作用。
在我們的文本編輯中我們就會移動光標是我們經常要做的事情,但是我們很快就會發現查找我們要找的字符串也是我們經常要做的一件事。那麼如何在文本編輯中快速的查找到我們想要的字符呢?在vi的編輯命令有幾個這樣的小命令可以幫助我們來完成這樣的工作:f是向前搜索的命令。例如fx是向前搜索字母x.利用f向前搜索的命令我們也可以快速的移動到指定的位置。而F是向左搜索的命令,也就是向後搜索。例如Fx是向後搜索字母x。與f和F這兩個命令相類似的是t和T這兩個命令。t命令類似於f向前搜索命令,所不同的是t搜索到時並不是將光標停在目標字符上,而是停在目標字符的前一個字符上。和他相反的就是這個F命令。當然這幾個命令都可以和數字組合來形成新的命令來完成我們的工作。在搜索的工作過過程我們可以使用ESC來退出搜索而開始我們新的工作。
在我們的工作中常常要求我們移動到指定的行,那麼我們如何來做到這一點呢?我們當然可以使用數字和方向鍵組合來完成。雖然這種方式不夠快速,但是確實可以來實現。而在vi中提供了一個新的命令來完成,那就是G。例如3G可以使我們快速的移到第3行。而1G則可以使我們移到文章的最頂端,而G則是定位到文章的最後一行。那麼在vi的編輯中我們又如何來知道我們在第幾行呢?我們可以使用:set number來叫vi加上行號,這樣我們就可以很容易的知道我們所在的行號了,取消行號的命令為:set nonumber。那麼在沒有行號的文章中我們又如何來知道我們所處在的位置呢?我們可以使用ctrl+G命令來知道。這個命令可以清楚到告訴我們總共有多少行,而當前我們又在多少行,以及所占的百分比等信息。在我們進行編輯的過程中我們可以使用CTRL-U和CTRF-D來進行上下的翻頁。當然這樣的功能也可以通過功能鍵來實現。
在我們的文本編輯過程中另一件我們要常做的事情就是文本的刪除了。我們可以使用dd來刪除一行,我們還可以使用dw來刪除一個字符。刪除的命令操作d是一個相當靈活的命令,我們可以用他來進組合來完成工作。例如d3w則是一次刪除3個字符,而3dw則是指一次刪除一個字符,而這樣的操作進行3次,即總的是也是刪掉3個字符。而在d$則是刪除從當前位置到本行結束的所有字符.也d命令相類似是的c命令,這是一個更改的命令,所不同的是他在刪除一個字符的同時進入插入狀態,這樣我們就可以進行另外的文本操作了。另一個有興趣的命令則是.命令。.命令可以使vi重復執行剛才執行的命令。
在我們進行文本編輯的時候,有時要用到合並行的命令,也就是將幾行合並為一行,這時我們可以使用J命令。這個命令可以將本行和下一行合並為一行。當然,就像大多數的Linux命令一樣,我們可以使用數字來使幾行合並為一行。例如3J就可以將當前行下的三行(包括當前行)合並為一行。那麼我們又如何時來做替換文本的工作呢?我們可以使用r的命令。例如rx就可以當前光標下的字符替換為x。我們當然也是可以用數字來組合以形成新的命令來進行工作,例如5rd就是將當前光標以後的5個字符替換為d。有時我們要進行大小寫的轉換,這時我們就可以用~命令。這個命令可以實現在大小寫的轉換。
在vi中一個比較有趣的東西便是鍵盤宏了,這個可以使我們實現多個命令的記錄,有時這樣可以高效的完成我們的工作。例如我們現在的文本是 stdio.h stdlib.h math.h 但是我們都知道在C語言的編輯中我們所需要的是 #include #include #include 如何來做到?如果你有足夠的耐心可以一句一句的來加,但是在這裡我們可以使用鍵盤宏來完成我們的工作,這樣我們就可以體會到他的強大之處了。開始輸入qa.其中的a是一個宏的名字,我們可以用任何我們喜歡的字母來代替,q是開始錄制宏的命令標志。這樣我們就可以開始我們的宏輸入了: ^ 移到一行的開始 i#include 在一行的開始插入#include 在結束處加入> j 移到下一行 q 結束宏的錄制這樣當我們要使用宏時就可以輸入@a,這樣就可以執行這個宏了。我們還可以在執行命令前加上數字來告訴vi執行幾次。這樣我們就可以快速的完成我們的一些工作了。在vi的編輯中我們還可以輸入一些由平常的鍵盤不可以輸入的字符,有關這樣的信息我們可以輸入:help digraphs得到更多的信息。 (注:在vi中我們通常所指的一行是以回車做為標志的,即只有輸入回車才算是一行的結束,從而開始新的一行)附:打印特殊字符現在還弄不懂,看了那書也還是弄不出來,希望朋友們能把成功的做法分享一下
vi學習使用筆記之三
我們在使用vi進行編輯文本的時候常作的一件事就是要在所編輯的文本中進行查找。如何快速的查找到我們想要的東西呢?在vi中我們可以使用f,F和t,T 來進行向前或是向後查找。
除了這些命令,我們還可以使用其他的一些命令來快速高效的完成我們的工作。在vi的編輯操作中,我們可以使用/string命令來查找字符串string,打下回車後,光標就能跳到正確的地方。在這個命令中/後的字符是我們想要查打的字符,而回車鍵則表明了命令的結束。
但是有時我們所想要查找的字符具有特殊的意義,例如.*[]^%?$~等等,那麼我們又如何來查找這些具有特殊意義的字符呢?這時我們可以使用放在所要查找的字符前,這樣再使用/來查找就可以正確的查找了。
有時我們在進行查找操作時想要查找的內容並不僅在一處,我們想要做的是在整個文章中進行查找。那麼我們又如何來進行我們剛才的查找命令呢?我們可以這樣的來做:/。這樣我們就可以繼續我們剛才的查找操作了。在這裡回車是命令結束的標志。我們還可以使用n命令來繼續剛才的查找命令。這兩個命令都能達到同樣的效果,但是顯然用n可以有更少的鍵盤操作。偷懶嘛:)
在vi中他還具有記錄查找命令歷史的作用,這樣我們就不用輸入剛才輸入的查找命令了,而是只需要在他所記錄的查找命令進行一下查找就可以了。例如你剛才做過的三次查找分別是:/one,/two,/three.而現在輸入/,然後按方向鍵的上或是下我們就看到剛才查找的內容顯示在vi的下面,這時只要打下回車我們就會找到我們要找的內容了。當然在vi中還在一些其他的查找選項,例如我們可選擇高亮的顯示查找的文本,命令為::set hlsearch,關閉高亮顯示的命令為::set nohlsearch.如果也想同時關掉剛才高亮顯示的結果,可以用這樣的命令::nohlsearch。在我們進行查找的選項中,我們還可以有這樣的命令::set incsearch。在我們打開這個選項以後,我們在進行查找時就會顯示出不斷匹配的過程。例如你想查找的內容是include,在打開這個選項後你可以輸入/i,光標定位在i上,再繼續輸入n光標定位在in上,如此直到查打到我們所要求的。關閉這個選項的命令為::set noincsearch。一般來說我們在進行查找時總是在向前查找,那麼又如何來向後查找呢?我們可以使用?命令。這個命令就是向後查找的命令。而還有一個命令N是逆向查找的命令,他可以實現立即反向查找。(注:在查找的時候我們還可以用一些其他的表達式來進行查找,例如/^string是在開頭進行查找,而/string$是在一行的末尾進行查找。不過看書我的理解是這樣的,不過總是試驗不成。而/c.m則是查找所有第一個字母為c,而第三個字母為m的字串,由此可以實現一些查找的匹配)
我想我們在接觸了vi以前一定會用一些其他的編輯器,在那些的編輯器裡復制,剪切和粘貼都是最平常的操作,而在vi中這些操作也是同樣的存在的。在vi編輯器有一個注冊的概念(concept of register),正是這個概念使我們可以時行多次的剪切和粘貼等的操作。在一般的編輯器中我們被限制只有一個剪切板可以用,而在vi中我們最多時可以有26個剪切板可以來使用,這樣就會大大的提高我們的完成工作的效率。而在vi中更是有一個相當強大的功能那就是他可以同時處理多個文件。如此強大的功能我們又來如何的操作呢?
我想我們在接觸了vi以前一定會用一些其他的編輯器,在那些的編輯器裡復制,剪切和粘貼都是最平常的操作,而在vi中這些操作也是同樣的存在的。在vi編輯器有一個注冊的概念(concept of register),正是這個概念使我們可以時行多次的剪切和粘貼等的操作。在一般的編輯器中我們被限制只有一個剪切板可以用,而在vi中我們最多時可以有26個剪切板可以來使用,這樣就會大大的提高我們的完成工作的效率。而在vi中更是有一個相當強大的功能那就是他可以同時處理多個文件。如此強大的功能我們又來如何的操作呢?在vi的編輯中我們可以使用d或是x來刪除文本,但是經過這樣的操作所刪除掉的文本並沒有被vi所丟棄,而是被保存起來。我們可以使用p命令來粘貼剛剛所刪掉的內容。下面我們可以來試一下看一下他是如何工作的。我們可以在vi中隨意的輸入幾行,然後我們移動到其中的一行,用dd命令來刪掉其中的一行,這時我們就不會再在vi中看見他。如何叫他再回來?我們可以將光標移到任意的地方,然後用p命令,我們就會看到剛才被刪除掉的內容又回來了。同樣我們使用x命令來刪除的東西也可以這樣的粘貼回來。所不同的就是我們用dd來刪除一行再用p命令時是在當前光標的下一行粘貼,而刪除一個單詞再用p命令來粘貼時是在當光標處粘貼。有了這樣的命令有時我們就可以來處理我們輸入錯誤的單詞了。例如我們不小心將the輸入成了teh,這時我們可以將光標移到e的位置,用x命令刪掉,再用p命令粘貼回來,這時我們就會發現現在的輸入正是我們想要的輸入了。p命令可以在一個文件中使用幾次,每一次都可以將剛刪除的內容重新粘貼在我們所希望的地方。當然這個命令也可以使用數字做前綴來明確的指出所要執行的次數。在使用vi進行文本編輯的過程中我們還可以對某一行進行標記,做法為我們將光標移到某一行,用命令ma來進行標記。在這裡m是標記的命令,a是我們對這一行所做的標記的名稱,當然我們也可以使用其他的標記名稱,必竟我們是有26個字母可以用的嘛:)。在做了這樣的標記以後我們可以快速的移到被標記的地方,‘a就可以使我們快速的移到剛才我們所做標記的地方。這裡’是單引號,這時我們就會移到被做標記那一行的行首。我們也可以使用`a來移到我們所做標記的地方,這裡`是反引號,也就是數字鍵1左邊的那一個,不要弄錯了噢:),這時我們就會移到所做標記時光標所在的位置,可以說是更精確啊。這也是這兩個命令的不同之處。在進行文本編輯時我們可以列出當前所做的所有的標記。命令為 ::marks。這時vi就會列出當前的所有的標記。當然如果我們將做了標記的那一行刪除的話所做的標記也就不存了。我們用標記不僅可以快速的移到做了標記的行,而且還可以用標記來刪除掉一行,例如我們在某一行用ma做了標記,然後我們移到這一行的底部,這樣我們就可以用在d‘a來刪掉這一行。可以說這也是標記命令提供給我們的方便吧。在vi中還有一個命令可以提供復制的操作,那就是y命令。yy命令可以復制一行,然後我們可以用p命令來粘貼。這時我們也可用標記命令來組合使用,我們可以在一行用ma標記此行,然後將光標移到這一行的底部,用y’a命令就可以來復制這一行了。然後到我們所希望的地方用p命令來粘貼。我們也可以使用Y命令來復制一行,或是用數字做前綴來明確的指明復制幾行,然後用p命令粘貼到我們所希望的地方。在vi中還有一個比較有趣的命令便是!命令。這個命令告訴vi編輯器我們要來運行一個系統命令,這時vi就會將以後的輸入做為一個命令來運行,運行的結果也就是輸出將替代當前光標所在的行的內容。例如我們在 Linux中知道sort是一個排序的命令,他是將一個文件或是一些輸入進行排序後輸出到屏幕或是其他的文件。那麼我們想對vi中的內容進行排序來如何做呢?這時我們可以將光標放在文本的開頭的一行,輸入!10G,這時vi就知道要到10行,也就是我們要操作的內容是第1行到第10行,這時在vi的下端就會顯示出!,這時我們就可以輸入命令了,sort。也就是我們要輸入的完整的命令應為:!10Gsort。這樣回車以後vi就會對文本中的10行進行操作,將操作的結果替換掉現在vi中的文本來顯示。而!!是在一行運行命令,並且輸入的結果為當前行的內容。例如我們輸入!!ls,就會將ls的執行結果顯示在vi中,並且是當前的內容,如果此行原先有內容將會被替換掉。如果我們完成一個文件的編輯而要開始一個新的編輯時我們最平常的做法就是退出當前的文件而重啟vi開始一個新的編輯。事實我們可以直接在vi中輸入:vi file而開始一個新文件的編輯。如果當前的文件你沒有保存,vi會給出警告的信息,這時你可以輸入:write來保存當前的文件。你也可以用:vi!file強制開始一個新文件的編輯。與vi相類似的一個命令是:view,所不同的是他以只讀的方式打開一個文件,這時vi會給出警告信息,但是你也可以進行修改,只是你不能進行保存,如果你要保存,vi就會給出提示。當然在這樣的情況下你可以用命令:write!來強制保存。我們還可以使用vi來編輯多個文件。我們可以在終端輸入vi file1 file2 file3,這樣我們就可以來編輯多個文件了,在默認的情況下vi來顯示第一個文件,如果要切換到下一個文件我們可以輸入:next,這樣我們就可以切換到第二個文件了。如果你沒有保存,vi會給出提示信息,這時也就不可能切換到第二個文件了。這時我們可以輸入:write進行保存然後再切換到第二個文件,或者是我們輸入:write:next.來保存後再切換到第二個文件。或者是我們可以用:wnext來簡寫這個命令。當然我們也可以用命令:next!來強制切換到第二個文件。當然這樣你所做的改動也就會丟失掉。為了避免這樣的情況,我們可以打開vi的自動保存功能。:set autowrite.這樣我們就不會為沒有保存而收到提示信息了。關閉自動保存的命令為::set noautowrite.當然next命令也可以用數字做前綴來指明所要執行的次數。如何來確定我們在編輯哪一個文件呢?我們可以用這樣的命令來明確我們所編輯的文件::args.這個命令會顯示出我們所打開的文件,同時會顯示我們正在編輯的文件。如果我們想要回到上一個文件我們可以用這樣的命令::previous或是:Next.如果你要保存當前的文件並切換到前一個文件可以用這樣的命令::wprevious或是:wNext.如果我們要編輯第一個文件我們可以用:first或是:rewind來快速的切換到第一個文件,同理如果我們要編輯最後一個文件我們可以用:last來快速切換。如果我們在一個文件中進行一些改動,再切換到另一個文件中進編輯,這時我們就可以用CTRL_^來切換這兩個文件。
在使用vi進行文本編輯的時候我們也可以打開多個窗口進行編輯。這也正是vi編輯器的強大這處。那麼我們如何來打開多個窗口進行文本編輯呢?我們又如何在多個文本窗口中進行切換呢?如何來控制窗口的大小呢?在vi編輯器還有一個緩沖區的概念,利用緩沖區我們可以進行多文本的編輯。
在使用vi進行文本編輯的時候我們也可以打開多個窗口進行編輯。這也正是vi編輯器的強大這處。那麼我們如何來打開多個窗口進行文本編輯呢?我們又如何在多個文本窗口中進行切換呢?如何來控制窗口的大小呢?在vi編輯器還有一個緩沖區的概念,利用緩沖區我們可以進行多文本的編輯。打開一個窗口最簡單的方法就是下面的命令::split。輸入這樣的命令後vi就會將當前的窗口平分為兩個。並且在這兩個窗口中顯示的是同一篇文章。如果你在其中的一個窗口進行文編輯,那麼另一個窗口也會同步的顯示出你所做的工作。如何在兩個窗口中進行切換呢?在gvim中要方便得多,只要用鼠標就可以進行窗口的切換。而在vim中則需要用命令來實現。CTRL_Ww這個命令可以實現在兩個文本窗口中進行切換。切換窗口還有另外的命令:CTRL_Wj 可以將光標定位在下一個窗口中,而CTRL_Wk可以將光標定位在上一個窗口中。如果想關閉 一個窗口可以用命令ZZ或是:q.當然了CTRL_Wc也可以做到同樣的事情。我們打開一個窗口一般並不是要在兩個窗口中顯示同一個文件,我們常常需要的是在兩個窗口中顯示兩個文件來加快文件編輯的工作。如何在新窗口中打開一個文件來進行編輯呢?我們可以用這樣的命令::split file.這樣我們就可以在另一個窗口中打開文件file開始我們的編輯工作了:)。那麼我們如何來控制窗口的大小呢?我們在輸入split命令時可以帶上一個參數,這個參數 也就指定了打開的窗口的大小。例如我們可以這樣的輸入::3 split file。這樣我們就可 以在一個新窗口中打開文件file,而這個窗口的大小有三行。當然我們也可以將這個命令中的空格去掉,也就是寫成::3split file這樣也可以達到同樣的作用。與split命令相類似的一個命令就是:new命令。所不同的就是split命令打開一個新窗口,但是在兩個窗口中顯示同一個文件,而new命令則是打開一個新窗口開始一個新文件的編輯.我們還可以打開一個新窗口,在這個窗口中打開一個文件來讀。命令為:sview。這個命令是:split和:view這兩個命令的組合。在這樣的多文本窗口中進行操作時我們常做一個工作就是要改變窗口的大小。可以使我們來改變窗口大小的命令為: CTRL_W+這個命令增大窗口,默認增量為1 CTRL_W-這個命令減小窗口,默認值為1 CTRL_W=這個命令可以將幾個窗口的大小變得相等。另外還有一個命令countCTRL_W_可以使得當前窗口變得count這樣的高。如果沒有指定count將會使得當前窗口變得盡可能的最大。 :buffers 這個命令就會列出當前的編輯中所有的緩沖區狀態。在這個狀態列表中,前面的數字就是緩沖區的數字標記,第二個標記就是緩沖區當前的狀態,而後一個則表明與空上緩沖區所關聯的文件名。他的一些狀態是這樣的: - 非活動的緩沖區(Inactive Buffer) h 隱藏的緩沖區(Buffer is hidden) % 當前的緩沖區(current buffer) # 交換緩沖區(Alternate buffer) + 文件已經被修改如果我們要選擇一個緩沖區我們可以用這樣的命令::buffer number number就是緩沖區狀態列表中所顯示出來的數字。我們也可以用文件名字來選擇緩沖區: :buffer file 關於緩沖區有一些有用的命令可以快速的完成我們的工作:我們可以用下面的命令來分割當前的窗口開始編輯一個緩沖區::sbuffer number 如果我們指明了數字,那麼當前窗口就會顯示數字所標記的那緩沖區中的內容,而如果沒有指明數字,那麼就會利用當前的緩沖區。當然這個命令我們也可以用文件名來做為參數進行操作。對於緩沖區還有一些其他相關的命令: :bnext 到下一個緩沖區 :count bnext 到下一個緩沖區執行count次 :count sbnext 命令:split 和 :count bnext組合形成的命令 :count bprevious 到前一個緩沖區count次 :count sbprevious :count bNext 與:bprevious作用相同 :blast 到最後一個緩沖區 :brewind 到第一個緩沖區
在現在的vi版本,或者是說是在vim中,與其先輩區分開來的一個特征就是現在的版本中有一個可視模式。這種可視模式可以使你加亮一個文本塊然後整體進行命令操作。例如你可以用高亮顯示出一個文本塊,然後用d命令來刪除這個文本塊。這種可視模式與其他的編輯相比的一個好處就是你可以在做改動以前看到你的操作對於所編輯的文本產生的影響。那麼我們如何為用這種有趣的可視化模式來進行我們的文本編輯工作呢?
vi編輯器學習使用之六在現在的vi版本,或者是說是在vim中,與其先輩區分開來的一個特征就是現在的版本中有一個可視模式。這種可視模式可以使你加亮一個文本塊然後整體進行命令操作。例如你可以用高亮顯示出一個文本塊,然後用d命令來刪除這個文本塊。這種可視模式與其他的編輯相比的一個好處就是你可以在做改動以前看到你的操作對於所編輯的文本產生的影響。那麼我們如何為用這種有趣的可視化模式來進行我們的文本編輯工作呢?要進入可視化模式,我們可以輸主命令v,這樣在vi的狀態行就會顯示我們已經進行可視化模式了。在這樣的模式下,我們移動光標,那麼在光標起始的位置和光標現在的位置之間的文本都會以高亮顯示的。這時我們可以對這些高亮顯示的文本整體進行命令操作,例如這時我們可以輸入d命令,那麼這些高亮顯示的文本就會被刪除掉。一般來說可以化模式可以具體的分為三種可視化模式,一種就是我們剛才用v命令進入的所謂的字符式可視模式(character-by-character visual mode)。在這種模式下,我們在進行文本選擇以高亮顯示時是以字符為單位的,我們可以一個字符字符的來選擇。而第二種就是所謂的行可視化模式(linewise visual mode),這時我們可以輸入V命令來進入這種可視化模式。這時我們所進行的操作是在以行為單位來進行的。還有一個命令可以使我們進入可視化模式,這就是CTRL_v,這就是我們所要說到第三種可視化模式,他可以使一個矩形內的文本高亮顯示,然後以這些文本為整體進行編輯操作。在可視模式下我們也可以得到一些相關的幫助信息。當然在輸入命令時要在所希望幫助的名稱前有v_做為前綴。例如我們想得到一些關於在可視模式下進行刪除操作的命令,我們可以這樣的來得到幫助信息::help v_d 當我們要退出可視化模式時,我們可以按ESC鍵退出。當然CTRL_c也可達到同樣的作用。與ESC作用相同的還有CTRL_和CTRL_N. 在可視化模式下我們可以進行各種各樣的編輯操作。如d命令可以刪除那些高亮顯示的文本內容,而D命令只是來刪除一行,哪怕這一行中只有部分文本是高亮顯示的。與d和D命令類似的是復制y和Y命令。y命令是將高亮顯示的文本復制下來,而Y只是將一行文本復制下來。c命令可以將以高亮顯示的文本刪除掉然後進入編輯模式,而C命令的作用與其相類似,所不同的只是C命令只是刪除一行文本。我們還可以利用可視化模式將幾行文本合並為一行。J命令可以將高亮顯示的文本內容合並為一行,同時以空格來區分各行,而如果我們不希望看到這些空格,我們可以使用gJ命令。我們在可視模式下進行文本編輯時也可以進行可視化模式的選擇和切換。你可以在任何情況下進行這種切換,而切換的做法只是簡單的輸入那種可視化的命令操作。例如現在我們在字符模式的可視化模式下進行操作,而現在我們想切換到塊模式的可視化模式,這時我們只是要簡單的輸入CTRL_v可以了。當然我們也可以先用ESC來關閉當前的可視化模式,然後再選擇我們所希望的可視化模式. 對於程序員來說似乎這種可視化模式會有更大的用處,我們可以用一種可視化模式來高亮顯示文本,然後用>命令來進行文本的縮進,我們還可以用,這個命令中I是插入文本的命令,string是我們要插的文本,而Esc則是結束插入操作的命令。這時就會看到我們所輸入的文本顯示在文本塊的左側,也就是開頭的地方,當我們結束插入操作時我們就會驚奇的發現我們所輸入的文本也會同時出現我們所定義的文本塊內所包含的其他行的開頭部分。同樣當我們用c命令來操作時我們也會發現類似的情況。當然了,在用c這個命令進行操作時你所輸入的文本應不超過一行,否則的話將會只有第一行的文本會被改動。而C命令也會有相類似的情況。我們也可以類似的來得到一些關於塊操作的命令幫助:例如::help v_b_r
vi編輯器學習使用之七
vi是一個強大的編輯器,他不僅可以用來處理我們平時的文本工作,他還可以用來寫程序文件。在vi中有許多命令可以方便的完成我們的程序處理工作。在用vi 進行程序處理時,vi充分的顯示出來了他的強大之處,他可以實現在語法加亮顯示,實現自動縮進,實現括號匹配,還可以在程序中實現查找和跳轉。
vi編輯器學習使用之七
vi是一個強大的編輯器,他不僅可以用來處理我們平時的文本工作,他還可以用來寫程序文件。在vi中有許多命令可以方便的完成我們的程序處理工作。在用vi進行程序處理時,vi充分的顯示出來了他的強大之處,他可以實現在語法加亮顯示,實現自動縮進,實現括號匹配,還可以在程序中實現查找和跳轉。
我們可以用這樣的命令在vi中打開語法加亮顯示的功能::syntax on。這樣以後我們在輸入的字符中,vi就會自動的識別出關鍵字,字符串以及其他的一些語法元素,並以不同的顏色來顯示出來。這對於程序員來說是一個巨大的幫助。當然你可以自定義語法加亮顯示的顏色。
一般情況下,vi的這種語法加亮顯示的功能可以工作的很好,但是有時我們也遇到一些小小的麻煩。也許我們都遇到過背景是白色而字體是淺黃色的情況,在這樣的情況下是非常難讀的。vi編輯器有兩種語法加亮的辦法,一種是當背景為淺色時用,而另一種是當背景為深色時用的。當我們啟動vi時,他會檢測我們所使用的端是哪一種背景顏色,是淺色還是深色,然後再應用語法加亮的顏色方案。當然了,有的時候vi也是可以檢測出錯的。我們可以用這樣的命令來知道我們的背景的情況::set background?。這樣vi就會在底端給出我們具體的顯示。如果vi檢測的並不正確,我們可以用這樣的命令來為他賦下正確的值::set background=light或是:set background=dark.當然我們要清楚的知道,這樣的操作要在打開語法加亮的命令之前來執行。vi實現語法加亮顯示的功能是通文件的擴展名來文件的類型從而實現功能的。但是有時我們在編輯一個C程序文件時並沒有使用傳統的擴展名,那麼我們如何來告訴vi我們正在編輯的文件的類型呢?解決的辦法就是用filetype這個選項。例如我們要告訴vi我們正在編輯的是一個C程序文件我們可以這樣的來做::set filetype=c。這樣以後vi就會知道我們正在編輯的是一個C程序文件並正確的加亮語法顯示。
除了語法加亮顯示的功能以外,vi還提供了縮進的功能。命令<<將使當前行向左移動一個移位寬度,而命令>>將使當前向右移動一個移位寬度。這個所謂的是移位寬度具體是多少呢?在vi中默認的是八個空格的寬度。然而平時的經驗可以表明當縮進是四個空格寬度時最有利於程序的閱讀。那麼我們如何將這個移動寬度定為四個空格的長度呢?這時我們就可以用下面的命令來做到::set shiftwidth=4.而這時的命令僅是對當前的一行有效,我們也可以像其他的vi命令一樣的在命令前用數字做為前綴還指定命令作用的范圍。如5<<就將縮進五行。
在vi中還有許多自動進行縮進的選項,一般有以下的幾種:C縮進(cindent):這是C語言的縮進形式,采用這樣的縮進方式的程序語言有:C,C++,Java等。當采用這種縮進格式時,vi就會自動的采用標准的C語言形式。還有一種形式是smartindent:在這種縮進模式中,每一行都和前一行有相同的縮進量,同時這種縮進形式能正確的識別出花括號,當遇到右花括號(}),則取消了縮進形式。另外的一種縮進形式便是所謂的自動縮進(autoindent):在這種縮進形式中,新增加的行和前一行有相同的縮進形式。vi編輯器可以很好的識別出C,C++,Java以及其他的一些結構化程序設計語言,並且能用C語言的縮進格式來很好的處理程序的縮進結構。我們可以用這樣的命令來打開C語言形式的縮進結構::set cindent.這樣以後vi編輯器就會用C語言的縮進形式來正確的處理程序文件。一般而言C縮進結構可以滿中絕大多數人的需要,當然了不同的人有不同的編程風格,如果你不喜歡這樣的縮進結構,你可以自己定義自己的縮進形式。也許我們做程序設計的人並不想每一次想要編輯C程序文件時都要用命令:set cindent來打開C縮進形式,為了解決這樣的問題,我們可以改寫vi的配置文件來使vi能夠自動的完成這樣的工作。我們在.vimrc(UNIX/LINUX)或是_vimrc(WINDOWS)中加入下面的幾句:
:filetype on
:autocmd FileType c,cpp:set cindent
第一行是打開vi文件類型識別功能,第二行是如果所識別的文件類型為C或是C++文件那麼便打C縮進形式。
在vi中除了C縮進形式以外我們還有smartindent縮進形式可以來用。在smartindent這種縮進模式中能夠正確的識別出{和}。同時增加了識C語言關鍵字的功能。如果一行是以#開頭的,那麼這種格式將會被特殊對待而不采用縮進格式。這種縮進格式不如cindent,但是卻強於autoindent。另外的一種縮進形式便函是autoindent。在其他的一些結構化程序設計語言如Pascal,Per或是Python語言中,我們所希望的是新的一行能和上一行有相同的縮進形式,這時我們便可以打開autoindent縮進形式,:set autoindent。這樣就可以很好的來滿足我們的要求了。
vi不僅有這些功能,而且還有更多的功能來快速的處理程序文件。其中一個便是可以快速的在文件中定位變量及宏定義等。其中一些常用到的命令有:
[CTRL_I/]CTRL_I 在本文件中以及在由#include命令包含進來的文件中進行查找光標下面的文字
gd/gD 查找變量的定義
[CTRL_D/]CTRL_D 跳到宏定義的地方
[d/]d/[D/]D 顯示宏定義
這幾個命令中有一些需要說明的地方:[CTRL_I/]CTRL_I命令用來查找光標下面的文字,查找的范圍不僅是在本文件中進行查找,而且還要查找由#include所包含進來的文件中進條查找。變顯查找的命令gd和gD有時並不能完美的完我們想要做工作。這是因為vi在理解C和C++的語法方面有一些小的限制。但是大多數的情況下這幾個命令還是可以很好的來完成我們工作的。[d/命令可以顯示以當前光標下的內容為為名字的第一個宏定義,]d也有著同樣的作用,所不同的只是後者是從當前光標處查找下一個宏定義。當然這兩個命令也可以在由#inlcude所包含進來的文件中進行查找。[D/]D命令可以用來列出文件中的宏定義。這兩個命令有著同樣的作用,所不同的只是前者是列出當前光標以後的宏定義,而後者是從當前光標處的下一個宏開始列出文件中的宏義。(注:此處由此書看來似乎是這樣的,但是自己親自來做時並沒有出現這樣效果)
我們在編寫程序時常常要做的一件事便是括號的匹配,我們在vi中可以用%命令來確定匹配的括號。例如我們將光標定位在其中一個括號處,然後執行命令%,光標就會定位在與其相匹配的括號處。有時我們在編寫了一段程序後卻想著要將這一段程序進行縮進,這時我們可以用這樣的命令來做到:將光標定位在第一個或是最後一個包含著所要縮進的程序塊的括號處,然後執行下面的命令:>%,這樣就可以將這個程序右縮進一段距離。但是我們發現執行這個命令後花括號也一樣的進行了縮進,有時我們這並不是我們想要的,我們想要的是僅括號內的文本進行縮進。這時我們又應如何來做呢?這時我們可以用這樣的命令:>i{.這個命令是說僅括號內的文本進行縮進。我們還可以用可視化的模式來縮進文本塊,具體的做法是這樣的:
1 將光標定位在左括號或是右括號處。
2 進入可視化模式:v
3 選中括號內的文本:i}
4 縮進:>
當我們用vi來編輯我們的程序文件時,他提供給了我們定位程序函數的功能。這對於我們想要理解一個程序是非常有幫助的。vi所定位的函數被包含在一個由ctags的程序建立的文件當中。要建立一個名為tags的這樣的文件,我們可以輸入這樣的命令來完成:$ctags *.c
這樣以後當我們在vi中來編輯我們的程序文件時我們就可以任意的跳轉到我們想要去的函數處,當然這得要求我們想要到函數存在。我們可以用這樣的命令來到達我們要到的地方:
:tag function
這個命令甚至可以查找得到在其他文件中的函數。
在完成函數跳轉的功能命令中還有幾個強大而有趣的命令。CTRL_]命令跳轉到以光標下的字符串為函數名的函數處。這樣就大大的方便了我們在C程序查找函數的需要。例如你正在看一段名為write_block的函數程序,而在這個程序中調用了函數write_line。這個被調用的函數具體是來做什麼的呢?我們可以將光標定位在這個函數上,然用執行命令CTRL_]。這樣vi就會馬上跳轉到這個函數的定義處。我們就可以清楚的看到這個函數的實現的方法。而在這個函數中又調用了函數write_char,這時我們可以用同樣的方法來查看這個函數的定義過程。命令:tags可以列出我們已經訪問過的函數名稱。但是我們在走了一段路以後想回去又該怎麼來做呢?命令CTRL_T可以使我們回到上一個訪問的函數處。我們為了在函數跳轉的命令,我們要用命令ctags建立這文件來存放在C程序中所出現在的函數名,這時vi要建立一個棧來存入函數名。我們用命令CTRL_T回到上一個訪問的函數處,這時我們還可以用命令:tag來向前走一步,即回到前一個訪問的函數處。我們也還可以像其他大多數的vi命令一樣在此命令之前用數字來做前綴,指明要執行的次數。我們還可以用這樣的命令::tag function。這樣我們就可以來到指定的函數處。
當我們用命令:tag時是將當前窗口中的內容由函數的內容所代替了。我們也可以打開一個新窗口來顯示函數的內容。這時我們就要用到下面的命令::stag tag。這個命令是要打開一個新窗口來顯示tag指定的函數內容。我們也可以用命令CTRL_W_]來打開一個新窗口顯示以光標下的字符串為函數名的函數內容。我們也可以在這個命令前加下數字count做為前綴,這打開的窗口就是count這樣的高度。
我想我們常會有這樣的情況,那就是我們想要跳到一個函數處卻記清他的名字究竟是什麼?這是我們要怎麼辦呢?在vi中有一個很好的解決辦法,那就是我們可以用:tag /name來找到你想要的內容。例如在我們上面所舉過的例子中曾提到了函數write_line。但是現在我們記不得他的全名了,只是記得好像有一個line。這時我們如何來找到呢?我們可以用這樣的命令來做::tag /line。這樣vi就會將我們帶到write_line定義的地方。我們還可以借助於一些表達式來精確的定位我們要去的地方。例子如我們似乎記得有一個函數是以read開頭的,這時我們可以這樣的來查找::tag /^read。這個是說read所要查找的內容是以read開頭的。或者說我們不能十分清楚的記得一函數的名稱是DoFile,do_file還是Do_File。這時我們也可以這樣的來查找::tag /DoFile|do_file|Do_File。或者是我們可以寫成這樣的表達式::tag /[Dd|o_=[Ff|ile。這樣我們就可以找到我們想要的內容了。一般情況下我們用這樣的命令來查找時並不能精確的得到我們想要的東西,而是得到許多匹配的選項。而我們可以用命令:tselect來列出所有這些合要求的內容。這個列表一般由這樣的一些內容組成:
第一列的數字是這些標記(tag)的編號,第二列這些內容的優先級,他一般包含三個字母:F完全匹配,如果沒有則是忽略的情況;S靜態標記,如果沒有,則是全局標記;C則是說是這個標在當前的文件中。在執行完這個命令後,:tselect會給我們一個機會,我們可以選擇到標號為哪一個的內容處去,或者是選擇離開。命令g]與命令:tselect相類似,只是他是以光標下的內容為查找內容的。命令:tjump的作用與:tselect命令相同,所不同的只是當執行的結果只有一項內容時,則自動的選中這個結果。命令gCTRL_]與此相同,只是他是當前光標下的內容為查找對象的。其他的一些相關的命令如下:
:count tnext 到下一個標記處
:count tprevious 到上一個標記處
:cout tNext 到上一個標記處
:cout trewind 到第一個標記處
:cout tlast 到最後一個標記處
命令:stselect與:tselect命令相同,所不同的只是前者將打開一個新窗口來顯示執行的結果。與其類似的命令還有:stjump.
當我們在編寫makefile文件時我們所需要的縮進是一個tab,而不是8個空格。這樣的區別是很難在屏幕上看出來的。這時我們可以用這樣的命令::set list,這樣以後tab則顯示為^I,同時在每一行的末尾顯示$,這樣我們就會很好的來區分這些細小的分別了,同時還有助我們來檢查我們程序的正確性。當然我們也可以選擇用其他的字符來顯示,通過listchars選項我們可以做到這一點。如果我們設置了expandtab選項,那麼我們輸入一個tab時,vi實際上插入的空格。這對於我們編寫makefile文件時是很不方便的。如果我們想真正的輸入一個tab,而不是插入空格,這時我們可以輸入CTRL_V,這時的CTRL_V告訴vi不要忽略以後的字符。有時在一個makefile文件中包含許多的文件,我們可以對這些文件進行排序,具體的做法如下:
1 將光標放在文件列表的起始點
2 用命令標記這個位置:ma
3 到這個列表的底部
4 執行命令排序:!'a sort
我們也可以在可視模式下來排序:
1 移動到要排序的文本的頂部
2 進入可視化模式:V
3 移動到文本的底部
4 執行命令:!sort
vi編輯器還可以允許我們在vi中執行編譯程序的make命令,其命令為:make,這時就會來編譯程序,同時會顯示出錯誤來。這時我們就可以移到到出錯的地方來修正我們的錯誤,然後再重新編譯,直到成功。如果我們的程序編譯有錯誤,vi就會顯示出錯誤的提示信息和錯誤的地方,同時vi會自動到第一個出現錯誤的地方。我們在修改完錯誤以後,可以用命令:cnext來到下一個出錯誤的地方繼續我們的工作。命令:cprevious和命令:cNext可以回到上一個錯誤的地方。命令:clast可以到最後一個出錯的地方,而命令:crewind可以到第一個出現錯誤的地方。而命令:cnfile可以到下一文件第一個出錯的地方。如果我們此時忘記了出現在的錯誤是什麼,我們可以用這樣的命令來顯示出錯信息::cc,如果我們想看到一個錯誤的列表,我們可以用這樣的命令來完成::clist。我們還可以用命令來顯示一定范圍內的錯誤。如:
:clist3,5 顯示第三行到第五行的錯誤
:clsit,5 顯示第一行到第五行的錯誤
:clsist5, 顯示第五行到最後一行的錯誤
如果我們已經運行make命令並且生成我們自己的錯誤信息的文件,我們可以用這樣的命令來告訴vi這些情況::cfile error-file。error-file是make或是編譯輸出的文件。如果我們沒有error-file文件,那麼我們可以使用errorfile這個選項在。退出錯誤的狀態可以用命令::cquit.這些命令對於我們在使用一個集成的開發環境時會顯得更有用一些.
errorfile選項會建立一個默認的文件,這個文件會被命令:clist和-q命令行選項所使用,但是這個文件並不會成為:make命令的輸出文件。如果我們想要建立自己的默認錯誤文件可以使用下面的命令::set errorfile=error.list
:grep與:make相類似,他是執行外部的命令程序grep並顯示輸出。例如我們要在程序文件中查找變量ground_point我們可以使用下面的命令:
:grep -w ground_point *.c
-w 是告訴grep程序包僅查找單詞ground_point,而不是任意匹配的結果。與前面的命令相類似,:cnext,:cprevious,:cc等命令可以在這個匹配的列表中進行移動,:crewind,:clast分別移到到列表中的第一個和最後一個。:cnfile到下一個文件是的第一個。
vi編輯器可以很好的完成一些我們要做的一些重復性的工作。例如我們可以在vi中設置縮寫,這樣當我們在輸入一個單詞時只需輸入其中的一部分,而要vi來完其余的部分。當然了,我們可以將我們喜歡的一些設置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個功能以外,我們還可以在 vi中定義我們自己的功能按鍵,而不會影響到系統中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個縮寫的字符來代替一個單詞,然後在我們想要輸入這個單詞時只要輸入這個縮寫的字符就可輸入我們想要的單詞了。我們如何來做到這些呢?這時我們要用到的vi命令是:abbreviate.例如我們可以用ad來vi編輯器可以很好的完成一些我們要做的一些重復性的工作。例如我們可以在vi中設置縮寫,這樣當我們在輸入一個單詞時只需輸入其中的一部分,而要vi來完其余的部分。當然了,我們可以將我們喜歡的一些設置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會影響到系統中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個縮寫的字符來代替一個單詞,然後在我們想要輸入這個單詞時只要輸入這個縮寫的字符就可輸入我們想要的單詞了。我們如何來做到這些呢?這時我們要用到的vi命令是:abbreviate.例如我們可以用ad來代替advertisement。這樣我們在想輸入advertisement的時候只要輸入ad然後打一下空格或是tab就可以輸入advertisement了。具體的做法是這樣的:
:abbreviate ad advertisement 這個命令就是在告訴vi我們設置advertisement的縮寫為ad,這樣我們在要輸入advertisement的時候只要輸入ad就可了,剩下的工作vi會為我們完成的。當然了這個命令也可以為多個單詞設置縮寫。例如我們可以設置Jack Berry的縮寫為JB。命令為::abbreviate JB Jack Berry 這樣我們在輸入了JB以後打下空格或是Tab,vi就會自動的用我們設置的單詞來替換JB。對於程序員來說這樣命令為我們提供了巨大的便利。例如我們可以做出這樣的設置:
:abbreviate #b /*************************
:abbreviate #e **********************/
這個縮寫可以在加快我們添加注釋的速度。我們在編寫程序文件時常有這樣的習慣,那就是在程序的開頭總是要加上一個注釋塊,來標明我們此程序的目的等。在這個縮寫中有一點要我們注意的地方,那就是我們希望在寫程序的注釋塊時下一行要和上一行對齊,要做到這一點就要求第二行的注釋開頭的兩個字母要是空格,但是在這個縮寫命令中會忽略到空格的作用,因而我們在寫這個縮寫時在開頭寫上,這樣就會滿足我們的要求了。也許有時我們會在一個文件中設置了多個縮寫,我們可以命令:abbreviate來列出我們這個文件中所有的縮寫的設置。
另一個比較有趣和強大的命令就是:map命令,這個命令可以使得我們將鍵盤上的一個按鍵與vi中的命令綁定在一起。例如我們現在將一個單詞用花括號括起來,例如我們要將amount變成{amount}的形式,這時我們就可以這樣的來應用這個命令:
:map i{ea}
在這個命令中:map是vi中的命令,而F5則是說將下面的命令與F5鍵綁定,後面的則是具體的命令內容,i{是說插入字符{,然後退回到命令狀態。e是移到單詞的結尾處,a}則是增加字符}然後退至命令狀態。
在我們做過這樣的工作以後我們就可以來執行我們的命令了,我們將光標定位在一個單詞上,例如amount,按下F5鍵,我們就會發現這時就變成了{amount}的形式。
在這裡我們要注意的一點就是我們最好不要將在vi中有特殊命令的功能熱鍵與某些命令進行綁定,如果是這樣的話就會給我們帶來麻煩。
同上面的:abbreviate命令相類似,我們也可以用命令:map來列出在這個文件中所有的功能鍵,包括我們自己定義的以及系統定義的。
我們在做過這樣的設置以後,有時希望這樣的設置在下一次使用時會繼續有效,這時我們就要用命令:mkvimrc將我們所做的這些設置寫入文件中。這個命令的格式如下:
:mkvimrc file
在這裡file就是我們要將這些設置寫入的文件名。我們可以用命令:source file來讀出文件並執行文件中的內容。
在vi的啟動過程中,vi會首先查找初始化文件。如果找到就會自動執行文件的內容。而這些初始化文件一般來說是這樣的一些文件:
$HOME/.vimrc
$HOME/_vimrc
$HOME/.exrc
$HOME/_exrc
而在Windows和Dos系統中則是這樣的一些文件:
$HOME/_vimrc
$HOME/.vimrc
$VIM/_vimrc
$VIM/.vimrc
$HOME/_exrc
$HOME/.exrc
$VIM/_exrc
$VIM/.exrc
而如果我們用一些圖形界面的話,那麼還會讀一些其他的配置文件。如果我們要執行gvim那麼$VIMRUNTIME/menu.vim也會被讀進來。用命令:version我們可得到這些配置文件的信息。
例如我們可以在.vimrc中寫入以下的一些語句:
:syntax on
打開語法加亮功能
:set shiftwidth=4
設置縮進寬度為4
:ab #d #define
將#define縮寫為#d
:ab #b /************************
:ab #e *********************/
我們還可以加入一些其他的東西,這樣就可大的方便我們的工作了。而這也正是vi的強大之處 。
現代的Vim編輯器是基於一個古老的名為vi的編輯器設計而成的,而vi基於一個更古老的基於命令行方式的ex編輯器設計而成的。ex編輯器是在屏幕產生以前相當流行的一個編輯,他是為那時古老的標准打印而設計的。
僅管ex是基於命令行方式的,然而他也是真正意義上的一個強大而高效的編輯器。即使是在今天他也是發揮著作用。僅管現在的Vim編輯器有一套的命令系統,可是有些事情還是要用ex的命令方式才可以更好的來完成。因而現在的Vim編輯器設計了與ex編輯器的接口,我們可以在Vim中使用ex方式的命令。而那些以冒號開頭的命令就是一個ex方式的命令。
如果你想執行單一的命令行方式的命令,那麼你只輸入:然後輸入命令就可以了。例如我們在前面討論的:set number.事實上他就是一個命令模式的命令。在執行完這個命令以後,Vim編輯器又回到了他原來的狀態。我們可以通過命令:ex選擇進入命令行模式。Q命令也有同樣的作用。如果要選擇回到正常模式(normal mode)也就是可視化模式(Visual mode),我們可以使用命令:visual.
命令:print(簡寫為:p)可以打印出選定的行。如果沒有傳遞參數,他僅是打印當前的行。打印完成以後回到打印行的開頭。我們也可以指定要打印的行的范圍。例如命令:1,5 print就是要打印1到5行。嚴格來說你不必須在數5和print之間輸入空格,但是如果這樣做後我們就會現這個命令看起來會更好。如果你僅僅是想打印第5行,你可以用這樣的命令::5 print.當然了我們也可以使用一些特殊的數字標記,例如字符$是指最後一行,因而如果我們想要打印全文的時候我們可以用這樣的命令::1,$ print.而字符%是指整篇文章(1,$),因而我們也可用這樣的命令來打印整篇文章::% print,而.則是指當前行,我們要打印當前可以用:print命令而不帶任何參數,也可以用這樣的命令:.print。我們還可以用指定句子中內容來打印選定的行。例如在我們的文章中我們可以用這樣的命令來打印含有字符ex的行::/ex/ print。這樣就會打印出含用ex的行,並會高亮顯示出ex。同樣命令:?ex? print也會達到同樣的作用,而命令:?ex? print也正是打印含有ex字符的命令格式。
在前面的學習中我們曾學過標記命令m,例如我們可以在任何地方用命令ma做上標記,然後在其他的地方可以用命令‘a回到做了標記的地方。這個命令也可以與print命令組合。例如我們可以在一個地方用命令ma做上標記,然後在其他的地方用命令mb做上另外的標記,然後我們就可以執行下面的命令來打印這兩個標記之間的內容了::'a,'b print
我們也可以在可視化的模式下來選定要打印的內容。例如我們用命令V進入可視化模式並選定一段內容,這時我們輸入:就會在Vim的底部顯示<,>兩個字符,這兩個字符分別指我們的選定內容的開頭和結束部分。
命令:substitute可以使我們將指定的字符換成其他的字符。這個命令的格式是這樣的:
:range substitute /from/to flags
在這個命令中range是指定了范圍,也就說是在哪些行裡做替換。而後是說將字符串from替換成字符串to。在默認的情況下,這個替換命令僅是將一行中第一個出的的字符替換成給定的字符。而如果我們想將所有出現的字符都替換成給定的字符我們就用g這個標記命令。例如::% substitute /from/to/g.這個命令就達到將所有出現from的地方全部替換成to。其他的標記(flags)包括:p(print),這個命令是告訴substitute打印所做的改動。c(confirm),這個命令是告訴substitute命令在做出這樣的改動以前要詢問是否要做這樣的改動例如如果我們執行下面的命令::1,$ substitute /Professor/Teacher/c.在Vim就會顯示我們將要做改動的文本,並顯示下面的內容:
Prfessor: You mean it's not supposed to do that?
replace with Teacher(y/n/a/q/^E/^Y)?
這時你可以做出以下這樣的回答:
y 執行這個替換
n 跳過這個替換
a 執行所有的替換不要做詢問
q 退出,不做任何改動
CTRL─E 向上翻滾一行
CTRL-Y 向下翻滾一行
在Vim的命令還有一些命令可以幫助我們很好的完成我的工作:例如命令:read filename可讀進一個文件並將讀進和內容插在當前行的後面。而命令:write是將文件寫入。這是一個保存我們工作的方法。我們也可以用命令:write newfile將當前的文件內容寫入一個新的文件。一般情況下:write命令並不會覆蓋已經存在的文件。我們可以用強制操作(!)選項來完成我們所需要的操作並覆蓋當前已經存在的文件。而這個命令對於我們要將一個大的文件分拆為小的文件時顯得更有用。我們可以用可視化模式選定一個范圍然後將這個選定的范圍寫入新的文件,從而實現了分拆的目的。
我們還可以Vim中不需要退出而執行Shell命令。命令:shell可以使們進入命令終端執行我們需要的命令。當我們要退出終端回到Vim中時可以執行exit命令。我想這對於程序人員來說真是一個巨大的幫助。:)
在我們談起Vim編輯器似乎只是覺得他只是一個類似於一個命令行方式的文本編輯器。而事實上不是這樣的。Vim在窗口環境中也可以完美的完成我們的工作。在窗口環境下,我們不僅可以使用那些在Vim文本方式下的命令來完成工作,而且還有許多的菜單和其他的選項。這些都可以使得我們完美的完成我們的工作。
我們要啟動圖形界面的Vim可以用下面的命令:gvim file。這樣就可以打開圖形界面來編輯文本file。圖形界面下的Vim編輯器的外觀因你所用的操作系統的不同而有所不同,就是同樣的操作系統也會因你所使用的工具集不同(Motif,Athena,GTK)而會呈現不同的外觀。而值得向大家推薦的是GTK版本的Vim編輯器,當然其他版本的也是可以來完美的完成我們的工作的。
在Windows系統中我們可以在標准形式下用鼠標來選擇文本,而在X Window系統中我們也會有一個標准的系統來使用鼠標,但是這兩種標准是不同的。然而比較幸運的是我們可以定制我們的Vim編輯器。我們可以使得我們的Vim中的鼠標的行為看起來像是X Window系統中的鼠標的行為。下面的命令是設置鼠標的行為為X Window風格的鼠標行為::behave xterm。而下面的命令則是使得鼠標的行為是Windows風格的行為::behave mswin。在UNIX和Linux系統中的鼠標風格是xterm風格,而在Windows中的鼠標風格是在安裝過程中選擇的。為了控制鼠標的行為,命令:behave有以下這些選項:
Setting for Setting for
Option :behave mswin :behave xterm
'selectmode' mouse,key (empty)
'mousemodel' popup extend
'keymodel' startsel,stopsel (empty)
'selection' exclusive inclusive
xterm的鼠標風格的行為主要有以下一些:
左鍵: 移動光標
拉動左鍵: 在可視化模式下選擇文本
右鍵: 選中光標處到右鍵點擊處的文本
中鍵: 在光標處粘貼選中的文本
Windows的鼠標風格的行為主要有以下一些:
左鍵: 移動光標
拉動左鍵: 在選擇模式下選中文本
選中到光標處的文本
顯示彈出菜單
中鍵: 將系統剪切板中的文本粘貼到文件
(注:其中的S為Shift鍵)
其他的一些特殊的用法:
Shift+左鍵: 向前搜索光標處的文本
Shift+右鍵: 向後搜索光標處的文本
Ctrl+左鍵: 跳轉到以光標處的文本為名字的標記(tag)處
Ctrl+右鍵: 跳轉到前一個標記處
在圖形界面的Vim編輯器還有一個有趣的特征,那就是當我們點開一個菜單時就會發在子菜單的第一行有一條虛線,點擊此虛線就可以將這個菜單移其他的地方。關閉後Vim的菜單結構又恢復到正常的狀態了。在GTK版本和Windows版本中的圖形界面的Vim還有一個工具欄,這些工具可以快速的完成我們的工作。
雖然現在的專業的文字處理軟件例如MS Word,Star Office,Open Office等可以很好的來完成的一些文檔處理的工作,但是人們仍然是喜歡用純文本的形式來處理手中的文本.這裡因為用純文本處理的文件比較容易閱讀,很不你那些專業的字處理軟件,有專門的文件存儲格式,少了許多的麻煩.Vim是一個強大的文本編輯器,他也可以像那些專來的字處理軟件一樣來處理我們手中的文本工作,從而使得我們的工作來得更漂亮.
Vim在默認的情況下是不會自動換行的,這也就是說我們在默認的情況下我們不得不自己決伫回車的位置.這樣的設置對於處理程序文件來說是一件相當好的事情,因為這樣可以由我們自己來決定回定回車換行的位置,從而可以很好的來完成我們的程序設計工作.但是如果我們是在處理一些文檔工作,那麼這個問題就有一些成為困撓我們的問題了.幸運的是Vim提供了這樣的功能可以使我們來解決這樣的問題.當我們指定了textwidth這個選項後,Vim就會自動的在相應的地方加上換行符.例如我們可以用下面的命令來指定一個只有30列的文本:
:set textwidth=30
這樣以後當我們再輸入文本時如果達到30這個限制,Vim就會自動的依據情況來加上換行符.在Vim中我們可以有兩種方法來選擇換行的方式.例如下面的命令是告訴Vim從左面算起30個字符時換行::set textwidth=30
而下面的命令則是告訴Vim從右面算起當達到margin個字符的空白時要換行:
:set wrapmargin=margin這裡的margin是空白字符的個數.例如如果你有一個80個字符寬的文本,下面的兩個命令則是起到了同樣的作用:
:set wrapmargin=10
:set textwidth=70
Vim並不是那些專業的字處理軟件,在我們指定了文本寬度的情況下,當我們將一行中的前幾個文字刪掉的話,Vim並不會像那些專業的字處理軟件那樣將後面行中的文本移到前面的行上,而是形成了一些長短不一的段落.這樣看起來不是很好,因為我們需要的是有同一風格的文本形式.在Vim中這樣的情況可以有幾種處理方法:一是在可視化模式下選中這些文本,然後用gp命令來格式化選中的段落.另一種方法就可以使用gqmotion的命令來完成格式.例如我們要格式化5行,我們就可以用下面的命令:gq4j.這個命令是告訴Vim編輯要格式化本行,同時要格式化下面的4行.這樣就達到了格式化5行的目的.在這樣的情況下,向前移動的命令}這時就會為我們提供更大的便利了.這時我們的做法是這樣的:將光標放在我們要格式化段落的第一行上,然後執行命令gq}.這樣就可以達到我們的目的了.這樣方法要簡便得多,因為我們不必要再數細數我們要格式化多少行了.命令gqip可以格式化當前的段落.這個命令要比上一個的格式命令還要簡便一些,因為在這樣的情況下我們不必要將光標放在一個段落的第一行了.最後如果我們要想格式化一行的可以使用命令gqgq,當然了我們也可以簡記為gqq.
我們都知道在專業的文字處理軟件中有文本對齊的選項,而這在Vim當中也是可以做到的.如果要將文本居中對齊我們可以用這樣的命令::range ceter width.在這個命令中如果我們沒有指定textwidth的值,他將使用我們設置的textwidth的值,如果我們也沒有設置這個值,那麼他將使用系統定義的80.例如我們要將1到5行的內容居中對齊,我們可以使用下面的命令:
:1,5 center 30
同理右對齊的命令也可以類似的寫成:
:1,5 right 30
但是左對齊的命令就與這兩個命令有一些不同了,左對齊的命令為:
:range left margin
在這個命令中左對齊的參數並不是文本的寬度,而在文本左邊的空白字符的寬度,如果為0,那麼將緊靠屏幕的左邊沿.在Vim中並沒有內置的方法來對齊文本,但是我們可以使用一個簡潔的宏包來完成這樣的工作.要使用這個包先執行下面的命令:
:source $VIMRUNTIME/macros/justify.vim
在這個包中定義了一個新的可視化的命令_j.要對齊一個文本塊,可以在可視化模式中高亮顯示這個文本塊,然後執行命令_j.
J命令可以使兩行合並為一行,同時用空格為分格這兩行.在文本處理中有一個joinspace的選項,如果設置了這個選項,那麼可果一行是以標點符號來結尾的,那麼在用這個命令後會用兩個空格來區分這兩行.也就是說如果我們用命令:set nojoinspace ,用J命令來合並這兩行時會用一個空格來區分.但是如果我們用命令::set joinspace ,用J命令來合並這兩行時會用兩個空格來區.這就是這個選項所要起到的作用.
在Vim編輯器中我們可以通過設置formatoptions選項來設置Vim中的文本和注釋的換行方式.這個命令為:
:set formatoptions=character
在這個命令中character一組格式化的標記,他可以是下面的一些字符:
t 文本自動換行
c 注釋自動換行,同時自動在行首添加注釋標記
r 當添加新行時自動添加注釋符
o 當用O和o開始新的一行時自動在行首添加注釋符
q 允許使用gq來格式化文本
2 第二行縮進兩個字符
v 采用老的vi換行方式,當你輸入空格時換行
b 在達到textwidth以前當輸入空格時換行
l 在插入模式下不換行,只用gq來完成相應的工作
下面讓我們來看一下這些選項是如何來工作的:
當需要文本自動換行時要打開t標記,當需要注釋自動換行時要打c標記.所以對於一個要處理程序文件的人來說打開注釋自動換行似乎要有更大的幫助:
:set formatoptions=c
這樣在注釋中的一個長句就會自動換行,而正常的程序文本就不會被自動換行.事實上我們常做些這樣的選項:
:set formatoptions=cq
這個選項是告訴Vim編輯器不僅注釋要自動換行,而且這些注釋可以使用gq命令來格式化.
Vim編輯器可以很好的處理注釋的問題.在C程序風格的程序文本處理過程中,當注釋自動換行時Vim會自動在注釋的開頭加下注釋標記.但是在這樣的設置也還是存在一個問題的,那就是當你回車時Vim就不會在下一行的開頭自動加上注釋標記了.如果這一行仍寫的是注釋,那麼就要你親自來加上了.但是當我們打開 r這個標記後就會解決這個問題了.這時如果你打回車,Vim編輯器還會在新的一行加上注釋標記.這時如果你要想在下一行寫程序文本,那麼就不得不動手刪除注釋標記了.如果你希望當用O或是o添加新的一行時要自動添加注釋標記就要打開o這個格式標記了.
格式標記選項是告訴Vim編輯器在格式文本中要從第二行開始而不是第一行.設置這個選項的命令為:
:set formatoptions+=2
而v標記則控制一個句子從哪裡進行分裂.例如現在我們有一個句子:
This is a test of the very long warpp.
現在我們要在這個句子的後面新增一個詞logic
如果沒有v標記結果就會變成:
This is a test of the very
long line warpping logic.
而如果打開v標記,結果就會變成:
This is a test of the very long line wrapping
logic.
令管已經存在的文本已經遠遠的超過了textwidth的限制,但是因為設置了v標記,所以Vim編輯器也不會換行,相反只有你新增了一個詞時才會換行.
在默認的情況下vim編輯器是使用內部的格式程序來模式文本,當然了我們也可以使用外部的格式程序來格式我們的文本.在UNIX和Linux系統中有一個標准的程序fmt可以很好的來做這樣的工作.如果我們想用命令gq來執行這個處部命令,我們可這樣的來進行設置:
:set formatprg=fmt
即使是沒有進行這樣的設置,我們也可以使用命令!來格式文本.例如如果我們想用程序fmt來格式一個段落,我們可以用這樣的命令:!}fmt.!是開始了一個過濾命令,而}是告訴Vim過濾一個段落.fmt是我們要使用的命令的名字.
在早期的打印機的時代,開始新的一行要占用兩個字符的時間.如果到了一行的結尾處,你要他快速的回到新的一行的開頭,打印的針頭在紙面上飛快到掠過,常常就會在紙面的中間留不希望的污點.這個問題的解決辦法就是用兩個字符來解決:一個字符來移到第一列,而字符來新增一行.計算機產生以後,存儲較為昂貴,在如何解決回車換行這個老問題上,人們產生了不同的意見.UNIX人認為在到達一行的結尾時新增一行(),而蘋果人則認同的解決辦法,MS則堅持古老的,的方法.這就意味著如果你將一個文件從一個系統轉移到另一個系統,你就面臨著回車換行的問題.而Vim編輯器則會自動的認出這種文件格式方面的區別,並會為我們做出相應的處理.
fileformats選項包含了許多當編輯一個新文件時會用到的一些文件格式.例如下面的命令就是告訴vim編輯器將UNIX的文件格式做為第一選擇,而將MS-DOS的文件格式做為第二選擇:
:set fileformats=unix,dos
檢測到的文件格式會被存放在fileformat選項中,我們可以且下面的命令來查找我們所使用的文件格式:
:set fileformat?
我們還可以應用fileformat這個選項將一個文件從一種文件模式轉換成另一種文件格式.例如我們有一個名為readme.txt的MS-DOS文件格式的文件,而我們想將他轉換為UNIX文件格式的文件.我們可以按照下面的方法來做:
首行編輯該文件:
$ vim readme.txt
其次將文件格式改為UNIX文件格式:
:set fileformat=unix
然後保存該文件,此時這個文件就轉換成為了UNIX文件格式的文件.
在默認的情況下Vim編輯器認為我們的文件是由行組成的,也就是他認為文件中的最後一行是以為結束符的.有時我們會遇到不包含有結束標記行的文件,當Vim遇到這樣的文件時,他就會設置noendofline選項,而當遇到正常結束符的文件時則會設置endofline選項.如果你想設置你的文件以結束符結尾則可以用下面的命令:
:set endofline
如果你想設置一個文件不以結束符來結尾,則可以用下面的命令:
;set noendofline
在Vim中,我們有一系列的命令可使得我們在文件中進行移動,例如)命令向前移動一個句子,而(是向後移動一個句子,}向前移動一個段落,而{是向後移動一個段落.
曾經Troff是UNIX系統上專業的字處理程序,雖然在現代這個程序已經很少用了,可是Vim還是包含了一些選項使得我們可以用這種曾經的方式來處理文本.Troff需要用宏來告訴他應做一些什麼.其中的一些宏開始一個新的段落.因為Troff要用許多的宏包來,因而Vim需要知道哪些宏將開始一個新的段落.paragraphs選項可以做這些工作.這個選項的格式如下:
:set paragraphs="macromacro..."
每一個宏是兩個字符的Troff宏名,例如:set paragraphs="P LP"是告訴Vim宏.P和.LP開始一個新行.在默認的情況下paragraph的選項如下:
:set paragraphs=IPLPPPQPP LIpplpipbp
這個命令列出下面的一些開始一個新段落的宏名:
.IP .LP .PP .QP .P .LI .pp .lp .ip .bp
我們可以使用命令[[和[]向前移動一個區間,而使用命令]]和][向後移動一個區間,一個區間是用頁分隔符(CTRL-L)定義的文本.我們也可以用 Troff的宏來定義一個區間,section選項有些類似於paragraph選項,所不同的是前者定義一個宏用來分隔區間,而後者是段落.默認情況下是這樣的;
:set section=SHNHH HUnhsh
在用Vim進行文本處理時我們還可以對文本進行加密處理,這種加密處理是最弱的一種加密處理方法,常常用新聞的發布.這時我們要用到的命令為g?motion.例如我們可以用命令g?g?或者是g??來加密當前行.當我們對一文本進行兩次加密處理就為解密處理了.
我們在用Vim來處理文件時可以使用Vim的自動完成功能來大大加速我們的工作速度.所謂的自動完成也就是說當我們輸入一個單詞的一部分以後,按CTRL -P,Vim就會自動的來完成剩下的部分.我們在前面的學習過程中曾用:abbreviate命令來簡記某一個單詞來達到自動完成的目的,而在這裡我們將看到是一個更加強大的自動完成功能.Vim能非常簡單和靈活的來決定要用哪一個單詞來自動完成. 我們在使用Vim這個強大的自動完成功能的同時,還可以自已定義我們的自動完成的特征,而且還可以使用不同類型的自動完成功能.
我們在用Vim來處理文件時可以使用Vim的自動完成功能來大大加速我們的工作速度.所謂的自動完成也就是說當我們輸入一個單詞的一部分以後,按CTRL-P,Vim就會自動的來完成剩下的部分.我們在前面的學習過程中曾用:abbreviate命令來簡記某一個單詞來達到自動完成的目的,而在這裡我們將看到是一個更加強大的自動完成功能.Vim能非常簡單和靈活的來決定要用哪一個單詞來自動完成. 我們在使用Vim這個強大的自動完成功能的同時,還可以自已定義我們的自動完成的特征,而且還可以使用不同類型的自動完成功能.
如果我們在編寫C程序,而我們所謂得到的下面的一個句子:
total=ch_array[0]+ch_array[1]+ch_array[2]
這時我們輸入total=ch_array[0]+ch_,然後按下CTRL-P,Vim就會自動的替我們完成其余的部分,這時我們得到將是
total=ch_array[0]+ch_array
由此可以看到我們在處理文件時用這樣的方式可以大大的加快我們的處理速度.
那麼Vim是如何找到匹配的單詞的呢?在默認的情況下,Vim在查找一個單詞時是按照如下的步驟:
1 在當前文件中進行查找
2 在其他窗口中進行查找
3 在其他的已裝入的緩沖區中進行查找
4 在沒有裝入緩沖區的文件中進行查找
5 在當前的標記(tag)列表是進行查找
6 在所有的由當前文件的#include包含進來的文件中進行查找
當然了我們也可以自定義我們的查找順序.
我們在使用自動完成功能時的命令CTRL-P是向後查找匹配的單詞,而還有一個命令CTRL-N是向前查找匹配的單詞.他們有同樣的功能和作用,所不同的只是查找方向上的不同.
Vim還提供了許多的命令可以使得我們來自定義我們的一些查找上的特征.例如我們可以用下面的命令來告訴Vim在在自動完成的查找過程中忽略大小寫的區別:
:set ignorecase
這樣以後如果我們輸入ins,Vim就會認為是INSERT,Inside或者是instep.當然了前提是在我們所編輯的文本中含有這些詞,要不就會找得到了.
為了能夠精確的進行查找來自動完成,我們並不希望上面的情況出現,我們可以設置一些選項來告訴Vim區分大小寫的情況.這時我們要用到下面的命令:
:set infercase
這樣以後如果我們再輸入ins,與其相匹配的列表就成為了instep,inside,insert.我們可以通過按CTRL-P或是CTRL-N來進行匹配完成.
在大多數情況下,Vim默認的設置可以很好的來完成工作,但是有時我們要定義自己的一些完成的選項,這時我們就要用到complete這個選項了.這個選項的格式如下:
:set complete=key,key,key
而這個命令中可能出現的key值如下:
. 當前文件
b 已被裝緩沖區,但是沒有在窗口內的文件
d 在當前的文件中定義和由#include包含進來的文件
i 由#include包含進來的文件
k 由dictionary選項定義的文件
kfile 名為{file}的文件
t 標記(tags)文件
u 沒有載入的緩沖區
w 在其他窗口中的文件
我們可以使用path選項來告訴Vim如何來查找我們在當前文件中所包含進來的文件.我們還可以指定一個字典,這個選項的格式如下:
:set dictionary=file,file,....
這個選項定義了由命令CTRL-P和CTRL-N進行匹配查找時所要查找的文件.在Linux系統中這個定義文件在/usr/dict/words中,所以如果我們要將這個文件添加進來進行查找的話,我們就要用到下面的命令:
:set dictionary=/usr/dict/words
如果我們要使用一個我們自己的文件也可以這樣的來設置
:set dictionary=/home/oualline/words,/usr/doc/words
我們也可以指定一個字典文件和k選項組合使用:
:set dictionary=k/usr/oualline/words
我們也可以多次的使用k這個標記選項:
:set dictionary=k/usr/dict/words,k/usr/share/words
在上面提到的CTRL-P和CTRL-N進行查找匹配時查找的范圍比較的寬范,我們當然也可以使用命令進行一些比較嚴格的查找.這時我們可以使用命令CTRL-X.當我們輸入CTRL-X時我們會進入CTRL-X的一個子模式.這時我們可以使用下面的命令進行查找:
CTRL-D 宏定義
CTRL-F 文件名
CTRL-K 字典
CTRL-I 當前文件以及由#include包含進來的文件
CTRL-L 整個行
CTRL-] 標記(tags)
CTRL-P 向前查找,與沒有CTRL-X命令時相同
CTRL-N 向後查找,與沒有CTRL-X命令時相同
CTRL-X
CTRL-D命令查找宏定義.他也會查找#include文件.當我們執行完這個命令以後就可以使用CTRL-P,CTRL-N來進行匹配查找.
例如我們可以編輯下面的測試文件:
include.h文件中的內容
#define MAX(x,y) ((x)<(y)?(y):(x))
#define MIN(x,y) ((x)<(y)?(x):(y))
int sum(int i1,int i2)
{return (i1+i2);}
main.c文件中的內容:
#include "include.h"
#define MORE "/usr/ucb/more"
這時我們開始編輯main.c文件,如果我們按下CTRL-X我們就會進入CTRL-X的子模式.如果我們要查找一個宏定義,我們可以按下CTRL-D,這時就會在屏幕的底部簡單的顯示出有多少匹配的選項.這樣我們就可以用CTRL-P和CTRL-N來進行自動完成的功能了.而命令CTRL-X CTRL-]則是查找下一個標記(tag),標記是一個C函數的定義.我們可以用命令ctags命令來生成一個C函數定義的列表.我們可以這樣的來使用這個命令:
$ctags *.c *.h
這樣以後我們就可以在插入模式入下用CTRL-X CTRL-]命令來進行標記的查找和匹配了.
在默認的情況下,vim編輯器只是簡單的顯示出標記的名字,我們可以執行下面的命令,這樣以後就可以顯示出整個標記了:
:set showfulltag
我們可以使用CTRL-X CTRL-F命令來匹配文件名.他會在當前的目錄下查找文件並會顯示出匹配的內容,這時你就可以用CTRL-P和CTRL-N命令來選擇你想要的匹配選項了.
到目前為止我們所說還只是對單詞進行操作,我們可以用命令CTRL-X CTRL-L對一行進行匹配操作,同樣的我們也可以用CTRL-N和CTRL-P來進行選項的匹配.我們還可以在輸入CTRL-X命令後用CTRL-Y向下滾動文本,而用CTRL-E向上滾動文本.
Vim最大的一個優點就是他的靈活性.使得他具有如此靈活性的一個重要原因就是自動命令.所謂的自動命令就是一條命令,所不同的只是他可以在某些事件發生時自動執行.
例如通過Vim的這樣自動命令,我們可以使用Vim來編輯壓縮文件,這是因為我們可以定義一個自動命令在我們讀取文件時解壓縮,在我們寫入文件時進行壓縮.
我們在處理文件時有時希望文件在保存時在文件的結尾處插入當前的日期,而這在Vim當中我們可以使用自動命令來完成.我們可以定義這樣的一個函數:
:function DateInsert()
: $read !date "在文件的結尾處插入日期
:endfunction
當我們要保存文件時可以調用這個函數:
:call DateInsert()
然後我們就可以保存退出了.
我們還可以將這個功能綁定在一個按鍵上:
:map :call DateInsert()|:write
這種方法使用問題的解決更簡單,因為我們只需在要保存文件時按一下F12鍵就可以了.
但是也許有時我們會忘記這樣的步驟,而使用正常的保存命令,那麼這時這個函數也就失去了意義.我們希望這個插入日期的命令可以自動被執行,這也正是自動命令的意義所在.
下面的命令就可以來滿足我們的要求了:
:autocmd FileWritePre * :callDateInsert()
這個命令會使得所有的文件在保存之前調用這個插入日期的函數.我們並不需要每一次都要輸入:write來保存文件,也就是說當我們定義了這個命令以後,當我們輸入一次:write命令,vim就會自動檢查所有未保存的文件並執行我們定義的這個命令,然後執行保存命令.
:autocmd命令的一般格式如下:
:autocmd group events file_patter nested command
在這個格式中組名(group)是一個可選項,他被用於管理和調用命令.參數事件(events)是一個事件列表,指明引發命令的事件,而嵌套標記(nested)可以允許嵌套自動命令,最後是所要執行的命令.
命令:augroup可以使得我們定義一組自動命令.這個組名最好應是一個和我們要定義的一組自動命令相關聯的名字,如下面的例子:
:augroup cprograms
: autocmd FileReadPost *.c :set cindent
: autocmd FileReadPost *.cpp :set cindent
:augroup END
在這裡因為這些自動命令是在:augroup的作用域之內的,所以他們被放在cprogram這個組內.這組自動命令是在讀取C和Cpp之後執行的.如果我們想在這個組中添加關於頭文件的自動命令,我們可以使用:augroup命令,或者是在我們的定義中包含這個組名.
如果我們正在編輯的文件名為sam.cx,而我們想將他當作C程序文件來對處理.這時我們可以通過命令來告訴Vim編輯器在文件讀入以後將他與*.c文件相匹配.我們所用的命令如下:
:doautocmd group event file_name
在這個命令執行的時候,Vim是將假定當前文件的名字為file_name,而實際上這並不是他真正的文件名.如果在這個命令中我們並沒有指明組(group),那麼所有的組都會被用到.而且我們必須指明事件,並且Vim會認為這個事件已經發生.與命令:doautocmd相類似的是命令:doautoall,所不同的只是後者是針對每一個緩沖區(buffer).這個命令的格式為:
:doautoall group event file_name
我們可以使用下列的命令來引發命令:
BufNewFile 當編輯一個新文件時引發命令
BufReadPre BufReadPost 在讀入之前或是讀入之後引發命令
BufRead BufReadPost的另一種說法
BufFilePre BufFilePost 在通過:file命令更改緩沖區名字之前或是之後引發
FileReadPre FileReadPost
在用:read命令讀入文件之前或之後.在文件讀入之後,在文件的開頭和結尾處有由[和]來標記
FilterReadPre FilterReadPost 在用過濾命令(filter)讀入文件之前或之後
FileType 當FileType設置時有效
Syntax 當Syntax設置時有效
StdinReadPre StdReadPost 由標准輸入設備讀入或是輸出
BufWritePre BufWritePost 在將整個緩沖區寫入文件之前或是之後
BufWrite BufWritePre的另一種說法
FileWritePre FileWritePost 將部分緩沖區內容寫入文件之前或是之後
FileAppendPre FileAppendPost 將一個文件由過濾命令輸入之前或之後
FileChangedShell
這個事件是在Vim運行Shell命令而文件的修改時間已經改變時引發
FocusGained FocusLost
這個事件是在Vim編輯器得到或是失運輸入光標時引發.這意味著vim運行圖形界面,並且是Vim成為當前窗口或是其他的成為當前窗口
CursorHold
用戶停止輸入的時間長於由updatetime所指定的時間時引發
BufEnter BufLeave 當進入或離開緩沖區時引發
BufUnload 在緩沖區未載入之前引發
BufCreate BufDelete 在緩沖區產生以後或是在緩沖區刪除以前引發
GuiEnter 啟動GUI時引發
VimEnter Vim啟動而初始化文件還沒有讀入進引發
VimLeave 退出Vim編輯器而.viminfo還沒有改寫時引發
FileEncoding fileencoding已經被設置時有效
TermChanged term選項被更改時引發
User
並不是一個真正的事件,而是命令:doautocmd一起使用的一個事件
當存文件時,只有下列事件成對出現時才引發:
BufWritePre BufWritePost
FilterWritePre FilterWritePost
FileAppendPre FileAppendPost
FileWritePre FileWritePost
當讀文件進,只要下列事件中的一個被設置則會引發:
BufNewFile
BufReadPre BufReadPost
FilterReadPre FilterReadPost
FileReadPre FileReadPost
文件名類型與UNIX標准系統相匹配.下面列出是一些特殊字符匹配的情況:
* 匹配任意長度的任意字符
? 匹配單個字符
' 分隔交替的類型
? 字符?
, 字符,
character
將這個字符看作是一個要查找的類型字符,例如:a+可以匹配,aa,aaa等等
一般情況下一個命令的執行結果並不會引發另一個事件.例如Syntax的執行結果並不會引發FileReadPre事件.但是如果我們在自動命令中加入nested關鍵字就可以來引發了,例如下面的命令:
:autocmd FileChangedShell *.c nested e!
我們可以使用命令:autocmd列出所有的自動命令.
如果我們想要得到所有這些命令中的一個子集命令,我們可以使用如下的命令:
:autocmd group event pattern
在這個命令中如果我們指定了group,那麼就會所有與group相匹配的命令.event可以是以前定義的或是所有的事件,pattern指了與類型相匹配的文件選項.只有那些與命令相匹配的命令才會被列出來.
我們可以建立我們自已的自動命令,當然了我們也可以移除那些我們不再需要的自動命令.例如命令:autocmd!就可以移除所有的自動命令.
我們也可以用下面的命令來移除指定的組命令:
:autocmd! group
在這個命令中我們當然也可以為這個組指定事件或是類型
:autocmd! group event pattern
event可以用*代替所有的事件
我們可以用命令:autocmd!來移除那些已經存在的自動命令,我們還可以同時在一個命令中再新建一個我們自己的自動命令.這個語法的格式如下:
:autocmd! group event pattern nested command
這個命令等價於下面的兩個命令:
:autocmd! group event pattern
:autocmd group event pattern nested command
有時我們並不想引發某個命令,在這樣的情況下我們可以設置eventignore選項來指定那些要忽略的事件.例如下面的命令將進入窗口和離開窗口的事件忽略掉:
:set eventignore=WinEnter,WinLeave
如果要忽略所有的事件,可以用下面的命令:
:set eventignore=all
Copyright © Linux教程網 All Rights Reserved