中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
[vim與gvim技巧]vim&gvim技巧大全(8)

轉(zhuǎn)自:http://blog.chinaunix.net/uid-8494387-id-2030953.html

這幾個(gè)命令中有一些需要說明的地方:[CTRL_I/]CTRL_I命令用來查找光標(biāo)下面的文字,查找的范圍不僅是在本文件中進(jìn)行查找,而且還要查找由#include所包含進(jìn)來的文件中進(jìn)條查找。變顯查找的命令gd和gD有時(shí)并不能完美的完我們想要做工作。這是因?yàn)関i在理解C和C++的語法方面有一些小的限制。但是大多數(shù)的情況下這幾個(gè)命令還是可以很好的來完成我們工作的。[d/命令可以顯示以當(dāng)前光標(biāo)下的內(nèi)容為為名字的第一個(gè)宏定義,]d也有著同樣的作用,所不同的只是后者是從當(dāng)前光標(biāo)處查找下一個(gè)宏定義。當(dāng)然這兩個(gè)命令也可以在由#inlcude所包含進(jìn)來的文件中進(jìn)行查找。[D/]D命令可以用來列出文件中的宏定義。這兩個(gè)命令有著同樣的作用,所不同的只是前者是列出當(dāng)前光標(biāo)以后的宏定義,而后者是從當(dāng)前光標(biāo)處的下一個(gè)宏開始列出文件中的宏義。(注:此處由此書看來似乎是這樣的,但是自己親自來做時(shí)并沒有出現(xiàn)這樣效果)
我們在編寫程序時(shí)常常要做的一件事便是括號的匹配,我們在vi中可以用%命令來確定匹配的括號。例如我們將光標(biāo)定位在其中一個(gè)括號處,然后執(zhí)行命令%,光標(biāo)就會(huì)定位在與其相匹配的括號處。有時(shí)我們在編寫了一段程序后卻想著要將這一段程序進(jìn)行縮進(jìn),這時(shí)我們可以用這樣的命令來做到:將光標(biāo)定位在第一個(gè)或是最后一個(gè)包含著所要縮進(jìn)的程序塊的括號處,然后執(zhí)行下面的命令:>%,這樣就可以將這個(gè)程序右縮進(jìn)一段距離。但是我們發(fā)現(xiàn)執(zhí)行這個(gè)命令后花括號也一樣的進(jìn)行了縮進(jìn),有時(shí)我們這并不是我們想要的,我們想要的是僅括號內(nèi)的文本進(jìn)行縮進(jìn)。這時(shí)我們又應(yīng)如何來做呢?這時(shí)我們可以用這樣的命令:>i{.這個(gè)命令是說僅括號內(nèi)的文本進(jìn)行縮進(jìn)。我們還可以用可視化的模式來縮進(jìn)文本塊,具體的做法是這樣的:
1 將光標(biāo)定位在左括號或是右括號處。
2 進(jìn)入可視化模式:v
3 選中括號內(nèi)的文本:i}
4 縮進(jìn):>
當(dāng)我們用vi來編輯我們的程序文件時(shí),他提供給了我們定位程序函數(shù)的功能。這對于我們想要理解一個(gè)程序是非常有幫助的。vi所定位的函數(shù)被包含在一個(gè)由ctags的程序建立的文件當(dāng)中。要建立一個(gè)名為tags的這樣的文件,我們可以輸入這樣的命令來完成:$ctags *.c
這樣以后當(dāng)我們在vi中來編輯我們的程序文件時(shí)我們就可以任意的跳轉(zhuǎn)到我們想要去的函數(shù)處,當(dāng)然這得要求我們想要到函數(shù)存在。我們可以用這樣的命令來到達(dá)我們要到的地方:
:tag function
這個(gè)命令甚至可以查找得到在其他文件中的函數(shù)。
在完成函數(shù)跳轉(zhuǎn)的功能命令中還有幾個(gè)強(qiáng)大而有趣的命令。CTRL_]命令跳轉(zhuǎn)到以光標(biāo)下的字符串為函數(shù)名的函數(shù)處。這樣就大大的方便了我們在C程序查找函數(shù)的需要。例如你正在看一段名為write_block的函數(shù)程序,而在這個(gè)程序中調(diào)用了函數(shù)write_line。這個(gè)被調(diào)用的函數(shù)具體是來做什么的呢?我們可以將光標(biāo)定位在這個(gè)函數(shù)上,然用執(zhí)行命令CTRL_]。這樣vi就會(huì)馬上跳轉(zhuǎn)到這個(gè)函數(shù)的定義處。我們就可以清楚的看到這個(gè)函數(shù)的實(shí)現(xiàn)的方法。而在這個(gè)函數(shù)中又調(diào)用了函數(shù)write_char,這時(shí)我們可以用同樣的方法來查看這個(gè)函數(shù)的定義過程。命令:tags可以列出我們已經(jīng)訪問過的函數(shù)名稱。但是我們在走了一段路以后想回去又該怎么來做呢?命令CTRL_T可以使我們回到上一個(gè)訪問的函數(shù)處。我們?yōu)榱嗽诤瘮?shù)跳轉(zhuǎn)的命令,我們要用命令ctags建立這文件來存放在C程序中所出現(xiàn)在的函數(shù)名,這時(shí)vi要建立一個(gè)棧來存入函數(shù)名。我們用命令CTRL_T回到上一個(gè)訪問的函數(shù)處,這時(shí)我們還可以用命令:tag來向前走一步,即回到前一個(gè)訪問的函數(shù)處。我們也還可以像其他大多數(shù)的vi命令一樣在此命令之前用數(shù)字來做前綴,指明要執(zhí)行的次數(shù)。我們還可以用這樣的命令::tag function。這樣我們就可以來到指定的函數(shù)處。
當(dāng)我們用命令:tag時(shí)是將當(dāng)前窗口中的內(nèi)容由函數(shù)的內(nèi)容所代替了。我們也可以打開一個(gè)新窗口來顯示函數(shù)的內(nèi)容。這時(shí)我們就要用到下面的命令::stag tag。這個(gè)命令是要打開一個(gè)新窗口來顯示tag指定的函數(shù)內(nèi)容。我們也可以用命令CTRL_W_]來打開一個(gè)新窗口顯示以光標(biāo)下的字符串為函數(shù)名的函數(shù)內(nèi)容。我們也可以在這個(gè)命令前加下數(shù)字count做為前綴,這打開的窗口就是count這樣的高度。
我想我們常會(huì)有這樣的情況,那就是我們想要跳到一個(gè)函數(shù)處卻記清他的名字究竟是什么?這是我們要怎么辦呢?在vi中有一個(gè)很好的解決辦法,那就是我們可以用:tag /name來找到你想要的內(nèi)容。例如在我們上面所舉過的例子中曾提到了函數(shù)write_line。但是現(xiàn)在我們記不得他的全名了,只是記得好像有一個(gè)line。這時(shí)我們?nèi)绾蝸碚业侥??我們可以用這樣的命令來做::tag /line。這樣vi就會(huì)將我們帶到write_line定義的地方。我們還可以借助于一些表達(dá)式來精確的定位我們要去的地方。例子如我們似乎記得有一個(gè)函數(shù)是以read開頭的,這時(shí)我們可以這樣的來查找::tag /^read。這個(gè)是說read所要查找的內(nèi)容是以read開頭的?;蛘哒f我們不能十分清楚的記得一函數(shù)的名稱是DoFile,do_file還是Do_File。這時(shí)我們也可以這樣的來查找::tag /DoFile\|do_file\|Do_File?;蛘呤俏覀兛梢詫懗蛇@樣的表達(dá)式::tag /[Dd|o_\=[Ff|ile。這樣我們就可以找到我們想要的內(nèi)容了。一般情況下我們用這樣的命令來查找時(shí)并不能精確的得到我們想要的東西,而是得到許多匹配的選項(xiàng)。而我們可以用命令:tselect來列出所有這些合要求的內(nèi)容。這個(gè)列表一般由這樣的一些內(nèi)容組成:
第一列的數(shù)字是這些標(biāo)記(tag)的編號,第二列這些內(nèi)容的優(yōu)先級,他一般包含三個(gè)字母:F完全匹配,如果沒有則是忽略的情況;S靜態(tài)標(biāo)記,如果沒有,則是全局標(biāo)記;C則是說是這個(gè)標(biāo)在當(dāng)前的文件中。在執(zhí)行完這個(gè)命令后,:tselect會(huì)給我們一個(gè)機(jī)會(huì),我們可以選擇到標(biāo)號為哪一個(gè)的內(nèi)容處去,或者是選擇離開。命令g]與命令:tselect相類似,只是他是以光標(biāo)下的內(nèi)容為查找內(nèi)容的。命令:tjump的作用與:tselect命令相同,所不同的只是當(dāng)執(zhí)行的結(jié)果只有一項(xiàng)內(nèi)容時(shí),則自動(dòng)的選中這個(gè)結(jié)果。命令gCTRL_]與此相同,只是他是當(dāng)前光標(biāo)下的內(nèi)容為查找對象的。其他的一些相關(guān)的命令如下:
:count tnext    到下一個(gè)標(biāo)記處
:count tprevious    到上一個(gè)標(biāo)記處
:cout tNext    到上一個(gè)標(biāo)記處
:cout trewind    到第一個(gè)標(biāo)記處
:cout tlast    到最后一個(gè)標(biāo)記處
命令:stselect與:tselect命令相同,所不同的只是前者將打開一個(gè)新窗口來顯示執(zhí)行的結(jié)果。與其類似的命令還有:stjump.
當(dāng)我們在編寫makefile文件時(shí)我們所需要的縮進(jìn)是一個(gè)tab,而不是8個(gè)空格。這樣的區(qū)別是很難在屏幕上看出來的。這時(shí)我們可以用這樣的命令::set list,這樣以后tab則顯示為^I,同時(shí)在每一行的末尾顯示$,這樣我們就會(huì)很好的來區(qū)分這些細(xì)小的分別了,同時(shí)還有助我們來檢查我們程序的正確性。當(dāng)然我們也可以選擇用其他的字符來顯示,通過listchars選項(xiàng)我們可以做到這一點(diǎn)。如果我們設(shè)置了expandtab選項(xiàng),那么我們輸入一個(gè)tab時(shí),vi實(shí)際上插入的空格。這對于我們編寫makefile文件時(shí)是很不方便的。如果我們想真正的輸入一個(gè)tab,而不是插入空格,這時(shí)我們可以輸入CTRL_V,這時(shí)的CTRL_V告訴vi不要忽略以后的字符。有時(shí)在一個(gè)makefile文件中包含許多的文件,我們可以對這些文件進(jìn)行排序,具體的做法如下:
1 將光標(biāo)放在文件列表的起始點(diǎn)
2 用命令標(biāo)記這個(gè)位置:ma
3 到這個(gè)列表的底部
4 執(zhí)行命令排序:!'a sort
我們也可以在可視模式下來排序:
1 移動(dòng)到要排序的文本的頂部
2 進(jìn)入可視化模式:V
3 移動(dòng)到文本的底部
4 執(zhí)行命令:!sort
vi編輯器還可以允許我們在vi中執(zhí)行編譯程序的make命令,其命令為:make,這時(shí)就會(huì)來編譯程序,同時(shí)會(huì)顯示出錯(cuò)誤來。這時(shí)我們就可以移到到出錯(cuò)的地方來修正我們的錯(cuò)誤,然后再重新編譯,直到成功。如果我們的程序編譯有錯(cuò)誤,vi就會(huì)顯示出錯(cuò)誤的提示信息和錯(cuò)誤的地方,同時(shí)vi會(huì)自動(dòng)到第一個(gè)出現(xiàn)錯(cuò)誤的地方。我們在修改完錯(cuò)誤以后,可以用命令:cnext來到下一個(gè)出錯(cuò)誤的地方繼續(xù)我們的工作。命令:cprevious和命令:cNext可以回到上一個(gè)錯(cuò)誤的地方。命令:clast可以到最后一個(gè)出錯(cuò)的地方,而命令:crewind可以到第一個(gè)出現(xiàn)錯(cuò)誤的地方。而命令:cnfile可以到下一文件第一個(gè)出錯(cuò)的地方。如果我們此時(shí)忘記了出現(xiàn)在的錯(cuò)誤是什么,我們可以用這樣的命令來顯示出錯(cuò)信息::cc,如果我們想看到一個(gè)錯(cuò)誤的列表,我們可以用這樣的命令來完成::clist。我們還可以用命令來顯示一定范圍內(nèi)的錯(cuò)誤。如:
:clist3,5    顯示第三行到第五行的錯(cuò)誤
:clsit,5    顯示第一行到第五行的錯(cuò)誤
:clsist5,    顯示第五行到最后一行的錯(cuò)誤
如果我們已經(jīng)運(yùn)行make命令并且生成我們自己的錯(cuò)誤信息的文件,我們可以用這樣的命令來告訴vi這些情況::cfile error-file。error-file是make或是編譯輸出的文件。如果我們沒有error-file文件,那么我們可以使用errorfile這個(gè)選項(xiàng)在。退出錯(cuò)誤的狀態(tài)可以用命令::cquit.這些命令對于我們在使用一個(gè)集成的開發(fā)環(huán)境時(shí)會(huì)顯得更有用一些.
errorfile選項(xiàng)會(huì)建立一個(gè)默認(rèn)的文件,這個(gè)文件會(huì)被命令:clist和-q命令行選項(xiàng)所使用,但是這個(gè)文件并不會(huì)成為:make命令的輸出文件。如果我們想要建立自己的默認(rèn)錯(cuò)誤文件可以使用下面的命令::set errorfile=error.list
:grep與:make相類似,他是執(zhí)行外部的命令程序grep并顯示輸出。例如我們要在程序文件中查找變量ground_point我們可以使用下面的命令:
:grep -w ground_point *.c
-w 是告訴grep程序包僅查找單詞ground_point,而不是任意匹配的結(jié)果。與前面的命令相類似,:cnext,:cprevious,:cc等命令可以在這個(gè)匹配的列表中進(jìn)行移動(dòng),:crewind,:clast分別移到到列表中的第一個(gè)和最后一個(gè)。:cnfile到下一個(gè)文件是的第一個(gè)。
vi編輯器的學(xué)習(xí)使用(八)

vi編輯器可以很好的完成一些我們要做的一些重復(fù)性的工作。例如我們可以在vi中設(shè)置縮寫,這樣當(dāng)我們在輸入一個(gè)單詞時(shí)只需輸入其中的一部分,而要vi來完其余的部分。當(dāng)然了,我們可以將我們喜歡的一些設(shè)置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個(gè)功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會(huì)影響到系統(tǒng)中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個(gè)縮寫的字符來代替一個(gè)單詞,然后在我們想要輸入這個(gè)單詞時(shí)只要輸入這個(gè)縮寫的字符就可輸入我們想要的單詞了。我們?nèi)绾蝸碜龅竭@些呢?這時(shí)我們要用到的vi命令是:abbreviate.例如我們可以用ad來vi編輯器可以很好的完成一些我們要做的一些重復(fù)性的工作。例如我們可以在vi中設(shè)置縮寫,這樣當(dāng)我們在輸入一個(gè)單詞時(shí)只需輸入其中的一部分,而要vi來完其余的部分。當(dāng)然了,我們可以將我們喜歡的一些設(shè)置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個(gè)功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會(huì)影響到系統(tǒng)中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個(gè)縮寫的字符來代替一個(gè)單詞,然后在我們想要輸入這個(gè)單詞時(shí)只要輸入這個(gè)縮寫的字符就可輸入我們想要的單詞了。我們?nèi)绾蝸碜龅竭@些呢?這時(shí)我們要用到的vi命令是:abbreviate.例如我們可以用ad來代替advertisement。這樣我們在想輸入advertisement的時(shí)候只要輸入ad然后打一下空格或是tab就可以輸入advertisement了。具體的做法是這樣的:
:abbreviate ad advertisement 這個(gè)命令就是在告訴vi我們設(shè)置advertisement的縮寫為ad,這樣我們在要輸入advertisement的時(shí)候只要輸入ad就可了,剩下的工作vi會(huì)為我們完成的。當(dāng)然了這個(gè)命令也可以為多個(gè)單詞設(shè)置縮寫。例如我們可以設(shè)置Jack Berry的縮寫為JB。命令為::abbreviate JB Jack Berry 這樣我們在輸入了JB以后打下空格或是Tab,vi就會(huì)自動(dòng)的用我們設(shè)置的單詞來替換JB。對于程序員來說這樣命令為我們提供了巨大的便利。例如我們可以做出這樣的設(shè)置:
:abbreviate #b /*************************
:abbreviate #e **********************/
這個(gè)縮寫可以在加快我們添加注釋的速度。我們在編寫程序文件時(shí)常有這樣的習(xí)慣,那就是在程序的開頭總是要加上一個(gè)注釋塊,來標(biāo)明我們此程序的目的等。在這個(gè)縮寫中有一點(diǎn)要我們注意的地方,那就是我們希望在寫程序的注釋塊時(shí)下一行要和上一行對齊,要做到這一點(diǎn)就要求第二行的注釋開頭的兩個(gè)字母要是空格,但是在這個(gè)縮寫命令中會(huì)忽略到空格的作用,因而我們在寫這個(gè)縮寫時(shí)在開頭寫上,這樣就會(huì)滿足我們的要求了。也許有時(shí)我們會(huì)在一個(gè)文件中設(shè)置了多個(gè)縮寫,我們可以命令:abbreviate來列出我們這個(gè)文件中所有的縮寫的設(shè)置。
另一個(gè)比較有趣和強(qiáng)大的命令就是:map命令,這個(gè)命令可以使得我們將鍵盤上的一個(gè)按鍵與vi中的命令綁定在一起。例如我們現(xiàn)在將一個(gè)單詞用花括號括起來,例如我們要將amount變成{amount}的形式,這時(shí)我們就可以這樣的來應(yīng)用這個(gè)命令:
:map i{ea}
在這個(gè)命令中:map是vi中的命令,而F5則是說將下面的命令與F5鍵綁定,后面的則是具體的命令內(nèi)容,i{是說插入字符{,然后退回到命令狀態(tài)。e是移到單詞的結(jié)尾處,a}則是增加字符}然后退至命令狀態(tài)。
在我們做過這樣的工作以后我們就可以來執(zhí)行我們的命令了,我們將光標(biāo)定位在一個(gè)單詞上,例如amount,按下F5鍵,我們就會(huì)發(fā)現(xiàn)這時(shí)就變成了{(lán)amount}的形式。
在這里我們要注意的一點(diǎn)就是我們最好不要將在vi中有特殊命令的功能熱鍵與某些命令進(jìn)行綁定,如果是這樣的話就會(huì)給我們帶來麻煩。
同上面的:abbreviate命令相類似,我們也可以用命令:map來列出在這個(gè)文件中所有的功能鍵,包括我們自己定義的以及系統(tǒng)定義的。
我們在做過這樣的設(shè)置以后,有時(shí)希望這樣的設(shè)置在下一次使用時(shí)會(huì)繼續(xù)有效,這時(shí)我們就要用命令:mkvimrc將我們所做的這些設(shè)置寫入文件中。這個(gè)命令的格式如下:
:mkvimrc file
在這里file就是我們要將這些設(shè)置寫入的文件名。我們可以用命令:source file來讀出文件并執(zhí)行文件中的內(nèi)容。
在vi的啟動(dòng)過程中,vi會(huì)首先查找初始化文件。如果找到就會(huì)自動(dòng)執(zhí)行文件的內(nèi)容。而這些初始化文件一般來說是這樣的一些文件:
$HOME/.vimrc
$HOME/_vimrc
$HOME/.exrc
$HOME/_exrc
而在Windows和Dos系統(tǒng)中則是這樣的一些文件:
$HOME/_vimrc
$HOME/.vimrc
$VIM/_vimrc
$VIM/.vimrc
$HOME/_exrc
$HOME/.exrc
$VIM/_exrc
$VIM/.exrc
而如果我們用一些圖形界面的話,那么還會(huì)讀一些其他的配置文件。如果我們要執(zhí)行g(shù)vim那么$VIMRUNTIME/menu.vim也會(huì)被讀進(jìn)來。用命令:version我們可得到這些配置文件的信息。
例如我們可以在.vimrc中寫入以下的一些語句:
:syntax on
打開語法加亮功能
:set shiftwidth=4
設(shè)置縮進(jìn)寬度為4
:ab #d #define
將#define縮寫為#d
:ab #b /************************
:ab #e *********************/
我們還可以加入一些其他的東西,這樣就可大的方便我們的工作了。而這也正是vi的強(qiáng)大之處 。

vi編輯器的學(xué)習(xí)使用(九)
現(xiàn)代的Vim編輯器是基于一個(gè)古老的名為vi的編輯器設(shè)計(jì)而成的,而vi基于一個(gè)更古老的基于命令行方式的ex編輯器設(shè)計(jì)而成的。ex編輯器是在屏幕產(chǎn)生以前相當(dāng)流行的一個(gè)編輯,他是為那時(shí)古老的標(biāo)準(zhǔn)打印而設(shè)計(jì)的。
僅管ex是基于命令行方式的,然而他也是真正意義上的一個(gè)強(qiáng)大而高效的編輯器。即使是在今天他也是發(fā)揮著作用。僅管現(xiàn)在的Vim編輯器有一套的命令系統(tǒng),可是有些事情還是要用ex的命令方式才可以更好的來完成。因而現(xiàn)在的Vim編輯器設(shè)計(jì)了與ex編輯器的接口,我們可以在Vim中使用ex方式的命令。而那些以冒號開頭的命令就是一個(gè)ex方式的命令。
如果你想執(zhí)行單一的命令行方式的命令,那么你只輸入:然后輸入命令就可以了。例如我們在前面討論的:set number.事實(shí)上他就是一個(gè)命令模式的命令。在執(zhí)行完這個(gè)命令以后,Vim編輯器又回到了他原來的狀態(tài)。我們可以通過命令:ex選擇進(jìn)入命令行模式。Q命令也有同樣的作用。如果要選擇回到正常模式(normal mode)也就是可視化模式(Visual mode),我們可以使用命令:visual.
命令:print(簡寫為:p)可以打印出選定的行。如果沒有傳遞參數(shù),他僅是打印當(dāng)前的行。打印完成以后回到打印行的開頭。我們也可以指定要打印的行的范圍。例如命令:1,5 print就是要打印1到5行。嚴(yán)格來說你不必須在數(shù)5和print之間輸入空格,但是如果這樣做后我們就會(huì)現(xiàn)這個(gè)命令看起來會(huì)更好。如果你僅僅是想打印第5行,你可以用這樣的命令::5 print.當(dāng)然了我們也可以使用一些特殊的數(shù)字標(biāo)記,例如字符$是指最后一行,因而如果我們想要打印全文的時(shí)候我們可以用這樣的命令::1,$ print.而字符%是指整篇文章(1,$),因而我們也可用這樣的命令來打印整篇文章::% print,而.則是指當(dāng)前行,我們要打印當(dāng)前可以用:print命令而不帶任何參數(shù),也可以用這樣的命令:.print。我們還可以用指定句子中內(nèi)容來打印選定的行。例如在我們的文章中我們可以用這樣的命令來打印含有字符ex的行::/ex/ print。這樣就會(huì)打印出含用ex的行,并會(huì)高亮顯示出ex。同樣命令:?ex? print也會(huì)達(dá)到同樣的作用,而命令:?ex? print也正是打印含有ex字符的命令格式。
在前面的學(xué)習(xí)中我們曾學(xué)過標(biāo)記命令m,例如我們可以在任何地方用命令ma做上標(biāo)記,然后在其他的地方可以用命令‘a(chǎn)回到做了標(biāo)記的地方。這個(gè)命令也可以與print命令組合。例如我們可以在一個(gè)地方用命令ma做上標(biāo)記,然后在其他的地方用命令mb做上另外的標(biāo)記,然后我們就可以執(zhí)行下面的命令來打印這兩個(gè)標(biāo)記之間的內(nèi)容了::'a,'b print
我們也可以在可視化的模式下來選定要打印的內(nèi)容。例如我們用命令V進(jìn)入可視化模式并選定一段內(nèi)容,這時(shí)我們輸入:就會(huì)在Vim的底部顯示<,>兩個(gè)字符,這兩個(gè)字符分別指我們的選定內(nèi)容的開頭和結(jié)束部分。
命令:substitute可以使我們將指定的字符換成其他的字符。這個(gè)命令的格式是這樣的:
:range substitute /from/to flags
在這個(gè)命令中range是指定了范圍,也就說是在哪些行里做替換。而后是說將字符串from替換成字符串to。在默認(rèn)的情況下,這個(gè)替換命令僅是將一行中第一個(gè)出的的字符替換成給定的字符。而如果我們想將所有出現(xiàn)的字符都替換成給定的字符我們就用g這個(gè)標(biāo)記命令。例如::% substitute /from/to/g.這個(gè)命令就達(dá)到將所有出現(xiàn)from的地方全部替換成to。其他的標(biāo)記(flags)包括:p(print),這個(gè)命令是告訴substitute打印所做的改動(dòng)。c(confirm),這個(gè)命令是告訴substitute命令在做出這樣的改動(dòng)以前要詢問是否要做這樣的改動(dòng)例如如果我們執(zhí)行下面的命令::1,$ substitute /Professor/Teacher/c.在Vim就會(huì)顯示我們將要做改動(dòng)的文本,并顯示下面的內(nèi)容:
Prfessor: You mean it's not supposed to do that?
replace with Teacher(y/n/a/q/^E/^Y)?
這時(shí)你可以做出以下這樣的回答:
y 執(zhí)行這個(gè)替換
n 跳過這個(gè)替換
a 執(zhí)行所有的替換不要做詢問
q 退出,不做任何改動(dòng)
CTRL─E  向上翻滾一行
CTRL-Y 向下翻滾一行
在Vim的命令還有一些命令可以幫助我們很好的完成我的工作:例如命令:read filename可讀進(jìn)一個(gè)文件并將讀進(jìn)和內(nèi)容插在當(dāng)前行的后面。而命令:write是將文件寫入。這是一個(gè)保存我們工作的方法。我們也可以用命令:write newfile將當(dāng)前的文件內(nèi)容寫入一個(gè)新的文件。一般情況下:write命令并不會(huì)覆蓋已經(jīng)存在的文件。我們可以用強(qiáng)制操作(?。┻x項(xiàng)來完成我們所需要的操作并覆蓋當(dāng)前已經(jīng)存在的文件。而這個(gè)命令對于我們要將一個(gè)大的文件分拆為小的文件時(shí)顯得更有用。我們可以用可視化模式選定一個(gè)范圍然后將這個(gè)選定的范圍寫入新的文件,從而實(shí)現(xiàn)了分拆的目的。
我們還可以Vim中不需要退出而執(zhí)行Shell命令。命令:shell可以使們進(jìn)入命令終端執(zhí)行我們需要的命令。當(dāng)我們要退出終端回到Vim中時(shí)可以執(zhí)行exit命令。我想這對于程序人員來說真是一個(gè)巨大的幫助。:)

vi編輯器的學(xué)習(xí)使用(十)
在我們談起Vim編輯器似乎只是覺得他只是一個(gè)類似于一個(gè)命令行方式的文本編輯器。而事實(shí)上不是這樣的。Vim在窗口環(huán)境中也可以完美的完成我們的工作。在窗口環(huán)境下,我們不僅可以使用那些在Vim文本方式下的命令來完成工作,而且還有許多的菜單和其他的選項(xiàng)。這些都使得我們可以完美的來完成我們的工作。
我們要啟動(dòng)圖形界面的Vim可以用下面的命令:gvim file。這樣就可以打開圖形界面來編輯文本file。圖形界面下的Vim編輯器的外觀因你所用的操作系統(tǒng)的不同而有所不同,就是同樣的操作系統(tǒng)也會(huì)因你所使用的工具集不同(Motif,Athena,GTK)而會(huì)呈現(xiàn)不同的外觀。而值得向大家推薦的是GTK版本的Vim編輯器,當(dāng)然其他版本的也是可以來完美的完成我們的工作的。
在Windows系統(tǒng)中我們可以在標(biāo)準(zhǔn)形式下用鼠標(biāo)來選擇文本,而在X Window系統(tǒng)中我們也會(huì)有一個(gè)標(biāo)準(zhǔn)的系統(tǒng)來使用鼠標(biāo),但是這兩種標(biāo)準(zhǔn)是不同的。然而比較幸運(yùn)的是我們可以定制我們的Vim編輯器。我們可以使得我們的Vim中的鼠標(biāo)的行為看起來像是X Window系統(tǒng)中的鼠標(biāo)的行為。下面的命令是設(shè)置鼠標(biāo)的行為為X Window風(fēng)格的鼠標(biāo)行為::behave xterm。而下面的命令則是使得鼠標(biāo)的行為是Windows風(fēng)格的行為::behave mswin。在UNIX和Linux系統(tǒng)中的鼠標(biāo)風(fēng)格是xterm風(fēng)格,而在Windows中的鼠標(biāo)風(fēng)格是在安裝過程中選擇的。為了控制鼠標(biāo)的行為,命令:behave有以下這些選項(xiàng):
        Setting for        Setting for
Option        :behave mswin        :behave xterm
'selectmode'    mouse,key        (empty)
'mousemodel'    popup            extend
'keymodel'    startsel,stopsel    (empty)
'selection'    exclusive        inclusive
xterm的鼠標(biāo)風(fēng)格的行為主要有以下一些:
左鍵:        移動(dòng)光標(biāo)
拉動(dòng)左鍵:    在可視化模式下選擇文本
右鍵:        選中光標(biāo)處到右鍵點(diǎn)擊處的文本
中鍵:        在光標(biāo)處粘貼選中的文本
Windows的鼠標(biāo)風(fēng)格的行為主要有以下一些:
左鍵:        移動(dòng)光標(biāo)   
拉動(dòng)左鍵:    在選擇模式下選中文本
    選中到光標(biāo)處的文本
    顯示彈出菜單
中鍵:        將系統(tǒng)剪切板中的文本粘貼到文件
(注:其中的S為Shift鍵)
其他的一些特殊的用法:
Shift+左鍵:    向前搜索光標(biāo)處的文本
Shift+右鍵:    向后搜索光標(biāo)處的文本
Ctrl+左鍵:    跳轉(zhuǎn)到以光標(biāo)處的文本為名字的標(biāo)記(tag)處
Ctrl+右鍵:    跳轉(zhuǎn)到前一個(gè)標(biāo)記處
在圖形界面的Vim編輯器還有一個(gè)有趣的特征,那就是當(dāng)我們點(diǎn)開一個(gè)菜單時(shí)就會(huì)發(fā)在子菜單的第一行有一條虛線,點(diǎn)擊此虛線就可以將這個(gè)菜單移其他的地方。關(guān)閉后Vim的菜單結(jié)構(gòu)又恢復(fù)到正常的狀態(tài)了。在GTK版本和Windows版本中的圖形界面的Vim還有一個(gè)工具欄,這些工具可以快速的完成我們的工作。


vi編輯器的學(xué)習(xí)使用(十一)
雖然現(xiàn)在的專業(yè)的文字處理軟件例如MS Word,Star Office,Open Office等可以很好的來完成的一些文檔處理的工作,但是人們?nèi)匀皇窍矚g用純文本的形式來處理手中的文本.這里因?yàn)橛眉兾谋咎幚淼奈募容^容易閱讀,不像那些專業(yè)的字處理軟件,有專門的文件存儲格式,少了許多的麻煩.Vim是一個(gè)強(qiáng)大的文本編輯器,他也可以像那些專來的字處理軟件一樣來處理我們手中的文本工作,從而使得我們的工作來得更漂亮.
Vim在默認(rèn)的情況下是不會(huì)自動(dòng)換行的,這也就是說我們在默認(rèn)的情況下我們不得不自己決佇回車的位置.這樣的設(shè)置對于處理程序文件來說是一件相當(dāng)好的事情,因?yàn)檫@樣可以由我們自己來決定回定回車換行的位置,從而可以很好的來完成我們的程序設(shè)計(jì)工作.但是如果我們是在處理一些文檔工作,那么這個(gè)問題就有一些成為困撓我們的問題了.幸運(yùn)的是Vim提供了這樣的功能可以使我們來解決這樣的問題.當(dāng)我們指定了textwidth這個(gè)選項(xiàng)后,Vim就會(huì)自動(dòng)的在相應(yīng)的地方加上換行符.例如我們可以用下面的命令來指定一個(gè)只有30列的文本:
:set textwidth=30
這樣以后當(dāng)我們再輸入文本時(shí)如果達(dá)到30這個(gè)限制,Vim就會(huì)自動(dòng)的依據(jù)情況來加上換行符.在Vim中我們可以有兩種方法來選擇換行的方式.例如下面的命令是告訴Vim從左面算起30個(gè)字符時(shí)換行::set textwidth=30
而下面的命令則是告訴Vim從右面算起當(dāng)達(dá)到margin個(gè)字符的空白時(shí)要換行:
:set wrapmargin=margin這里的margin是空白字符的個(gè)數(shù).例如如果你有一個(gè)80個(gè)字符寬的文本,下面的兩個(gè)命令則是起到了同樣的作用:
:set wrapmargin=10
:set textwidth=70
Vim并不是那些專業(yè)的字處理軟件,在我們指定了文本寬度的情況下,當(dāng)我們將一行中的前幾個(gè)文字刪掉的話,Vim并不會(huì)像那些專業(yè)的字處理軟件那樣將后面行中的文本移到前面的行上,而是形成了一些長短不一的段落.這樣看起來不是很好,因?yàn)槲覀冃枰氖怯型伙L(fēng)格的文本形式.在Vim中這樣的情況可以有幾種處理方法:一是在可視化模式下選中這些文本,然后用gp命令來格式化選中的段落.另一種方法就可以使用gqmotion的命令來完成格式.例如我們要格式化5行,我們就可以用下面的命令:gq4j.這個(gè)命令是告訴Vim編輯要格式化本行,同時(shí)要格式化下面的4行.這樣就達(dá)到了格式化5行的目的.在這樣的情況下,向前移動(dòng)的命令}這時(shí)就會(huì)為我們提供更大的便利了.這時(shí)我們的做法是這樣的:將光標(biāo)放在我們要格式化段落的第一行上,然后執(zhí)行命令gq}.這樣就可以達(dá)到我們的目的了.這樣方法要簡便得多,因?yàn)槲覀儾槐匾贁?shù)細(xì)數(shù)我們要格式化多少行了.命令gqip可以格式化當(dāng)前的段落.這個(gè)命令要比上一個(gè)的格式命令還要簡便一些,因?yàn)樵谶@樣的情況下我們不必要將光標(biāo)放在一個(gè)段落的第一行了.最后如果我們要想格式化一行的可以使用命令gqgq,當(dāng)然了我們也可以簡記為gqq.
我們都知道在專業(yè)的文字處理軟件中有文本對齊的選項(xiàng),而這在Vim當(dāng)中也是可以做到的.如果要將文本居中對齊我們可以用這樣的命令::range ceter width.在這個(gè)命令中如果我們沒有指定textwidth的值,他將使用我們設(shè)置的textwidth的值,如果我們也沒有設(shè)置這個(gè)值,那么他將使用系統(tǒng)定義的80.例如我們要將1到5行的內(nèi)容居中對齊,我們可以使用下面的命令:
:1,5 center 30
同理右對齊的命令也可以類似的寫成:
:1,5 right 30
但是左對齊的命令就與這兩個(gè)命令有一些不同了,左對齊的命令為:
:range left margin
在這個(gè)命令中左對齊的參數(shù)并不是文本的寬度,而在文本左邊的空白字符的寬度,如果為0,那么將緊靠屏幕的左邊沿.在Vim中并沒有內(nèi)置的方法來對齊文本,但是我們可以使用一個(gè)簡潔的宏包來完成這樣的工作.要使用這個(gè)包先執(zhí)行下面的命令:
:source $VIMRUNTIME/macros/justify.vim
在這個(gè)包中定義了一個(gè)新的可視化的命令_j.要對齊一個(gè)文本塊,可以在可視化模式中高亮顯示這個(gè)文本塊,然后執(zhí)行命令_j.
J命令可以使兩行合并為一行,同時(shí)用空格為分格這兩行.在文本處理中有一個(gè)joinspace的選項(xiàng),如果設(shè)置了這個(gè)選項(xiàng),那么可果一行是以標(biāo)點(diǎn)符號來結(jié)尾的,那么在用這個(gè)命令后會(huì)用兩個(gè)空格來區(qū)分這兩行.也就是說如果我們用命令:set nojoinspace ,用J命令來合并這兩行時(shí)會(huì)用一個(gè)空格來區(qū)分.但是如果我們用命令::set joinspace ,用J命令來合并這兩行時(shí)會(huì)用兩個(gè)空格來區(qū).這就是這個(gè)選項(xiàng)所要起到的作用.
在Vim編輯器中我們可以通過設(shè)置formatoptions選項(xiàng)來設(shè)置Vim中的文本和注釋的換行方式.這個(gè)命令為:
:set formatoptions=character
在這個(gè)命令中character一組格式化的標(biāo)記,他可以是下面的一些字符:
t    文本自動(dòng)換行
c    注釋自動(dòng)換行,同時(shí)自動(dòng)在行首添加注釋標(biāo)記
r    當(dāng)添加新行時(shí)自動(dòng)添加注釋符
o    當(dāng)用O和o開始新的一行時(shí)自動(dòng)在行首添加注釋符
q    允許使用gq來格式化文本
2    第二行縮進(jìn)兩個(gè)字符
v    采用老的vi換行方式,當(dāng)你輸入空格時(shí)換行
b    在達(dá)到textwidth以前當(dāng)輸入空格時(shí)換行
l    在插入模式下不換行,只用gq來完成相應(yīng)的工作
下面讓我們來看一下這些選項(xiàng)是如何來工作的:
當(dāng)需要文本自動(dòng)換行時(shí)要打開t標(biāo)記,當(dāng)需要注釋自動(dòng)換行時(shí)要打c標(biāo)記.所以對于一個(gè)要處理程序文件的人來說打開注釋自動(dòng)換行似乎要有更大的幫助:
:set formatoptions=c
這樣在注釋中的一個(gè)長句就會(huì)自動(dòng)換行,而正常的程序文本就不會(huì)被自動(dòng)換行.事實(shí)上我們常做些這樣的選項(xiàng):
:set formatoptions=cq
這個(gè)選項(xiàng)是告訴Vim編輯器不僅注釋要自動(dòng)換行,而且這些注釋可以使用gq命令來格式化.
Vim編輯器可以很好的處理注釋的問題.在C程序風(fēng)格的程序文本處理過程中,當(dāng)注釋自動(dòng)換行時(shí)Vim會(huì)自動(dòng)在注釋的開頭加下注釋標(biāo)記.但是在這樣的設(shè)置也還是存在一個(gè)問題的,那就是當(dāng)你回車時(shí)Vim就不會(huì)在下一行的開頭自動(dòng)加上注釋標(biāo)記了.如果這一行仍寫的是注釋,那么就要你親自來加上了.但是當(dāng)我們打開r這個(gè)標(biāo)記后就會(huì)解決這個(gè)問題了.這時(shí)如果你打回車,Vim編輯器還會(huì)在新的一行加上注釋標(biāo)記.這時(shí)如果你要想在下一行寫程序文本,那么就不得不動(dòng)手刪除注釋標(biāo)記了.如果你希望當(dāng)用O或是o添加新的一行時(shí)要自動(dòng)添加注釋標(biāo)記就要打開o這個(gè)格式標(biāo)記了.
格式標(biāo)記選項(xiàng)是告訴Vim編輯器在格式文本中要從第二行開始而不是第一行.設(shè)置這個(gè)選項(xiàng)的命令為:
:set formatoptions+=2
而v標(biāo)記則控制一個(gè)句子從哪里進(jìn)行分裂.例如現(xiàn)在我們有一個(gè)句子:
This is a test of the very long warpp.
現(xiàn)在我們要在這個(gè)句子的后面新增一個(gè)詞logic
如果沒有v標(biāo)記結(jié)果就會(huì)變成:
This is a test of the very
long line warpping logic.
而如果打開v標(biāo)記,結(jié)果就會(huì)變成:
This is a test of the very long line wrapping
logic.
令管已經(jīng)存在的文本已經(jīng)遠(yuǎn)遠(yuǎn)的超過了textwidth的限制,但是因?yàn)樵O(shè)置了v標(biāo)記,所以Vim編輯器也不會(huì)換行,相反只有你新增了一個(gè)詞時(shí)才會(huì)換行.
在默認(rèn)的情況下vim編輯器是使用內(nèi)部的格式程序來模式文本,當(dāng)然了我們也可以使用外部的格式程序來格式我們的文本.在UNIX和Linux系統(tǒng)中有一個(gè)標(biāo)準(zhǔn)的程序fmt可以很好的來做這樣的工作.如果我們想用命令gq來執(zhí)行這個(gè)處部命令,我們可這樣的來進(jìn)行設(shè)置:
:set formatprg=fmt
即使是沒有進(jìn)行這樣的設(shè)置,我們也可以使用命令!來格式文本.例如如果我們想用程序fmt來格式一個(gè)段落,我們可以用這樣的命令:!}fmt.!是開始了一個(gè)過濾命令,而}是告訴Vim過濾一個(gè)段落.fmt是我們要使用的命令的名字.
在早期的打印機(jī)的時(shí)代,開始新的一行要占用兩個(gè)字符的時(shí)間.如果到了一行的結(jié)尾處,你要他快速的回到新的一行的開頭,打印的針頭在紙面上飛快到掠過,常常就會(huì)在紙面的中間留不希望的污點(diǎn).這個(gè)問題的解決辦法就是用兩個(gè)字符來解決:一個(gè)字符來移到第一列,而字符來新增一行.計(jì)算機(jī)產(chǎn)生以后,存儲較為昂貴,在如何解決回車換行這個(gè)老問題上,人們產(chǎn)生了不同的意見.UNIX人認(rèn)為在到達(dá)一行的結(jié)尾時(shí)新增一行(),而蘋果人則認(rèn)同的解決辦法,MS則堅(jiān)持古老的,的方法.這就意味著如果你將一個(gè)文件從一個(gè)系統(tǒng)轉(zhuǎn)移到另一個(gè)系統(tǒng),你就面臨著回車換行的問題.而Vim編輯器則會(huì)自動(dòng)的認(rèn)出這種文件格式方面的區(qū)別,并會(huì)為我們做出相應(yīng)的處理.
fileformats選項(xiàng)包含了許多當(dāng)編輯一個(gè)新文件時(shí)會(huì)用到的一些文件格式.例如下面的命令就是告訴vim編輯器將UNIX的文件格式做為第一選擇,而將MS-DOS的文件格式做為第二選擇:
:set fileformats=unix,dos
檢測到的文件格式會(huì)被存放在fileformat選項(xiàng)中,我們可以且下面的命令來查找我們所使用的文件格式:
:set fileformat?
我們還可以應(yīng)用fileformat這個(gè)選項(xiàng)將一個(gè)文件從一種文件模式轉(zhuǎn)換成另一種文件格式.例如我們有一個(gè)名為readme.txt的MS-DOS文件格式的文件,而我們想將他轉(zhuǎn)換為UNIX文件格式的文件.我們可以按照下面的方法來做:
首行編輯該文件:
$ vim readme.txt
其次將文件格式改為UNIX文件格式:
:set fileformat=unix
然后保存該文件,此時(shí)這個(gè)文件就轉(zhuǎn)換成為了UNIX文件格式的文件.
在默認(rèn)的情況下Vim編輯器認(rèn)為我們的文件是由行組成的,也就是他認(rèn)為文件中的最后一行是以為結(jié)束符的.有時(shí)我們會(huì)遇到不包含有結(jié)束標(biāo)記行的文件,當(dāng)Vim遇到這樣的文件時(shí),他就會(huì)設(shè)置noendofline選項(xiàng),而當(dāng)遇到正常結(jié)束符的文件時(shí)則會(huì)設(shè)置endofline選項(xiàng).如果你想設(shè)置你的文件以結(jié)束符結(jié)尾則可以用下面的命令:
:set endofline
如果你想設(shè)置一個(gè)文件不以結(jié)束符來結(jié)尾,則可以用下面的命令:
;set noendofline
在Vim中,我們有一系列的命令可使得我們在文件中進(jìn)行移動(dòng),例如)命令向前移動(dòng)一個(gè)句子,而(是向后移動(dòng)一個(gè)句子,}向前移動(dòng)一個(gè)段落,而{是向后移動(dòng)一個(gè)段落.
曾經(jīng)Troff是UNIX系統(tǒng)上專業(yè)的字處理程序,雖然在現(xiàn)代這個(gè)程序已經(jīng)很少用了,可是Vim還是包含了一些選項(xiàng)使得我們可以用這種曾經(jīng)的方式來處理文本.Troff需要用宏來告訴他應(yīng)做一些什么.其中的一些宏開始一個(gè)新的段落.因?yàn)門roff要用許多的宏包來,因而Vim需要知道哪些宏將開始一個(gè)新的段落.paragraphs選項(xiàng)可以做這些工作.這個(gè)選項(xiàng)的格式如下:
:set paragraphs="macromacro..."
每一個(gè)宏是兩個(gè)字符的Troff宏名,例如:set paragraphs="P LP"是告訴Vim宏.P和.LP開始一個(gè)新行.在默認(rèn)的情況下paragraph的選項(xiàng)如下:
:set paragraphs=IPLPPPQPP LIpplpipbp
這個(gè)命令列出下面的一些開始一個(gè)新段落的宏名:
.IP .LP .PP .QP .P .LI .pp .lp .ip .bp
我們可以使用命令[[和[]向前移動(dòng)一個(gè)區(qū)間,而使用命令]]和][向后移動(dòng)一個(gè)區(qū)間,一個(gè)區(qū)間是用頁分隔符(CTRL-L)定義的文本.我們也可以用Troff的宏來定義一個(gè)區(qū)間,section選項(xiàng)有些類似于paragraph選項(xiàng),所不同的是前者定義一個(gè)宏用來分隔區(qū)間,而后者是段落.默認(rèn)情況下是這樣的;
:set section=SHNHH HUnhsh
在用Vim進(jìn)行文本處理時(shí)我們還可以對文本進(jìn)行加密處理,這種加密處理是最弱的一種加密處理方法,常常用新聞的發(fā)布.這時(shí)我們要用到的命令為g?motion.例如我們可以用命令g?g?或者是g??來加密當(dāng)前行.當(dāng)我們對一文本進(jìn)行兩次加密處理就為解密處理了.


vi編輯器的學(xué)習(xí)使用(十二)
我們在用Vim來處理文件時(shí)可以使用Vim的自動(dòng)完成功能來大大加速我們的工作速度.所謂的自動(dòng)完成也就是說當(dāng)我們輸入一個(gè)單詞的一部分以后,按CTRL-P,Vim就會(huì)自動(dòng)的來完成剩下的部分.我們在前面的學(xué)習(xí)過程中曾用:abbreviate命令來簡記某一個(gè)單詞來達(dá)到自動(dòng)完成的目的,而在這里我們將看到是一個(gè)更加強(qiáng)大的自動(dòng)完成功能.Vim能非常簡單和靈活的來決定要用哪一個(gè)單詞來自動(dòng)完成. 我們在使用Vim這個(gè)強(qiáng)大的自動(dòng)完成功能的同時(shí),還可以自已定義我們的自動(dòng)完成的特征,而且還可以使用不同類型的自動(dòng)完成功能.
如果我們在編寫C程序,而我們所謂得到的下面的一個(gè)句子:
total=ch_array[0]+ch_array[1]+ch_array[2]
這時(shí)我們輸入total=ch_array[0]+ch_,然后按下CTRL-P,Vim就會(huì)自動(dòng)的替我們完成其余的部分,這時(shí)我們得到將是
total=ch_array[0]+ch_array
由此可以看到我們在處理文件時(shí)用這樣的方式可以大大的加快我們的處理速度.
那么Vim是如何找到匹配的單詞的呢?在默認(rèn)的情況下,Vim在查找一個(gè)單詞時(shí)是按照如下的步驟:
1 在當(dāng)前文件中進(jìn)行查找
2 在其他窗口中進(jìn)行查找
3 在其他的已裝入的緩沖區(qū)中進(jìn)行查找
4 在沒有裝入緩沖區(qū)的文件中進(jìn)行查找
5 在當(dāng)前的標(biāo)記(tag)列表是進(jìn)行查找
6 在所有的由當(dāng)前文件的#include包含進(jìn)來的文件中進(jìn)行查找
當(dāng)然了我們也可以自定義我們的查找順序.
我們在使用自動(dòng)完成功能時(shí)的命令CTRL-P是向后查找匹配的單詞,而還有一個(gè)命令CTRL-N是向前查找匹配的單詞.他們有同樣的功能和作用,所不同的只是查找方向上的不同.
Vim還提供了許多的命令可以使得我們來自定義我們的一些查找上的特征.例如我們可以用下面的命令來告訴Vim在在自動(dòng)完成的查找過程中忽略大小寫的區(qū)別:
:set ignorecase
這樣以后如果我們輸入ins,Vim就會(huì)認(rèn)為是INSERT,Inside或者是instep.當(dāng)然了前提是在我們所編輯的文本中含有這些詞,要不就會(huì)找得到了.
為了能夠精確的進(jìn)行查找來自動(dòng)完成,我們并不希望上面的情況出現(xiàn),我們可以設(shè)置一些選項(xiàng)來告訴Vim區(qū)分大小寫的情況.這時(shí)我們要用到下面的命令:
:set infercase
這樣以后如果我們再輸入ins,與其相匹配的列表就成為了instep,inside,insert.我們可以通過按CTRL-P或是CTRL-N來進(jìn)行匹配完成.
在大多數(shù)情況下,Vim默認(rèn)的設(shè)置可以很好的來完成工作,但是有時(shí)我們要定義自己的一些完成的選項(xiàng),這時(shí)我們就要用到complete這個(gè)選項(xiàng)了.這個(gè)選項(xiàng)的格式如下:
:set complete=key,key,key
而這個(gè)命令中可能出現(xiàn)的key值如下:
.    當(dāng)前文件
b    已被裝緩沖區(qū),但是沒有在窗口內(nèi)的文件
d    在當(dāng)前的文件中定義和由#include包含進(jìn)來的文件
i    由#include包含進(jìn)來的文件
k    由dictionary選項(xiàng)定義的文件
kfile    名為{file}的文件
t    標(biāo)記(tags)文件
u    沒有載入的緩沖區(qū)
w    在其他窗口中的文件
我們可以使用path選項(xiàng)來告訴Vim如何來查找我們在當(dāng)前文件中所包含進(jìn)來的文件.我們還可以指定一個(gè)字典,這個(gè)選項(xiàng)的格式如下:
:set dictionary=file,file,....
這個(gè)選項(xiàng)定義了由命令CTRL-P和CTRL-N進(jìn)行匹配查找時(shí)所要查找的文件.在Linux系統(tǒng)中這個(gè)定義文件在/usr/dict/words中,所以如果我們要將這個(gè)文件添加進(jìn)來進(jìn)行查找的話,我們就要用到下面的命令:
:set dictionary=/usr/dict/words
如果我們要使用一個(gè)我們自己的文件也可以這樣的來設(shè)置
:set dictionary=/home/oualline/words,/usr/doc/words
我們也可以指定一個(gè)字典文件和k選項(xiàng)組合使用:
:set dictionary=k/usr/oualline/words
我們也可以多次的使用k這個(gè)標(biāo)記選項(xiàng):
:set dictionary=k/usr/dict/words,k/usr/share/words
在上面提到的CTRL-P和CTRL-N進(jìn)行查找匹配時(shí)查找的范圍比較的寬范,我們當(dāng)然也可以使用命令進(jìn)行一些比較嚴(yán)格的查找.這時(shí)我們可以使用命令CTRL-X.當(dāng)我們輸入CTRL-X時(shí)我們會(huì)進(jìn)入CTRL-X的一個(gè)子模式.這時(shí)我們可以使用下面的命令進(jìn)行查找:
CTRL-D    宏定義
CTRL-F    文件名
CTRL-K    字典
CTRL-I    當(dāng)前文件以及由#include包含進(jìn)來的文件
CTRL-L    整個(gè)行
CTRL-]    標(biāo)記(tags)
CTRL-P    向前查找,與沒有CTRL-X命令時(shí)相同
CTRL-N    向后查找,與沒有CTRL-X命令時(shí)相同
CTRL-X
CTRL-D命令查找宏定義.他也會(huì)查找#include文件.當(dāng)我們執(zhí)行完這個(gè)命令以后就可以使用CTRL-P,CTRL-N來進(jìn)行匹配查找.
例如我們可以編輯下面的測試文件:
include.h文件中的內(nèi)容
#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文件中的內(nèi)容:
#include "include.h"
#define MORE "/usr/ucb/more"
這時(shí)我們開始編輯main.c文件,如果我們按下CTRL-X我們就會(huì)進(jìn)入CTRL-X的子模式.如果我們要查找一個(gè)宏定義,我們可以按下CTRL-D,這時(shí)就會(huì)在屏幕的底部簡單的顯示出有多少匹配的選項(xiàng).這樣我們就可以用CTRL-P和CTRL-N來進(jìn)行自動(dòng)完成的功能了.而命令CTRL-X CTRL-]則是查找下一個(gè)標(biāo)記(tag),標(biāo)記是一個(gè)C函數(shù)的定義.我們可以用命令ctags命令來生成一個(gè)C函數(shù)定義的列表.我們可以這樣的來使用這個(gè)命令:
$ctags *.c *.h
這樣以后我們就可以在插入模式入下用CTRL-X CTRL-]命令來進(jìn)行標(biāo)記的查找和匹配了.
在默認(rèn)的情況下,vim編輯器只是簡單的顯示出標(biāo)記的名字,我們可以執(zhí)行下面的命令,這樣以后就可以顯示出整個(gè)標(biāo)記了:
:set showfulltag
我們可以使用CTRL-X CTRL-F命令來匹配文件名.他會(huì)在當(dāng)前的目錄下查找文件并會(huì)顯示出匹配的內(nèi)容,這時(shí)你就可以用CTRL-P和CTRL-N命令來選擇你想要的匹配選項(xiàng)了.
到目前為止我們所說還只是對單詞進(jìn)行操作,我們可以用命令CTRL-X CTRL-L對一行進(jìn)行匹配操作,同樣的我們也可以用CTRL-N和CTRL-P來進(jìn)行選項(xiàng)的匹配.我們還可以在輸入CTRL-X命令后用CTRL-Y向下滾動(dòng)文本,而用CTRL-E向上滾動(dòng)文本.


vi編輯器的學(xué)習(xí)使用(十三)
Vim最大的一個(gè)優(yōu)點(diǎn)就是他的靈活性.使得他具有如此靈活性的一個(gè)重要原因就是自動(dòng)命令.所謂的自動(dòng)命令就是一條命令,所不同的只是他可以在某些事件發(fā)生時(shí)自動(dòng)執(zhí)行.
例如通過Vim的這樣自動(dòng)命令,我們可以使用Vim來編輯壓縮文件,這是因?yàn)槲覀兛梢远x一個(gè)自動(dòng)命令在我們讀取文件時(shí)解壓縮,在我們寫入文件時(shí)進(jìn)行壓縮.
我們在處理文件時(shí)有時(shí)希望文件在保存時(shí)在文件的結(jié)尾處插入當(dāng)前的日期,而這在Vim當(dāng)中我們可以使用自動(dòng)命令來完成.我們可以定義這樣的一個(gè)函數(shù):
:function DateInsert()
:    $read !date    "在文件的結(jié)尾處插入日期
:endfunction
當(dāng)我們要保存文件時(shí)可以調(diào)用這個(gè)函數(shù):
:call DateInsert()
然后我們就可以保存退出了.
我們還可以將這個(gè)功能綁定在一個(gè)按鍵上:
:map :call DateInsert()\|:write
這種方法使用問題的解決更簡單,因?yàn)槲覀冎恍柙谝4嫖募r(shí)按一下F12鍵就可以了.
但是也許有時(shí)我們會(huì)忘記這樣的步驟,而使用正常的保存命令,那么這時(shí)這個(gè)函數(shù)也就失去了意義.我們希望這個(gè)插入日期的命令可以自動(dòng)被執(zhí)行,這也正是自動(dòng)命令的意義所在.
下面的命令就可以來滿足我們的要求了:
:autocmd FileWritePre * :callDateInsert()
這個(gè)命令會(huì)使得所有的文件在保存之前調(diào)用這個(gè)插入日期的函數(shù).我們并不需要每一次都要輸入:write來保存文件,也就是說當(dāng)我們定義了這個(gè)命令以后,當(dāng)我們輸入一次:write命令,vim就會(huì)自動(dòng)檢查所有未保存的文件并執(zhí)行我們定義的這個(gè)命令,然后執(zhí)行保存命令.
:autocmd命令的一般格式如下:
:autocmd group events file_patter nested command
在這個(gè)格式中組名(group)是一個(gè)可選項(xiàng),他被用于管理和調(diào)用命令.參數(shù)事件(events)是一個(gè)事件列表,指明引發(fā)命令的事件,而嵌套標(biāo)記(nested)可以允許嵌套自動(dòng)命令,最后是所要執(zhí)行的命令.
命令:augroup可以使得我們定義一組自動(dòng)命令.這個(gè)組名最好應(yīng)是一個(gè)和我們要定義的一組自動(dòng)命令相關(guān)聯(lián)的名字,如下面的例子:
:augroup cprograms
:    autocmd FileReadPost *.c :set cindent
:    autocmd FileReadPost *.cpp :set cindent
:augroup END
在這里因?yàn)檫@些自動(dòng)命令是在:augroup的作用域之內(nèi)的,所以他們被放在cprogram這個(gè)組內(nèi).這組自動(dòng)命令是在讀取C和Cpp之后執(zhí)行的.如果我們想在這個(gè)組中添加關(guān)于頭文件的自動(dòng)命令,我們可以使用:augroup命令,或者是在我們的定義中包含這個(gè)組名.
如果我們正在編輯的文件名為sam.cx,而我們想將他當(dāng)作C程序文件來對處理.這時(shí)我們可以通過命令來告訴Vim編輯器在文件讀入以后將他與*.c文件相匹配.我們所用的命令如下:
:doautocmd group event file_name
在這個(gè)命令執(zhí)行的時(shí)候,Vim是將假定當(dāng)前文件的名字為file_name,而實(shí)際上這并不是他真正的文件名.如果在這個(gè)命令中我們并沒有指明組(group),那么所有的組都會(huì)被用到.而且我們必須指明事件,并且Vim會(huì)認(rèn)為這個(gè)事件已經(jīng)發(fā)生.與命令:doautocmd相類似的是命令:doautoall,所不同的只是后者是針對每一個(gè)緩沖區(qū)(buffer).這個(gè)命令的格式為:
:doautoall group event file_name
我們可以使用下列的命令來引發(fā)命令:
BufNewFile            當(dāng)編輯一個(gè)新文件時(shí)引發(fā)命令
BufReadPre    BufReadPost    在讀入之前或是讀入之后引發(fā)命令
        BufRead        BufReadPost的另一種說法
BufFilePre    BufFilePost    在通過:file命令更改緩沖區(qū)名字之前或是之后引發(fā)
FileReadPre    FileReadPost
在用:read命令讀入文件之前或之后.在文件讀入之后,在文件的開頭和結(jié)尾處有由[和]來標(biāo)記
FilterReadPre    FilterReadPost    在用過濾命令(filter)讀入文件之前或之后
FileType            當(dāng)FileType設(shè)置時(shí)有效
Syntax                當(dāng)Syntax設(shè)置時(shí)有效
StdinReadPre    StdReadPost    由標(biāo)準(zhǔn)輸入設(shè)備讀入或是輸出
BufWritePre    BufWritePost    在將整個(gè)緩沖區(qū)寫入文件之前或是之后
BufWrite            BufWritePre的另一種說法
FileWritePre    FileWritePost    將部分緩沖區(qū)內(nèi)容寫入文件之前或是之后
FileAppendPre    FileAppendPost    將一個(gè)文件由過濾命令輸入之前或之后
FileChangedShell
這個(gè)事件是在Vim運(yùn)行Shell命令而文件的修改時(shí)間已經(jīng)改變時(shí)引發(fā)
FocusGained    FocusLost
這個(gè)事件是在Vim編輯器得到或是失運(yùn)輸入光標(biāo)時(shí)引發(fā).這意味著vim運(yùn)行圖形界面,并且是Vim成為當(dāng)前窗口或是其他的成為當(dāng)前窗口
CursorHold
用戶停止輸入的時(shí)間長于由updatetime所指定的時(shí)間時(shí)引發(fā)
BufEnter    BufLeave    當(dāng)進(jìn)入或離開緩沖區(qū)時(shí)引發(fā)
BufUnload            在緩沖區(qū)未載入之前引發(fā)
BufCreate    BufDelete    在緩沖區(qū)產(chǎn)生以后或是在緩沖區(qū)刪除以前引發(fā)
GuiEnter            啟動(dòng)GUI時(shí)引發(fā)
VimEnter            Vim啟動(dòng)而初始化文件還沒有讀入進(jìn)引發(fā)
VimLeave            退出Vim編輯器而.viminfo還沒有改寫時(shí)引發(fā)
FileEncoding            fileencoding已經(jīng)被設(shè)置時(shí)有效
TermChanged            term選項(xiàng)被更改時(shí)引發(fā)
User
并不是一個(gè)真正的事件,而是命令:doautocmd一起使用的一個(gè)事件
當(dāng)存文件時(shí),只有下列事件成對出現(xiàn)時(shí)才引發(fā):
BufWritePre    BufWritePost
FilterWritePre    FilterWritePost
FileAppendPre    FileAppendPost
FileWritePre    FileWritePost
當(dāng)讀文件進(jìn),只要下列事件中的一個(gè)被設(shè)置則會(huì)引發(fā):
BufNewFile
BufReadPre    BufReadPost
FilterReadPre    FilterReadPost
FileReadPre    FileReadPost
文件名類型與UNIX標(biāo)準(zhǔn)系統(tǒng)相匹配.下面列出是一些特殊字符匹配的情況:
*    匹配任意長度的任意字符
    匹配單個(gè)字符
'    分隔交替的類型
\?    字符?
\,    字符,
\character
將這個(gè)字符看作是一個(gè)要查找的類型字符,例如:a\+可以匹配,aa,aaa等等
一般情況下一個(gè)命令的執(zhí)行結(jié)果并不會(huì)引發(fā)另一個(gè)事件.例如Syntax的執(zhí)行結(jié)果并不會(huì)引發(fā)FileReadPre事件.但是如果我們在自動(dòng)命令中加入nested關(guān)鍵字就可以來引發(fā)了,例如下面的命令:
:autocmd FileChangedShell *.c nested e!
我們可以使用命令:autocmd列出所有的自動(dòng)命令.
如果我們想要得到所有這些命令中的一個(gè)子集命令,我們可以使用如下的命令:
:autocmd group event pattern
在這個(gè)命令中如果我們指定了group,那么就會(huì)所有與group相匹配的命令.event可以是以前定義的或是所有的事件,pattern指了與類型相匹配的文件選項(xiàng).只有那些與命令相匹配的命令才會(huì)被列出來.
我們可以建立我們自已的自動(dòng)命令,當(dāng)然了我們也可以移除那些我們不再需要的自動(dòng)命令.例如命令:autocmd!就可以移除所有的自動(dòng)命令.
我們也可以用下面的命令來移除指定的組命令:
:autocmd! group
在這個(gè)命令中我們當(dāng)然也可以為這個(gè)組指定事件或是類型
:autocmd! group event pattern
event可以用*代替所有的事件
我們可以用命令:autocmd!來移除那些已經(jīng)存在的自動(dòng)命令,我們還可以同時(shí)在一個(gè)命令中再新建一個(gè)我們自己的自動(dòng)命令.這個(gè)語法的格式如下:
:autocmd! group event pattern nested command
這個(gè)命令等價(jià)于下面的兩個(gè)命令:
:autocmd! group event pattern
:autocmd group event pattern nested command
有時(shí)我們并不想引發(fā)某個(gè)命令,在這樣的情況下我們可以設(shè)置eventignore選項(xiàng)來指定那些要忽略的事件.例如下面的命令將進(jìn)入窗口和離開窗口的事件忽略掉:
:set eventignore=WinEnter,WinLeave
如果要忽略所有的事件,可以用下面的命令:
:set eventignore=all

vi編輯器的學(xué)習(xí)使用(十四)
Vim編輯器的不僅可以使得我們編輯各種各樣的文件,而且還有一些附加的功能來完成我們的作.例如說Vim可以實(shí)現(xiàn)在對文本文件進(jìn)行加密,而且我們還可以通過一命令行參數(shù)來控制我們對文件的處理.我們還可以通過交換文本來實(shí)現(xiàn)對文件的修復(fù).
我們在用Vim時(shí)常用一些有用的命令行參數(shù),在這些命令行參數(shù)中最有用的一個(gè)要算是--help,這個(gè)命令行參數(shù)可以簡單的列出一個(gè)幫助屏幕,在這個(gè)屏幕上列出所有的命令行參數(shù).這個(gè)命令的執(zhí)行結(jié)果如下:
這個(gè)命令的格式如下:
$ vim --help
如果要查出我們所使用的Vim的版本,我們可以使用下面的命令:
$ vim --version
我們可以用-R參數(shù)來在只讀狀態(tài)下打開一個(gè)文件,命令格式如下:
$ vim -R filename

在大多數(shù)的系統(tǒng)中,這個(gè)命令與下面的命令是相同的:

$ view filename
-x參數(shù)可以告訴Vim編輯器對某一個(gè)文本文件進(jìn)行加密處理.例如我們想要建立一個(gè)文件來保存一些我們自己的小秘密時(shí)就可以使用下面的命令:
$ vim -x filename
這時(shí)Vim編輯器就會(huì)要你來輸入加密和解密時(shí)所需要的密碼.這樣以后我們就可以在正常的狀態(tài)下來編輯我們的文本文件了,當(dāng)我們完成編輯工作要退出時(shí),Vim就會(huì)將文本進(jìn)行加密處理后退出.當(dāng)我們想用cat或是type命令來打印出已進(jìn)行過加密處理的文件時(shí)會(huì)得到一些無意義的信息.
我們當(dāng)然是可以在加密和非加密兩種狀態(tài)下進(jìn)行選擇和切換.選項(xiàng)key包含了加密時(shí)的密碼.如果我們將這一項(xiàng)設(shè)為空,那么也就意味著我們關(guān)閉了加密選項(xiàng).這個(gè)命令為:
:set key=
如果我們設(shè)定了一個(gè)密碼,那么我們就打開了加密選項(xiàng).例如下面的命令:
:set key=
保存退出.此時(shí)的文件就沒有密碼,我們可以通cat和type命令來打印文件中的內(nèi)容.
而我們也可以通過樣的命令來重置我們的加密密碼.例如下面的命令:
:set key=secret
但是這樣的設(shè)置并不是一個(gè)好主意,因?yàn)樵谳斎脒@個(gè)命令時(shí)你所輸入的密碼是可以明文顯示的,別人在旁邊晃動(dòng)一下肩膀也許就可以看到了,因而這是一個(gè)不安全的加密方法.為了避免這樣的問題,我們可以使用:X命令,這個(gè)命令可以將我們所輸入的密碼用*打印出來,因而不易被人看到,所以安全得多.
但是我們要清楚的認(rèn)識到,Vim所采用的這種加密算法是很弱的.也許他可以防住偶爾路過的小偷,但是不可能防住一個(gè)很有時(shí)間的密碼學(xué)專家.同時(shí)我們還要認(rèn)識到我們在編輯文件時(shí)所使用的交換文件(swap file)并沒有經(jīng)過加密,因而當(dāng)我們在進(jìn)行文件編輯時(shí),一個(gè)有著超級權(quán)限的人可以通過交換文件得知我們所編輯的內(nèi)容.一個(gè)解決的辦法就是我們在編輯文件時(shí)不使用交換文件.如果我們在命令行參數(shù)中指定-n參數(shù),我們就可以在編輯文件時(shí)不使用交換文件,這時(shí)我們所輸入的內(nèi)容是存在內(nèi)存中的.例如我們可以使用下面的命令來編輯一個(gè)加密的文件同時(shí)不使用交換文件:
$ vim -x -n filename
但是我們應(yīng)該知道在不使用交換文件的情況下,防止了別人偷看我們編輯器的內(nèi)容,而我們也不可能通過這個(gè)交換文件來恢復(fù)我們的文件了.
因?yàn)椴皇褂媒粨Q文件時(shí)我們所輸入的內(nèi)容存在于內(nèi)存中,因而就百以文本方式存在的.任何人都可以通過查看編輯器的內(nèi)存來發(fā)現(xiàn)我們文件中的內(nèi)容.如果你真的是想保密你的文件,那只能在使用一個(gè)不用聯(lián)網(wǎng)的電腦,使用好的加密工具,當(dāng)電腦不用的時(shí)候我們要安全的鎖起來了.要不我們可要怎么辦呢?!:-)
想一下,如果我們要處理許多的文件,而要將這些文件中的字符串-person-換成Jones.我們應(yīng)怎么樣來做呢?一個(gè)辦法就是我們要輸入許多次來手工的更改(想一想這樣的事情有多的恐怖),另一個(gè)解決辦法就是我們可以寫一個(gè)Shell腳本或是批處理文件來做這樣的工作.Vim作為一個(gè)原始的屏幕編輯器在正常模式下啟動(dòng)可以極好的完成這樣的工作.然而要批處理,Vim并不會(huì)產(chǎn)生一個(gè)空的有注釋的文件,因而我們要使用ex的命令模式.這種方式給了我們一個(gè)極好的命令行的接口可以很容易的放入批文件中.
在我們這個(gè)例子中我們所需要的命令如下:
:%s/-person-/Jones/g
:write
:quit
我們將這些命令放入一個(gè)名為change.vim的文件中,然后在批模式下運(yùn)行Vim,這時(shí)我們可以使用這樣的命令:
$ vim -es file.txt<>
這個(gè)是告訴Vim是ex命令模式下運(yùn)行處理文件file.txt并從change.vim中讀入文件.-s標(biāo)記告訴Vim不要給出任何的輸出提示一類的內(nèi)容.
還有另外的一些命令行參數(shù)使得我們可以更好的來控制Vim編輯器:
-R    打開一個(gè)文件只讀
-m    允許修改.這個(gè)選項(xiàng)允許我們可以設(shè)置write選項(xiàng)和修改文件
-Z
受限模式.這個(gè)命令參數(shù)可阻止我們使用:shell命令或是其他的一些命令來使用外部的Shell.但是這個(gè)選項(xiàng)并不會(huì)阻止我們使用:vi命令來編輯文件.
另外還有一些命令行參數(shù)可以允許我們決定讀取哪一個(gè)初始化文件:
-u file
使用file為初始化文件,而不是使用.vimrc作為初始化文件.如果沒有這個(gè)文件,那么就不會(huì)用任何的初始化文件.
-U file
使用file而不使用.gvimrc作為初始化文件.如果沒有這個(gè)文件,同樣不使用任何的初始化文件.
-i file        使用file而不使用.viminfo作為初始化文件.
在UNIX系統(tǒng)中,Vim編輯器實(shí)際上是一個(gè)有著不同的名字或鏈接的文件.Vim編輯器在哪種模式下啟動(dòng),取決于我們用什么樣的命令或是名字來啟動(dòng)他.一些常用的命令如下:
vim    在終端模式下啟動(dòng)(在當(dāng)前窗口內(nèi)啟動(dòng)編輯)
gvim    在圖形模式下啟動(dòng)(編輯器啟動(dòng)他自己的窗口來進(jìn)行編輯)
ex    在ex模式下啟動(dòng)
view    在正常模式下啟動(dòng),只讀
gview    在圖形模式下啟動(dòng),只讀
rvim    在終端模式下啟動(dòng),受限
rview    在終端模式下啟動(dòng),只讀,受限
rgvim    在圖形模式下啟動(dòng),受限
rgview    在圖形模式下啟動(dòng),只讀,受限
vi    Linux下的啟動(dòng)命令,同vim
我們也可以通過命令行參數(shù)來設(shè)置初始化模式:
-g    在圖形模式下啟動(dòng)vim(與命令gvim相同)
-v    在可視化模式下啟動(dòng)(與命令vim相同)
-e    在ex模式下啟動(dòng)(與大多數(shù)系統(tǒng)上使用ex命令相同)
我們還可以使用一些命令行參數(shù)來調(diào)試我們的Vim編輯器,常用的命令行參數(shù)有下面的一些:
-Vnumber
顯示額外的信息以使我們知道在編輯器的內(nèi)部都做了一些什么.數(shù)字越大,我們得到的輸出信息也就越多.這個(gè)參數(shù)常用來調(diào)試我們的Vim編輯器腳本.
-f
前景.我們不要在背景模式下啟動(dòng)圖形界面.這個(gè)啟動(dòng)對于那些只有一個(gè)程序執(zhí)行完畢才開始執(zhí)行另一個(gè)程序的情況顯得尤為有用.當(dāng)然了這個(gè)選項(xiàng)對調(diào)試也是相當(dāng)有用的.
-w script
將用戶輸入的所有字符存入腳本文件.如果這個(gè)文件已經(jīng)存在,那么就追加在文件后面.
-W script    -W相類似,只是這個(gè)選項(xiàng)會(huì)覆蓋掉已經(jīng)存在的數(shù)據(jù)
-s script    用-w選項(xiàng)來恢復(fù)腳本記錄
-T terminal
設(shè)置終端類型.在UNIX系統(tǒng)中,這會(huì)改寫$TERM的環(huán)境變量(當(dāng)然了,如果$TERM環(huán)境變量錯(cuò)誤,其他的許多程序都將會(huì)崩潰)
我們還有一些兼容的命令行參數(shù).這些參數(shù)可以使得我們的Vim運(yùn)行起來更像是Vi;
-N
這個(gè)參數(shù)可以使得Vim以自己的方式來運(yùn)行,而不是不是像Vi的方式運(yùn)行.這個(gè)參數(shù)是被.vimrc文件默認(rèn)定義的.
-C
兼容模式.這個(gè)參數(shù)關(guān)掉了許多Vim的自己的特征,而是盡量的像Vi的方式一樣的運(yùn)行.
-l
Lisp模式.這種模式完全是由老版本的vi延續(xù)下來的.他設(shè)置了lisp和showmatch選項(xiàng).這時(shí)的Vim的與文件類型相關(guān)的命令都可以很好的處理Lisp程序,并且這是可以自動(dòng)完成的.
最后還有一些不知道該將他們歸為哪一類的命令行參數(shù):
-d device    打開編輯給定的設(shè)備文件
-b        二進(jìn)制模式.設(shè)置了noexpandtab,textwidth=0,nomodeline,binary
在一般的情況下,vim是不產(chǎn)生備份文件的.如果我們希望他產(chǎn)生備份文件,我們可以使用下面的命令:
:set backup
產(chǎn)生的備份文件的名稱是在原始文件名的最后加上了~.例如我們有一個(gè)名為data.txt的文件,那么由Vim所產(chǎn)生的備份文件名即為:data.txt~.
如果我們不喜歡這個(gè)備份文件的擴(kuò)展名,我們可以定義我們自己的備份文件擴(kuò)展名.這時(shí)我們要到下面的命令:
:set backupext=string
例如如果我們設(shè)置了backupext的值為.bak,那么新的備份文件名即為data.txt.bak   
如果我們設(shè)置了patchmode選項(xiàng),那么Vim編輯器就會(huì)以當(dāng)前文件名加上patchmode的值為文件名備份正在編輯的文件.但是我們要注意的是只有以這個(gè)文件名為文件名的備份文件不存在時(shí)才會(huì)產(chǎn)生這樣的備份文件.例如我們執(zhí)行下面的命令:
:set patchmode=.org
如果我們是第一次編輯一個(gè)已經(jīng)存在的文件:data.txt.當(dāng)我們執(zhí)行了這樣的命令保存退出想要看一下事實(shí)是否是這樣的.因?yàn)橐郧斑@個(gè)備份文件并不存在,所以會(huì)產(chǎn)生一個(gè)備份文件,名為:data.txt.org.但是當(dāng)我們再一次編輯這個(gè)文件保存退出后,因?yàn)檫@個(gè)備份文件已經(jīng)存在,所在現(xiàn)在的備份文件名:data.txt~.
通常情況下Vim編輯器會(huì)將備份文件放在與文件相同的目錄下,我們可以通過設(shè)置backupdir選項(xiàng)來選擇我們的備份文件存放的地方,例如我們想將備份文件放在~/tmp目錄下,我們可以通過執(zhí)行下面的命令來做到:
:set backupdir=~/tmp/
但是這樣的設(shè)置有時(shí)也會(huì)產(chǎn)生問題的,如果我們在不同的目錄下編輯具有相同文件名的文件,當(dāng)我們保存退出時(shí),Vim會(huì)將備份文件放在~/tmp/目錄下,名字的沖突會(huì)使得老的備份文件丟失.同時(shí)我們還要知道的就是這個(gè)選項(xiàng)可以同時(shí)設(shè)置幾個(gè)值,中間用逗來分隔.Vim會(huì)將備份文件放在第一個(gè)目錄下.
一般情況下,當(dāng)Vim保存文件時(shí),會(huì)執(zhí)行下面的步驟:
1
Vim要檢查Vim外面的文件是否被做了改動(dòng).例如也許有的人已將這個(gè)文件重新命名了,如果發(fā)生這樣的情況,Vim就會(huì)給出警告并詢問是否繼續(xù).
2
如果設(shè)置了writebackup或是backup選項(xiàng),Vim就會(huì)將舊的備份文件移除,同時(shí)產(chǎn)生一個(gè)當(dāng)前文件的副本做為新的備份文件
3 將緩沖區(qū)的內(nèi)容寫入文件.
4
如果設(shè)置了patchmode選項(xiàng)而不存patch文件,那么Vim就會(huì)將備份文件重命名成為patch文件
5 如果沒有設(shè)置backup選項(xiàng),而是設(shè)置了writebackup選項(xiàng),就會(huì)移除備份文件
Vim覆蓋已經(jīng)存在的文件的原因是因?yàn)橐Wo(hù)UNIX系統(tǒng)上的硬鏈接.在非UNIX系統(tǒng)上,備份文件只是通過重命名當(dāng)前文件來產(chǎn)生
注意:如果我們設(shè)置了nobackup和nowritebackup選項(xiàng),Vim會(huì)覆蓋已經(jīng)存在的文件.這在磁盤已滿而更新文件時(shí)會(huì)造成數(shù)據(jù)的丟失.
在默認(rèn)的情況下,Vim設(shè)置了writebackup選項(xiàng).這就意味著Vim很難會(huì)丟失數(shù)據(jù).通過采用這樣的方法,在磁盤已滿的情況下,我們就沒有機(jī)會(huì)丟失文件.也許我們會(huì)不能寫入新文件,但是我們不會(huì)丟失我們的舊文件.
我們在用Vim來編寫時(shí),Vim會(huì)在我們編寫的過程中產(chǎn)生一個(gè)臨時(shí)的交換文件,這個(gè)交換文件中包含著我們所做過的所有修改,當(dāng)我們完成編寫工作,保存退出后,這個(gè)臨時(shí)文件會(huì)被刪掉.但是如果Vim遇到了意外情況而退出時(shí),這個(gè)臨時(shí)文件會(huì)因?yàn)閬聿患皠h除而存在于硬盤上.當(dāng)Vim啟動(dòng)時(shí)他會(huì)檢查在當(dāng)前目錄中是否存著交換文件,如果存在,則意味著有一個(gè)Vim正在編輯此文件,或者是我們在Vim編輯器的過程中遇到意外而退出,從而留下交換文件.這時(shí)Vim就會(huì)給出警告信息,并會(huì)給我們機(jī)會(huì)要我們自己來決定我們下一步要怎么做.這時(shí)我們可以有以下四個(gè)選項(xiàng):
Open Read-Only(以只讀方式打開)
這個(gè)選項(xiàng)會(huì)告訴Vim以只讀方式打開.如果我們想要看到文件中的內(nèi)容或是有另一個(gè)編輯過程正在運(yùn)行,我們可以選擇這個(gè)選項(xiàng)
Edit anyway
如果我們選擇這個(gè)選項(xiàng)我們可以對這個(gè)文件進(jìn)行編輯.我們最好不要選擇這個(gè)選項(xiàng),除非我們對我們正在做的事情有著絕對的把握.這時(shí)我們應(yīng)該知道,如果同時(shí)有兩個(gè)或是多個(gè)編輯過程同時(shí)編輯一個(gè)文件,只有最后一個(gè)保存的編輯過程有效
Recover
如果我們正在編輯我們的文件,而由于系統(tǒng)故障或是其他的原因而導(dǎo)致vim意外退出時(shí)我們可以選擇這個(gè)選項(xiàng).此時(shí)Vim會(huì)檢查交換文件,并試著從我們意外退出的地方重新開始
Quit    取消對此文件的修改
在我們選擇了其中的一項(xiàng)后我們就可以正常的開始我們的編輯工作了.如果我們選擇了Recover我們要十分小心,因?yàn)槲覀円郧八鲞^的修改并不一定被保存下來.
如果我們記得Vim意外退出時(shí)我們正在編輯的文件,我們可以用-r命令參數(shù)在修復(fù)模式下啟動(dòng)Vim.例如我們在編輯文件commands.c時(shí)Vim意外退出,我們就可以用下面的命令在修復(fù)模式下啟動(dòng)vim:
$ vim -r commands.c
如果我們想得到一個(gè)可以修復(fù)的編輯器程序列表,我們可以用下面的命令:
$ vim -r
這樣Vim就會(huì)在當(dāng)前目錄和標(biāo)準(zhǔn)的臨時(shí)的目錄下查找交換文件,命令的執(zhí)行結(jié)果就像下面的樣子:
$ vim -r
找到以下的交換文件:
   在目前目錄:
1.    .vi14.txt.swp
            所有者: mayuelong    日期: Wed Jul 27 19:19:39 2005
              文件名: ~mayuelong/Documents/vi14.txt
            修改過: 是
            用戶名: mayuelong      主機(jī)名: localhost.localdomain
           進(jìn)程 ID: 3070 (正在執(zhí)行)
   在目錄 ~/tmp:
      -- 無 --
   在目錄 /var/tmp:
      -- 無 --
   在目錄 /tmp:
      -- 無 --

Vim在意外退出的情況下并不會(huì)覆蓋舊的交換文件.例如第一次編輯時(shí)產(chǎn)生的交換文件名為.file.txt.swp.如果我們再編輯又遇到意外退出時(shí)所產(chǎn)生的交換文件名為.file.txt.swo,到第三次時(shí)所交生的交換文件為.file.txt.swn,如此類推.
我們在啟動(dòng)Vim時(shí)可以指明用哪一個(gè)交換文件來修復(fù)文件,命令如下:
$ vim -r .file.txt.swo
如果想知道我們當(dāng)前正在使用的交換文件的名稱可以使用下面的命令:
:swapname
這樣就會(huì)顯示交換文件的名稱.
通常情況下,交換文件會(huì)每4秒或是每隔200個(gè)字符保存一次.這個(gè)數(shù)值是由updatecount和updatetime選項(xiàng)來控制的.我們可以用下面的命令來設(shè)置交換文件每23秒保存一次:
:set updatetime=23000
(注:這個(gè)數(shù)值是以微秒計(jì)的)
或者是我們可用下面的命令來設(shè)置vim每400個(gè)字符保存一次:
:set updatecount=400
如果我們將updatecount的值為0,那么交換文件就不會(huì)被保存了.
事實(shí)上我們可以來控制是不是要在編輯的過程中產(chǎn)生交換文件,例如下面的命令是在產(chǎn)生交換文件,而這也正是Vim所默認(rèn)的:
:set swapfile
我們也可以用下面的命令來使Vim不產(chǎn)生交換文件:
:set noswapfile
我們可以對每一個(gè)編輯的文件將這個(gè)選項(xiàng)設(shè)置或是重置.如果我們正在編輯一個(gè)大文件而我們又不想可以修復(fù),我們可設(shè)置noswapfile.如果我們同時(shí)正在另一個(gè)窗口編輯一個(gè)文件,那么這個(gè)窗口中的文件仍是使用交換文件的.
在UNIX或是Linux系統(tǒng)中,當(dāng)我們要保存文件時(shí),通常數(shù)據(jù)被裝入內(nèi)存緩沖區(qū),并肯是在系統(tǒng)認(rèn)為是一個(gè)合適的時(shí)才會(huì)被寫入文件.這通常只是幾秒鐘的事情.如果我們想要確認(rèn)數(shù)據(jù)到達(dá)了磁盤,我們可以使用下面的命令:
:set swapsync
這個(gè)命令是告訴Vim編輯器在每一次將文件寫入交換文件的同時(shí)寫入磁盤.swapsync選項(xiàng)可以是fsync或是sync,這個(gè)取決于我們要保存文件時(shí)的系統(tǒng)調(diào)用.
通常情況下,Vim是在和當(dāng)前文件相同的目錄下產(chǎn)生交換文件,我們可以通過directory選項(xiàng)來更改交換文件產(chǎn)生的目錄.例如下面的命令可以將產(chǎn)生的交換文件放在/tmp目錄下:
:set directory=/tmp
這并不是一個(gè)好主意,因?yàn)槿绻覀兪窃诓煌哪夸浵戮庉嬀哂邢嗤募奈募r(shí)會(huì)產(chǎn)生名字沖突.
我們也可以將這個(gè)選項(xiàng)設(shè)成一個(gè)目錄列表,中間用逗號來分隔.最好的方法就是將當(dāng)前目錄(.)設(shè)為目錄列表的第一個(gè)選擇.在存放交換文件時(shí)首先放在列表的第一項(xiàng)指的目錄處,這樣交換文件首先會(huì)被存放在當(dāng)前目錄下.
如果我們已經(jīng)做許多的改動(dòng),我們想保存我們當(dāng)前所做工作,我們可以使用下面的命令:
:write
但是這個(gè)命令是用我們當(dāng)前所做的改動(dòng)來重寫已經(jīng)存的文件,與其相關(guān)的一個(gè)命令是
:preserve
這個(gè)命令是將我們所做工作存入交換文件,而原始的保持不變,直到我們用:write或是ZZ命令退出時(shí)才會(huì)被重寫.在這樣的情況下,如果Vim遇到意外,我們可以用交換文件來修復(fù)我們所做的工作,哪怕是原始文件已經(jīng)丟失.如果沒有用這個(gè)命令,我們就不得不同時(shí)修復(fù)原始文件和交換文件.
我們不僅可以在啟動(dòng)vim時(shí)修復(fù)文件,還可以用下面的命令來修復(fù)文件:
:recover file.txt
這個(gè)命令與下面的有著同樣的作用:
$ vim -r file.txt
如果我們用:recover命令試圖修復(fù)我們正編輯的文件則會(huì)返回錯(cuò)誤.如果沒有指定文件名,則默認(rèn)的當(dāng)前緩沖區(qū)中的文件.如果我們想要放棄我們所做的修改并試圖修復(fù)時(shí),我們可以使用下面的命令:
:recover! file.txt
vi編輯器的學(xué)習(xí)使用(十五)
Vim大量的工作是通過命令行的方式來完成,這樣的命令行方式對于則接觸Vim新手來說也許會(huì)覺得難于操作,可是當(dāng)我們習(xí)慣了這樣的工作方式后,我們就不得不佩服Vim的強(qiáng)大功能,正是這些命令使得我們可以高效的來完成我們的工作.而在Vim當(dāng)中還有一些其他的命令.
命令:ascii或者是ga可以用ASCII碼和八進(jìn)制及十六進(jìn)制打印出來.當(dāng)我們編輯多字節(jié)文件時(shí),例如說我們的漢語,這個(gè)命令就可以打印所有的字節(jié).
命令countgo可以到達(dá)當(dāng)前文件中由count所字的字符數(shù)的位置.例如命令3go就可以到達(dá)文件中的第三個(gè)字符處.而命令gCTRL-G可顯示出當(dāng)前文件中的字符數(shù)的信息,同是顯示出當(dāng)前行,當(dāng)前列以及其他的一些信息.
而命令:goto offset可以將光標(biāo)置于由offset所指定的字符處.而命令gg則與我們以前見到過的G命令相類似,他也可以到達(dá)由count所指定的行.例如5gg可以到達(dá)第5行.gg命令與G命令所不同的地方只是在沒有指定count值時(shí)前者回到第一行,而后者要到最后一行.
而命令CTRL-L可以起到重畫屏幕的作用.這個(gè)命令在我們使用終端窗口或是在屏幕上存在著一些系統(tǒng)信息時(shí)顯得尤為有用.而命令:sleep time可以使得我們的Vim編輯器在指定的時(shí)間不做任何事情(Sleep嘛:-)).在這個(gè)命令中如果時(shí)間是以m結(jié)尾則是指的微秒.這個(gè)命令在我們想暫停執(zhí)行宏時(shí)顯得更為有用.而命令count gs命令也有同樣的作用.
在大多數(shù)的終端上,CTRL-S可以停止輸出,如果我們要重新啟動(dòng)他,則要CTRL-Q命令.這兩個(gè)命令并不是Vim命令中的一部分.為了避免鍵盤的沖突,我們在Vim中并不用這兩個(gè)命令.我們最好也不要試著用:map命令將一些功能和這兩個(gè)鍵進(jìn)行綁定,因?yàn)樵趫?zhí)行這兩個(gè)命令時(shí)是鍵盤得到命令而不會(huì)到達(dá)Vim.
如果我們是在UNIX或是LINUX系統(tǒng)的終端模式下進(jìn)行工作,我們可以用命令CTRL-Z來中止我們的正常編輯狀態(tài).如果我們要繼續(xù)編輯則要使用Shell命令fg.而命令:suspend也會(huì)有同樣的作用.
在一般的情況下我們可以使用:help或是F1鍵來顯示幫助屏幕,從而得到一般的幫助信息.
我們可以使用z height來調(diào)整當(dāng)前窗口的高度.如果當(dāng)前僅有一個(gè)窗口,這個(gè)命令只是影響到窗口中的行數(shù).
我們在沒有輸入文件名的情況下啟動(dòng)Vim時(shí)會(huì)看到一個(gè)介紹的屏幕,這個(gè)屏幕在我們輸入任一字符后消失,如果我們想再看到他,可以使用下面的命令:
:intro
vi編輯器的學(xué)習(xí)使用(十六)
Vim是一個(gè)強(qiáng)大的文本編輯器,這個(gè)強(qiáng)大的文本編輯器的大部分工作是通過命令行的方式完成的.Vim一系列的命令可以使得我們快速高效的完成我們的各種各樣的工作.下面我們就來看一下在Vim的編輯中常出現(xiàn)的問題的一些解決辦法.
在我們快速的輸入文本的時(shí)候,很容易使得一些單詞輸入錯(cuò)誤.例如我們本應(yīng)輸入的是the,而我們卻錯(cuò)輸入成了teh,這時(shí)我們可以通過簡單的命令使得這e和h這兩個(gè)字母交換一下位置來達(dá)我們改錯(cuò)的目的.我們可以將光標(biāo)放在e上,然后輸入命令xp,x命令刪除掉字母e,而p命令則是將他放在當(dāng)前光標(biāo)的后面,也就是h字母的后,從而就達(dá)到了改錯(cuò)的目的.
在我們進(jìn)行文本編輯的時(shí)候有時(shí)要做一些文本替換的工作,例如是將文中所有的字符串idiots替換成managers.這時(shí)我們可以使用下面的命令:
:1,$s/idiots/manages/g
這個(gè)是命令是以冒號(:)開頭的,則表明這是一個(gè)ex模式的命令.所有的ex命令都指明了命令要作用的范圍.在這種情況選定了當(dāng)前的所有文本,從第一行到最后一行($).我們可以也可以用%來簡單指整篇文章.而s命令是命令:substitute的縮寫.舊的文本放在前面,而新的文本則放在后面,g標(biāo)記則指明這是一個(gè)全局的替換,這樣就不會(huì)出在一行中多交出現(xiàn)要替換的文本而只替換第一個(gè)的情況了.
但是有時(shí)我們希望在進(jìn)行文本替換以前Vim可以向我們進(jìn)行一些詢問,然后由我們來決定下一步的操作.在這樣的情況下我們可以按照下面的方法來做:
1 執(zhí)行命令1G到文檔的開始處.
2 執(zhí)行命令/idiot來查找文章中出idiot的地方
3 執(zhí)行命令cwmanager,當(dāng)我們執(zhí)行cw命令時(shí)當(dāng)前光標(biāo)處的文本被刪除并進(jìn)入插入模式,這時(shí)我們就可以將我想要替換成的文本輸入,并退回到命令狀態(tài).
4 執(zhí)行命令n重復(fù)上一次的查找
5 執(zhí)行命令.重復(fù)上一次的編輯操作,如果在這一步我們不想進(jìn)行替換,我們可以跳過這一步,進(jìn)行下一次的查找.
6 重復(fù)以上兩步直到將文件中的所有字符idiot替換成manager
我們還可以執(zhí)行下面的命令來達(dá)到同樣的作用:
:%s/idiot/manager/cg
在這個(gè)命令中我們是用%來指代文章中的所有的行,與上一個(gè)命令不同的地方是我們加入了標(biāo)記c,這個(gè)標(biāo)記可以告訴Vim每一次在替換之前都要進(jìn)行詢問.
我們在進(jìn)行文本編輯時(shí)想要進(jìn)行文本的移動(dòng)操作我們又該如何來做呢?這時(shí)我們可以按照下面的步驟來做:
1 將光標(biāo)移到我們要移動(dòng)的段落的開頭部分
2 用命令ma在此處做上標(biāo)記.
3 將光標(biāo)移到這個(gè)段落的底部
4 執(zhí)行命令d'a來刪除剛才做了標(biāo)記的文本.
5 將光標(biāo)移到我們想放置文本的地方.
6 執(zhí)行命令p將這段文本放在此處
這樣我們就達(dá)到移動(dòng)文本的目的.
我們可以按照下面的方法來做,可以達(dá)到同樣的效果:
1 用光標(biāo)放在第一行并將其標(biāo)記為a

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VIM命令模式與輸入模式切換
Linux vi/vim編輯器常用命令與用法總結(jié)
RHCSA 系列(四): 編輯文本文件及分析文本
Linux入門學(xué)習(xí)
在Linux中掌握不同的命令,讓創(chuàng)建文件變得易如反掌
Vim
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服