轉(zhuǎn)自:http://blog.chinaunix.net/uid-8494387-id-2030953.html
這幾個命令中有一些需要說明的地方:[CTRL_I/]CTRL_I命令用來查找光標(biāo)下面的文字,查找的范圍不僅是在本文件中進(jìn)行查找,而且還要查找由#include所包含進(jìn)來的文件中進(jìn)條查找。變顯查找的命令gd和gD有時并不能完美的完我們想要做工作。這是因為vi在理解C和C++的語法方面有一些小的限制。但是大多數(shù)的情況下這幾個命令還是可以很好的來完成我們工作的。[d/命令可以顯示以當(dāng)前光標(biāo)下的內(nèi)容為為名字的第一個宏定義,]d也有著同樣的作用,所不同的只是后者是從當(dāng)前光標(biāo)處查找下一個宏定義。當(dāng)然這兩個命令也可以在由#inlcude所包含進(jìn)來的文件中進(jìn)行查找。[D/]D命令可以用來列出文件中的宏定義。這兩個命令有著同樣的作用,所不同的只是前者是列出當(dāng)前光標(biāo)以后的宏定義,而后者是從當(dāng)前光標(biāo)處的下一個宏開始列出文件中的宏義。(注:此處由此書看來似乎是這樣的,但是自己親自來做時并沒有出現(xiàn)這樣效果)
我們在編寫程序時常常要做的一件事便是括號的匹配,我們在vi中可以用%命令來確定匹配的括號。例如我們將光標(biāo)定位在其中一個括號處,然后執(zhí)行命令%,光標(biāo)就會定位在與其相匹配的括號處。有時我們在編寫了一段程序后卻想著要將這一段程序進(jìn)行縮進(jìn),這時我們可以用這樣的命令來做到:將光標(biāo)定位在第一個或是最后一個包含著所要縮進(jìn)的程序塊的括號處,然后執(zhí)行下面的命令:>%,這樣就可以將這個程序右縮進(jìn)一段距離。但是我們發(fā)現(xiàn)執(zhí)行這個命令后花括號也一樣的進(jìn)行了縮進(jìn),有時我們這并不是我們想要的,我們想要的是僅括號內(nèi)的文本進(jìn)行縮進(jìn)。這時我們又應(yīng)如何來做呢?這時我們可以用這樣的命令:>i{.這個命令是說僅括號內(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ù)的功能。這對于我們想要理解一個程序是非常有幫助的。vi所定位的函數(shù)被包含在一個由ctags的程序建立的文件當(dāng)中。要建立一個名為tags的這樣的文件,我們可以輸入這樣的命令來完成:$ctags *.c
這樣以后當(dāng)我們在vi中來編輯我們的程序文件時我們就可以任意的跳轉(zhuǎn)到我們想要去的函數(shù)處,當(dāng)然這得要求我們想要到函數(shù)存在。我們可以用這樣的命令來到達(dá)我們要到的地方:
:tag function
這個命令甚至可以查找得到在其他文件中的函數(shù)。
在完成函數(shù)跳轉(zhuǎn)的功能命令中還有幾個強(qiáng)大而有趣的命令。CTRL_]命令跳轉(zhuǎn)到以光標(biāo)下的字符串為函數(shù)名的函數(shù)處。這樣就大大的方便了我們在C程序查找函數(shù)的需要。例如你正在看一段名為write_block的函數(shù)程序,而在這個程序中調(diào)用了函數(shù)write_line。這個被調(diào)用的函數(shù)具體是來做什么的呢?我們可以將光標(biāo)定位在這個函數(shù)上,然用執(zhí)行命令CTRL_]。這樣vi就會馬上跳轉(zhuǎn)到這個函數(shù)的定義處。我們就可以清楚的看到這個函數(shù)的實現(xiàn)的方法。而在這個函數(shù)中又調(diào)用了函數(shù)write_char,這時我們可以用同樣的方法來查看這個函數(shù)的定義過程。命令:tags可以列出我們已經(jīng)訪問過的函數(shù)名稱。但是我們在走了一段路以后想回去又該怎么來做呢?命令CTRL_T可以使我們回到上一個訪問的函數(shù)處。我們?yōu)榱嗽诤瘮?shù)跳轉(zhuǎn)的命令,我們要用命令ctags建立這文件來存放在C程序中所出現(xiàn)在的函數(shù)名,這時vi要建立一個棧來存入函數(shù)名。我們用命令CTRL_T回到上一個訪問的函數(shù)處,這時我們還可以用命令:tag來向前走一步,即回到前一個訪問的函數(shù)處。我們也還可以像其他大多數(shù)的vi命令一樣在此命令之前用數(shù)字來做前綴,指明要執(zhí)行的次數(shù)。我們還可以用這樣的命令::tag function。這樣我們就可以來到指定的函數(shù)處。
當(dāng)我們用命令:tag時是將當(dāng)前窗口中的內(nèi)容由函數(shù)的內(nèi)容所代替了。我們也可以打開一個新窗口來顯示函數(shù)的內(nèi)容。這時我們就要用到下面的命令::stag tag。這個命令是要打開一個新窗口來顯示tag指定的函數(shù)內(nèi)容。我們也可以用命令CTRL_W_]來打開一個新窗口顯示以光標(biāo)下的字符串為函數(shù)名的函數(shù)內(nèi)容。我們也可以在這個命令前加下數(shù)字count做為前綴,這打開的窗口就是count這樣的高度。
我想我們常會有這樣的情況,那就是我們想要跳到一個函數(shù)處卻記清他的名字究竟是什么?這是我們要怎么辦呢?在vi中有一個很好的解決辦法,那就是我們可以用:tag /name來找到你想要的內(nèi)容。例如在我們上面所舉過的例子中曾提到了函數(shù)write_line。但是現(xiàn)在我們記不得他的全名了,只是記得好像有一個line。這時我們?nèi)绾蝸碚业侥兀课覀兛梢杂眠@樣的命令來做::tag /line。這樣vi就會將我們帶到write_line定義的地方。我們還可以借助于一些表達(dá)式來精確的定位我們要去的地方。例子如我們似乎記得有一個函數(shù)是以read開頭的,這時我們可以這樣的來查找::tag /^read。這個是說read所要查找的內(nèi)容是以read開頭的。或者說我們不能十分清楚的記得一函數(shù)的名稱是DoFile,do_file還是Do_File。這時我們也可以這樣的來查找::tag /DoFile\|do_file\|Do_File?;蛘呤俏覀兛梢詫懗蛇@樣的表達(dá)式::tag /[Dd|o_\=[Ff|ile。這樣我們就可以找到我們想要的內(nèi)容了。一般情況下我們用這樣的命令來查找時并不能精確的得到我們想要的東西,而是得到許多匹配的選項。而我們可以用命令:tselect來列出所有這些合要求的內(nèi)容。這個列表一般由這樣的一些內(nèi)容組成:
第一列的數(shù)字是這些標(biāo)記(tag)的編號,第二列這些內(nèi)容的優(yōu)先級,他一般包含三個字母:F完全匹配,如果沒有則是忽略的情況;S靜態(tài)標(biāo)記,如果沒有,則是全局標(biāo)記;C則是說是這個標(biāo)在當(dāng)前的文件中。在執(zhí)行完這個命令后,:tselect會給我們一個機(jī)會,我們可以選擇到標(biāo)號為哪一個的內(nèi)容處去,或者是選擇離開。命令g]與命令:tselect相類似,只是他是以光標(biāo)下的內(nèi)容為查找內(nèi)容的。命令:tjump的作用與:tselect命令相同,所不同的只是當(dāng)執(zhí)行的結(jié)果只有一項內(nèi)容時,則自動的選中這個結(jié)果。命令gCTRL_]與此相同,只是他是當(dāng)前光標(biāo)下的內(nèi)容為查找對象的。其他的一些相關(guān)的命令如下:
:count tnext 到下一個標(biāo)記處
:count tprevious 到上一個標(biāo)記處
:cout tNext 到上一個標(biāo)記處
:cout trewind 到第一個標(biāo)記處
:cout tlast 到最后一個標(biāo)記處
命令:stselect與:tselect命令相同,所不同的只是前者將打開一個新窗口來顯示執(zhí)行的結(jié)果。與其類似的命令還有:stjump.
當(dāng)我們在編寫makefile文件時我們所需要的縮進(jìn)是一個tab,而不是8個空格。這樣的區(qū)別是很難在屏幕上看出來的。這時我們可以用這樣的命令::set list,這樣以后tab則顯示為^I,同時在每一行的末尾顯示$,這樣我們就會很好的來區(qū)分這些細(xì)小的分別了,同時還有助我們來檢查我們程序的正確性。當(dāng)然我們也可以選擇用其他的字符來顯示,通過listchars選項我們可以做到這一點。如果我們設(shè)置了expandtab選項,那么我們輸入一個tab時,vi實際上插入的空格。這對于我們編寫makefile文件時是很不方便的。如果我們想真正的輸入一個tab,而不是插入空格,這時我們可以輸入CTRL_V
1 將光標(biāo)放在文件列表的起始點
2 用命令標(biāo)記這個位置:ma
3 到這個列表的底部
4 執(zhí)行命令排序:!'a sort
我們也可以在可視模式下來排序:
1 移動到要排序的文本的頂部
2 進(jìn)入可視化模式:V
3 移動到文本的底部
4 執(zhí)行命令:!sort
vi編輯器還可以允許我們在vi中執(zhí)行編譯程序的make命令,其命令為:make,這時就會來編譯程序,同時會顯示出錯誤來。這時我們就可以移到到出錯的地方來修正我們的錯誤,然后再重新編譯,直到成功。如果我們的程序編譯有錯誤,vi就會顯示出錯誤的提示信息和錯誤的地方,同時vi會自動到第一個出現(xiàn)錯誤的地方。我們在修改完錯誤以后,可以用命令:cnext來到下一個出錯誤的地方繼續(xù)我們的工作。命令:cprevious和命令:cNext可以回到上一個錯誤的地方。命令:clast可以到最后一個出錯的地方,而命令:crewind可以到第一個出現(xiàn)錯誤的地方。而命令:cnfile可以到下一文件第一個出錯的地方。如果我們此時忘記了出現(xiàn)在的錯誤是什么,我們可以用這樣的命令來顯示出錯信息::cc,如果我們想看到一個錯誤的列表,我們可以用這樣的命令來完成::clist。我們還可以用命令來顯示一定范圍內(nèi)的錯誤。如:
:clist3,5 顯示第三行到第五行的錯誤
:clsit,5 顯示第一行到第五行的錯誤
:clsist5, 顯示第五行到最后一行的錯誤
如果我們已經(jīng)運行make命令并且生成我們自己的錯誤信息的文件,我們可以用這樣的命令來告訴vi這些情況::cfile error-file。error-file是make或是編譯輸出的文件。如果我們沒有error-file文件,那么我們可以使用errorfile這個選項在。退出錯誤的狀態(tài)可以用命令::cquit.這些命令對于我們在使用一個集成的開發(fā)環(huán)境時會顯得更有用一些.
errorfile選項會建立一個默認(rèn)的文件,這個文件會被命令:clist和-q命令行選項所使用,但是這個文件并不會成為:make命令的輸出文件。如果我們想要建立自己的默認(rèn)錯誤文件可以使用下面的命令::set errorfile=error.list
:grep與:make相類似,他是執(zhí)行外部的命令程序grep并顯示輸出。例如我們要在程序文件中查找變量ground_point我們可以使用下面的命令:
:grep -w ground_point *.c
-w 是告訴grep程序包僅查找單詞ground_point,而不是任意匹配的結(jié)果。與前面的命令相類似,:cnext,:cprevious,:cc等命令可以在這個匹配的列表中進(jìn)行移動,:crewind,:clast分別移到到列表中的第一個和最后一個。:cnfile到下一個文件是的第一個。
vi編輯器的學(xué)習(xí)使用(八)
vi編輯器可以很好的完成一些我們要做的一些重復(fù)性的工作。例如我們可以在vi中設(shè)置縮寫,這樣當(dāng)我們在輸入一個單詞時只需輸入其中的一部分,而要vi來完其余的部分。當(dāng)然了,我們可以將我們喜歡的一些設(shè)置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會影響到系統(tǒng)中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個縮寫的字符來代替一個單詞,然后在我們想要輸入這個單詞時只要輸入這個縮寫的字符就可輸入我們想要的單詞了。我們?nèi)绾蝸碜龅竭@些呢?這時我們要用到的vi命令是:abbreviate.例如我們可以用ad來vi編輯器可以很好的完成一些我們要做的一些重復(fù)性的工作。例如我們可以在vi中設(shè)置縮寫,這樣當(dāng)我們在輸入一個單詞時只需輸入其中的一部分,而要vi來完其余的部分。當(dāng)然了,我們可以將我們喜歡的一些設(shè)置寫入vi的配置文件,這樣就不要我們每一次都要通過命令來完成了。除了這個功能以外,我們還可以在vi中定義我們自己的功能按鍵,而不會影響到系統(tǒng)中的功能鍵。這樣的功能是不是很有趣呢?
我們可以在vi中用一個縮寫的字符來代替一個單詞,然后在我們想要輸入這個單詞時只要輸入這個縮寫的字符就可輸入我們想要的單詞了。我們?nèi)绾蝸碜龅竭@些呢?這時我們要用到的vi命令是:abbreviate.例如我們可以用ad來代替advertisement。這樣我們在想輸入advertisement的時候只要輸入ad然后打一下空格或是tab就可以輸入advertisement了。具體的做法是這樣的:
:abbreviate ad advertisement 這個命令就是在告訴vi我們設(shè)置advertisement的縮寫為ad,這樣我們在要輸入advertisement的時候只要輸入ad就可了,剩下的工作vi會為我們完成的。當(dāng)然了這個命令也可以為多個單詞設(shè)置縮寫。例如我們可以設(shè)置Jack Berry的縮寫為JB。命令為::abbreviate JB Jack Berry 這樣我們在輸入了JB以后打下空格或是Tab,vi就會自動的用我們設(shè)置的單詞來替換JB。對于程序員來說這樣命令為我們提供了巨大的便利。例如我們可以做出這樣的設(shè)置:
:abbreviate #b /*************************
:abbreviate #e
這個縮寫可以在加快我們添加注釋的速度。我們在編寫程序文件時常有這樣的習(xí)慣,那就是在程序的開頭總是要加上一個注釋塊,來標(biāo)明我們此程序的目的等。在這個縮寫中有一點要我們注意的地方,那就是我們希望在寫程序的注釋塊時下一行要和上一行對齊,要做到這一點就要求第二行的注釋開頭的兩個字母要是空格,但是在這個縮寫命令中會忽略到空格的作用,因而我們在寫這個縮寫時在開頭寫上
另一個比較有趣和強(qiáng)大的命令就是:map命令,這個命令可以使得我們將鍵盤上的一個按鍵與vi中的命令綁定在一起。例如我們現(xiàn)在將一個單詞用花括號括起來,例如我們要將amount變成{amount}的形式,這時我們就可以這樣的來應(yīng)用這個命令:
:map
在這個命令中:map是vi中的命令,而F5則是說將下面的命令與F5鍵綁定,后面的則是具體的命令內(nèi)容,i{
在我們做過這樣的工作以后我們就可以來執(zhí)行我們的命令了,我們將光標(biāo)定位在一個單詞上,例如amount,按下F5鍵,我們就會發(fā)現(xiàn)這時就變成了{(lán)amount}的形式。
在這里我們要注意的一點就是我們最好不要將在vi中有特殊命令的功能熱鍵與某些命令進(jìn)行綁定,如果是這樣的話就會給我們帶來麻煩。
同上面的:abbreviate命令相類似,我們也可以用命令:map來列出在這個文件中所有的功能鍵,包括我們自己定義的以及系統(tǒng)定義的。
我們在做過這樣的設(shè)置以后,有時希望這樣的設(shè)置在下一次使用時會繼續(xù)有效,這時我們就要用命令:mkvimrc將我們所做的這些設(shè)置寫入文件中。這個命令的格式如下:
:mkvimrc file
在這里file就是我們要將這些設(shè)置寫入的文件名。我們可以用命令:source file來讀出文件并執(zhí)行文件中的內(nèi)容。
在vi的啟動過程中,vi會首先查找初始化文件。如果找到就會自動執(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
而如果我們用一些圖形界面的話,那么還會讀一些其他的配置文件。如果我們要執(zhí)行g(shù)vim那么$VIMRUNTIME/menu.vim也會被讀進(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編輯器是基于一個古老的名為vi的編輯器設(shè)計而成的,而vi基于一個更古老的基于命令行方式的ex編輯器設(shè)計而成的。ex編輯器是在屏幕產(chǎn)生以前相當(dāng)流行的一個編輯,他是為那時古老的標(biāo)準(zhǔn)打印而設(shè)計的。
僅管ex是基于命令行方式的,然而他也是真正意義上的一個強(qiáng)大而高效的編輯器。即使是在今天他也是發(fā)揮著作用。僅管現(xiàn)在的Vim編輯器有一套的命令系統(tǒng),可是有些事情還是要用ex的命令方式才可以更好的來完成。因而現(xiàn)在的Vim編輯器設(shè)計了與ex編輯器的接口,我們可以在Vim中使用ex方式的命令。而那些以冒號開頭的命令就是一個ex方式的命令。
如果你想執(zhí)行單一的命令行方式的命令,那么你只輸入:然后輸入命令就可以了。例如我們在前面討論的:set number.事實上他就是一個命令模式的命令。在執(zhí)行完這個命令以后,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之間輸入空格,但是如果這樣做后我們就會現(xiàn)這個命令看起來會更好。如果你僅僅是想打印第5行,你可以用這樣的命令::5 print.當(dāng)然了我們也可以使用一些特殊的數(shù)字標(biāo)記,例如字符$是指最后一行,因而如果我們想要打印全文的時候我們可以用這樣的命令::1,$ print.而字符%是指整篇文章(1,$),因而我們也可用這樣的命令來打印整篇文章::% print,而.則是指當(dāng)前行,我們要打印當(dāng)前可以用:print命令而不帶任何參數(shù),也可以用這樣的命令:.print。我們還可以用指定句子中內(nèi)容來打印選定的行。例如在我們的文章中我們可以用這樣的命令來打印含有字符ex的行::/ex/ print。這樣就會打印出含用ex的行,并會高亮顯示出ex。同樣命令:?ex? print也會達(dá)到同樣的作用,而命令:?ex? print也正是打印含有ex字符的命令格式。
在前面的學(xué)習(xí)中我們曾學(xué)過標(biāo)記命令m,例如我們可以在任何地方用命令ma做上標(biāo)記,然后在其他的地方可以用命令‘a(chǎn)回到做了標(biāo)記的地方。這個命令也可以與print命令組合。例如我們可以在一個地方用命令ma做上標(biāo)記,然后在其他的地方用命令mb做上另外的標(biāo)記,然后我們就可以執(zhí)行下面的命令來打印這兩個標(biāo)記之間的內(nèi)容了::'a,'b print
我們也可以在可視化的模式下來選定要打印的內(nèi)容。例如我們用命令V進(jìn)入可視化模式并選定一段內(nèi)容,這時我們輸入:就會在Vim的底部顯示<,>兩個字符,這兩個字符分別指我們的選定內(nèi)容的開頭和結(jié)束部分。
命令:substitute可以使我們將指定的字符換成其他的字符。這個命令的格式是這樣的:
:range substitute /from/to flags
在這個命令中range是指定了范圍,也就說是在哪些行里做替換。而后是說將字符串from替換成字符串to。在默認(rèn)的情況下,這個替換命令僅是將一行中第一個出的的字符替換成給定的字符。而如果我們想將所有出現(xiàn)的字符都替換成給定的字符我們就用g這個標(biāo)記命令。例如::% substitute /from/to/g.這個命令就達(dá)到將所有出現(xiàn)from的地方全部替換成to。其他的標(biāo)記(flags)包括:p(print),這個命令是告訴substitute打印所做的改動。c(confirm),這個命令是告訴substitute命令在做出這樣的改動以前要詢問是否要做這樣的改動例如如果我們執(zhí)行下面的命令::1,$ substitute /Professor/Teacher/c.在Vim就會顯示我們將要做改動的文本,并顯示下面的內(nèi)容:
Prfessor: You mean it's not supposed to do that?
replace with Teacher(y/n/a/q/^E/^Y)?
這時你可以做出以下這樣的回答:
y 執(zhí)行這個替換
n 跳過這個替換
a 執(zhí)行所有的替換不要做詢問
q 退出,不做任何改動
CTRL─E 向上翻滾一行
CTRL-Y 向下翻滾一行
在Vim的命令還有一些命令可以幫助我們很好的完成我的工作:例如命令:read filename可讀進(jìn)一個文件并將讀進(jìn)和內(nèi)容插在當(dāng)前行的后面。而命令:write是將文件寫入。這是一個保存我們工作的方法。我們也可以用命令:write newfile將當(dāng)前的文件內(nèi)容寫入一個新的文件。一般情況下:write命令并不會覆蓋已經(jīng)存在的文件。我們可以用強(qiáng)制操作(?。┻x項來完成我們所需要的操作并覆蓋當(dāng)前已經(jīng)存在的文件。而這個命令對于我們要將一個大的文件分拆為小的文件時顯得更有用。我們可以用可視化模式選定一個范圍然后將這個選定的范圍寫入新的文件,從而實現(xiàn)了分拆的目的。
我們還可以Vim中不需要退出而執(zhí)行Shell命令。命令:shell可以使們進(jìn)入命令終端執(zhí)行我們需要的命令。當(dāng)我們要退出終端回到Vim中時可以執(zhí)行exit命令。我想這對于程序人員來說真是一個巨大的幫助。:)
vi編輯器的學(xué)習(xí)使用(十)
在我們談起Vim編輯器似乎只是覺得他只是一個類似于一個命令行方式的文本編輯器。而事實上不是這樣的。Vim在窗口環(huán)境中也可以完美的完成我們的工作。在窗口環(huán)境下,我們不僅可以使用那些在Vim文本方式下的命令來完成工作,而且還有許多的菜單和其他的選項。這些都使得我們可以完美的來完成我們的工作。
我們要啟動圖形界面的Vim可以用下面的命令:gvim file。這樣就可以打開圖形界面來編輯文本file。圖形界面下的Vim編輯器的外觀因你所用的操作系統(tǒng)的不同而有所不同,就是同樣的操作系統(tǒng)也會因你所使用的工具集不同(Motif,Athena,GTK)而會呈現(xiàn)不同的外觀。而值得向大家推薦的是GTK版本的Vim編輯器,當(dāng)然其他版本的也是可以來完美的完成我們的工作的。
在Windows系統(tǒng)中我們可以在標(biāo)準(zhǔn)形式下用鼠標(biāo)來選擇文本,而在X Window系統(tǒng)中我們也會有一個標(biāo)準(zhǔn)的系統(tǒng)來使用鼠標(biāo),但是這兩種標(biāo)準(zhǔ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有以下這些選項:
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)格的行為主要有以下一些:
左鍵: 移動光標(biāo)
拉動左鍵: 在可視化模式下選擇文本
右鍵: 選中光標(biāo)處到右鍵點擊處的文本
中鍵: 在光標(biāo)處粘貼選中的文本
Windows的鼠標(biāo)風(fēng)格的行為主要有以下一些:
左鍵: 移動光標(biāo)
拉動左鍵: 在選擇模式下選中文本
中鍵: 將系統(tǒng)剪切板中的文本粘貼到文件
(注:其中的S為Shift鍵)
其他的一些特殊的用法:
Shift+左鍵: 向前搜索光標(biāo)處的文本
Shift+右鍵: 向后搜索光標(biāo)處的文本
Ctrl+左鍵: 跳轉(zhuǎn)到以光標(biāo)處的文本為名字的標(biāo)記(tag)處
Ctrl+右鍵: 跳轉(zhuǎn)到前一個標(biāo)記處
在圖形界面的Vim編輯器還有一個有趣的特征,那就是當(dāng)我們點開一個菜單時就會發(fā)在子菜單的第一行有一條虛線,點擊此虛線就可以將這個菜單移其他的地方。關(guān)閉后Vim的菜單結(jié)構(gòu)又恢復(fù)到正常的狀態(tài)了。在GTK版本和Windows版本中的圖形界面的Vim還有一個工具欄,這些工具可以快速的完成我們的工作。
vi編輯器的學(xué)習(xí)使用(十一)
雖然現(xiàn)在的專業(yè)的文字處理軟件例如MS Word,Star Office,Open Office等可以很好的來完成的一些文檔處理的工作,但是人們?nèi)匀皇窍矚g用純文本的形式來處理手中的文本.這里因為用純文本處理的文件比較容易閱讀,不像那些專業(yè)的字處理軟件,有專門的文件存儲格式,少了許多的麻煩.Vim是一個強(qiáng)大的文本編輯器,他也可以像那些專來的字處理軟件一樣來處理我們手中的文本工作,從而使得我們的工作來得更漂亮.
Vim在默認(rèn)的情況下是不會自動換行的,這也就是說我們在默認(rèn)的情況下我們不得不自己決佇回車的位置.這樣的設(shè)置對于處理程序文件來說是一件相當(dāng)好的事情,因為這樣可以由我們自己來決定回定回車換行的位置,從而可以很好的來完成我們的程序設(shè)計工作.但是如果我們是在處理一些文檔工作,那么這個問題就有一些成為困撓我們的問題了.幸運的是Vim提供了這樣的功能可以使我們來解決這樣的問題.當(dāng)我們指定了textwidth這個選項后,Vim就會自動的在相應(yīng)的地方加上換行符.例如我們可以用下面的命令來指定一個只有30列的文本:
:set textwidth=30
這樣以后當(dāng)我們再輸入文本時如果達(dá)到30這個限制,Vim就會自動的依據(jù)情況來加上換行符.在Vim中我們可以有兩種方法來選擇換行的方式.例如下面的命令是告訴Vim從左面算起30個字符時換行::set textwidth=30
而下面的命令則是告訴Vim從右面算起當(dāng)達(dá)到margin個字符的空白時要換行:
:set wrapmargin=margin這里的margin是空白字符的個數(shù).例如如果你有一個80個字符寬的文本,下面的兩個命令則是起到了同樣的作用:
:set wrapmargin=10
:set textwidth=70
Vim并不是那些專業(yè)的字處理軟件,在我們指定了文本寬度的情況下,當(dāng)我們將一行中的前幾個文字刪掉的話,Vim并不會像那些專業(yè)的字處理軟件那樣將后面行中的文本移到前面的行上,而是形成了一些長短不一的段落.這樣看起來不是很好,因為我們需要的是有同一風(fēng)格的文本形式.在Vim中這樣的情況可以有幾種處理方法:一是在可視化模式下選中這些文本,然后用gp命令來格式化選中的段落.另一種方法就可以使用gqmotion的命令來完成格式.例如我們要格式化5行,我們就可以用下面的命令:gq4j.這個命令是告訴Vim編輯要格式化本行,同時要格式化下面的4行.這樣就達(dá)到了格式化5行的目的.在這樣的情況下,向前移動的命令}這時就會為我們提供更大的便利了.這時我們的做法是這樣的:將光標(biāo)放在我們要格式化段落的第一行上,然后執(zhí)行命令gq}.這樣就可以達(dá)到我們的目的了.這樣方法要簡便得多,因為我們不必要再數(shù)細(xì)數(shù)我們要格式化多少行了.命令gqip可以格式化當(dāng)前的段落.這個命令要比上一個的格式命令還要簡便一些,因為在這樣的情況下我們不必要將光標(biāo)放在一個段落的第一行了.最后如果我們要想格式化一行的可以使用命令gqgq,當(dāng)然了我們也可以簡記為gqq.
我們都知道在專業(yè)的文字處理軟件中有文本對齊的選項,而這在Vim當(dāng)中也是可以做到的.如果要將文本居中對齊我們可以用這樣的命令::range ceter width.在這個命令中如果我們沒有指定textwidth的值,他將使用我們設(shè)置的textwidth的值,如果我們也沒有設(shè)置這個值,那么他將使用系統(tǒng)定義的80.例如我們要將1到5行的內(nèi)容居中對齊,我們可以使用下面的命令:
:1,5 center 30
同理右對齊的命令也可以類似的寫成:
:1,5 right 30
但是左對齊的命令就與這兩個命令有一些不同了,左對齊的命令為:
:range left margin
在這個命令中左對齊的參數(shù)并不是文本的寬度,而在文本左邊的空白字符的寬度,如果為0,那么將緊靠屏幕的左邊沿.在Vim中并沒有內(nèi)置的方法來對齊文本,但是我們可以使用一個簡潔的宏包來完成這樣的工作.要使用這個包先執(zhí)行下面的命令:
:source $VIMRUNTIME/macros/justify.vim
在這個包中定義了一個新的可視化的命令_j.要對齊一個文本塊,可以在可視化模式中高亮顯示這個文本塊,然后執(zhí)行命令_j.
J命令可以使兩行合并為一行,同時用空格為分格這兩行.在文本處理中有一個joinspace的選項,如果設(shè)置了這個選項,那么可果一行是以標(biāo)點符號來結(jié)尾的,那么在用這個命令后會用兩個空格來區(qū)分這兩行.也就是說如果我們用命令:set nojoinspace ,用J命令來合并這兩行時會用一個空格來區(qū)分.但是如果我們用命令::set joinspace ,用J命令來合并這兩行時會用兩個空格來區(qū).這就是這個選項所要起到的作用.
在Vim編輯器中我們可以通過設(shè)置formatoptions選項來設(shè)置Vim中的文本和注釋的換行方式.這個命令為:
:set formatoptions=character
在這個命令中character一組格式化的標(biāo)記,他可以是下面的一些字符:
t 文本自動換行
c 注釋自動換行,同時自動在行首添加注釋標(biāo)記
r 當(dāng)添加新行時自動添加注釋符
o 當(dāng)用O和o開始新的一行時自動在行首添加注釋符
q 允許使用gq來格式化文本
2 第二行縮進(jìn)兩個字符
v 采用老的vi換行方式,當(dāng)你輸入空格時換行
b 在達(dá)到textwidth以前當(dāng)輸入空格時換行
l 在插入模式下不換行,只用gq來完成相應(yīng)的工作
下面讓我們來看一下這些選項是如何來工作的:
當(dāng)需要文本自動換行時要打開t標(biāo)記,當(dāng)需要注釋自動換行時要打c標(biāo)記.所以對于一個要處理程序文件的人來說打開注釋自動換行似乎要有更大的幫助:
:set formatoptions=c
這樣在注釋中的一個長句就會自動換行,而正常的程序文本就不會被自動換行.事實上我們常做些這樣的選項:
:set formatoptions=cq
這個選項是告訴Vim編輯器不僅注釋要自動換行,而且這些注釋可以使用gq命令來格式化.
Vim編輯器可以很好的處理注釋的問題.在C程序風(fēng)格的程序文本處理過程中,當(dāng)注釋自動換行時Vim會自動在注釋的開頭加下注釋標(biāo)記.但是在這樣的設(shè)置也還是存在一個問題的,那就是當(dāng)你回車時Vim就不會在下一行的開頭自動加上注釋標(biāo)記了.如果這一行仍寫的是注釋,那么就要你親自來加上了.但是當(dāng)我們打開r這個標(biāo)記后就會解決這個問題了.這時如果你打回車,Vim編輯器還會在新的一行加上注釋標(biāo)記.這時如果你要想在下一行寫程序文本,那么就不得不動手刪除注釋標(biāo)記了.如果你希望當(dāng)用O或是o添加新的一行時要自動添加注釋標(biāo)記就要打開o這個格式標(biāo)記了.
格式標(biāo)記選項是告訴Vim編輯器在格式文本中要從第二行開始而不是第一行.設(shè)置這個選項的命令為:
:set formatoptions+=2
而v標(biāo)記則控制一個句子從哪里進(jìn)行分裂.例如現(xiàn)在我們有一個句子:
This is a test of the very long warpp.
現(xiàn)在我們要在這個句子的后面新增一個詞logic
如果沒有v標(biāo)記結(jié)果就會變成:
This is a test of the very
long line warpping logic.
而如果打開v標(biāo)記,結(jié)果就會變成:
This is a test of the very long line wrapping
logic.
令管已經(jīng)存在的文本已經(jīng)遠(yuǎn)遠(yuǎn)的超過了textwidth的限制,但是因為設(shè)置了v標(biāo)記,所以Vim編輯器也不會換行,相反只有你新增了一個詞時才會換行.
在默認(rèn)的情況下vim編輯器是使用內(nèi)部的格式程序來模式文本,當(dāng)然了我們也可以使用外部的格式程序來格式我們的文本.在UNIX和Linux系統(tǒng)中有一個標(biāo)準(zhǔn)的程序fmt可以很好的來做這樣的工作.如果我們想用命令gq來執(zhí)行這個處部命令,我們可這樣的來進(jìn)行設(shè)置:
:set formatprg=fmt
即使是沒有進(jìn)行這樣的設(shè)置,我們也可以使用命令!來格式文本.例如如果我們想用程序fmt來格式一個段落,我們可以用這樣的命令:!}fmt.!是開始了一個過濾命令,而}是告訴Vim過濾一個段落.fmt是我們要使用的命令的名字.
在早期的打印機(jī)的時代,開始新的一行要占用兩個字符的時間.如果到了一行的結(jié)尾處,你要他快速的回到新的一行的開頭,打印的針頭在紙面上飛快到掠過,常常就會在紙面的中間留不希望的污點.這個問題的解決辦法就是用兩個字符來解決:一個字符
fileformats選項包含了許多當(dāng)編輯一個新文件時會用到的一些文件格式.例如下面的命令就是告訴vim編輯器將UNIX的文件格式做為第一選擇,而將MS-DOS的文件格式做為第二選擇:
:set fileformats=unix,dos
檢測到的文件格式會被存放在fileformat選項中,我們可以且下面的命令來查找我們所使用的文件格式:
:set fileformat?
我們還可以應(yīng)用fileformat這個選項將一個文件從一種文件模式轉(zhuǎn)換成另一種文件格式.例如我們有一個名為readme.txt的MS-DOS文件格式的文件,而我們想將他轉(zhuǎn)換為UNIX文件格式的文件.我們可以按照下面的方法來做:
首行編輯該文件:
$ vim readme.txt
其次將文件格式改為UNIX文件格式:
:set fileformat=unix
然后保存該文件,此時這個文件就轉(zhuǎn)換成為了UNIX文件格式的文件.
在默認(rèn)的情況下Vim編輯器認(rèn)為我們的文件是由行組成的,也就是他認(rèn)為文件中的最后一行是以
:set endofline
如果你想設(shè)置一個文件不以
;set noendofline
在Vim中,我們有一系列的命令可使得我們在文件中進(jìn)行移動,例如)命令向前移動一個句子,而(是向后移動一個句子,}向前移動一個段落,而{是向后移動一個段落.
曾經(jīng)Troff是UNIX系統(tǒng)上專業(yè)的字處理程序,雖然在現(xiàn)代這個程序已經(jīng)很少用了,可是Vim還是包含了一些選項使得我們可以用這種曾經(jīng)的方式來處理文本.Troff需要用宏來告訴他應(yīng)做一些什么.其中的一些宏開始一個新的段落.因為Troff要用許多的宏包來,因而Vim需要知道哪些宏將開始一個新的段落.paragraphs選項可以做這些工作.這個選項的格式如下:
:set paragraphs="macromacro..."
每一個宏是兩個字符的Troff宏名,例如:set paragraphs="P LP"是告訴Vim宏.P和.LP開始一個新行.在默認(rèn)的情況下paragraph的選項如下:
:set paragraphs=IPLPPPQPP LIpplpipbp
這個命令列出下面的一些開始一個新段落的宏名:
.IP .LP .PP .QP .P .LI .pp .lp .ip .bp
我們可以使用命令[[和[]向前移動一個區(qū)間,而使用命令]]和][向后移動一個區(qū)間,一個區(qū)間是用頁分隔符(CTRL-L)定義的文本.我們也可以用Troff的宏來定義一個區(qū)間,section選項有些類似于paragraph選項,所不同的是前者定義一個宏用來分隔區(qū)間,而后者是段落.默認(rèn)情況下是這樣的;
:set section=SHNHH HUnhsh
在用Vim進(jìn)行文本處理時我們還可以對文本進(jìn)行加密處理,這種加密處理是最弱的一種加密處理方法,常常用新聞的發(fā)布.這時我們要用到的命令為g?motion.例如我們可以用命令g?g?或者是g??來加密當(dāng)前行.當(dāng)我們對一文本進(jìn)行兩次加密處理就為解密處理了.
vi編輯器的學(xué)習(xí)使用(十二)
我們在用Vim來處理文件時可以使用Vim的自動完成功能來大大加速我們的工作速度.所謂的自動完成也就是說當(dāng)我們輸入一個單詞的一部分以后,按CTRL-P,Vim就會自動的來完成剩下的部分.我們在前面的學(xué)習(xí)過程中曾用:abbreviate命令來簡記某一個單詞來達(dá)到自動完成的目的,而在這里我們將看到是一個更加強(qiáng)大的自動完成功能.Vim能非常簡單和靈活的來決定要用哪一個單詞來自動完成. 我們在使用Vim這個強(qiáng)大的自動完成功能的同時,還可以自已定義我們的自動完成的特征,而且還可以使用不同類型的自動完成功能.
如果我們在編寫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是如何找到匹配的單詞的呢?在默認(rèn)的情況下,Vim在查找一個單詞時是按照如下的步驟:
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)然了我們也可以自定義我們的查找順序.
我們在使用自動完成功能時的命令CTRL-P是向后查找匹配的單詞,而還有一個命令CTRL-N是向前查找匹配的單詞.他們有同樣的功能和作用,所不同的只是查找方向上的不同.
Vim還提供了許多的命令可以使得我們來自定義我們的一些查找上的特征.例如我們可以用下面的命令來告訴Vim在在自動完成的查找過程中忽略大小寫的區(qū)別:
:set ignorecase
這樣以后如果我們輸入ins,Vim就會認(rèn)為是INSERT,Inside或者是instep.當(dāng)然了前提是在我們所編輯的文本中含有這些詞,要不就會找得到了.
為了能夠精確的進(jìn)行查找來自動完成,我們并不希望上面的情況出現(xiàn),我們可以設(shè)置一些選項來告訴Vim區(qū)分大小寫的情況.這時我們要用到下面的命令:
:set infercase
這樣以后如果我們再輸入ins,與其相匹配的列表就成為了instep,inside,insert.我們可以通過按CTRL-P或是CTRL-N來進(jìn)行匹配完成.
在大多數(shù)情況下,Vim默認(rèn)的設(shè)置可以很好的來完成工作,但是有時我們要定義自己的一些完成的選項,這時我們就要用到complete這個選項了.這個選項的格式如下:
:set complete=key,key,key
而這個命令中可能出現(xiàn)的key值如下:
. 當(dāng)前文件
b 已被裝緩沖區(qū),但是沒有在窗口內(nèi)的文件
d 在當(dāng)前的文件中定義和由#include包含進(jìn)來的文件
i 由#include包含進(jìn)來的文件
k 由dictionary選項定義的文件
kfile 名為{file}的文件
t 標(biāo)記(tags)文件
u 沒有載入的緩沖區(qū)
w 在其他窗口中的文件
我們可以使用path選項來告訴Vim如何來查找我們在當(dāng)前文件中所包含進(jìn)來的文件.我們還可以指定一個字典,這個選項的格式如下:
:set dictionary=file,file,....
這個選項定義了由命令CTRL-P和CTRL-N進(jìn)行匹配查找時所要查找的文件.在Linux系統(tǒng)中這個定義文件在/usr/dict/words中,所以如果我們要將這個文件添加進(jìn)來進(jìn)行查找的話,我們就要用到下面的命令:
:set dictionary=/usr/dict/words
如果我們要使用一個我們自己的文件也可以這樣的來設(shè)置
:set dictionary=/home/oualline/words,/usr/doc/words
我們也可以指定一個字典文件和k選項組合使用:
:set dictionary=k/usr/oualline/words
我們也可以多次的使用k這個標(biāo)記選項:
:set dictionary=k/usr/dict/words,k/usr/share/words
在上面提到的CTRL-P和CTRL-N進(jìn)行查找匹配時查找的范圍比較的寬范,我們當(dāng)然也可以使用命令進(jìn)行一些比較嚴(yán)格的查找.這時我們可以使用命令CTRL-X.當(dāng)我們輸入CTRL-X時我們會進(jìn)入CTRL-X的一個子模式.這時我們可以使用下面的命令進(jìn)行查找:
CTRL-D 宏定義
CTRL-F 文件名
CTRL-K 字典
CTRL-I 當(dāng)前文件以及由#include包含進(jìn)來的文件
CTRL-L 整個行
CTRL-] 標(biāo)記(tags)
CTRL-P 向前查找,與沒有CTRL-X命令時相同
CTRL-N 向后查找,與沒有CTRL-X命令時相同
CTRL-X
CTRL-D命令查找宏定義.他也會查找#include文件.當(dāng)我們執(zhí)行完這個命令以后就可以使用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"
這時我們開始編輯main.c文件,如果我們按下CTRL-X我們就會進(jìn)入CTRL-X的子模式.如果我們要查找一個宏定義,我們可以按下CTRL-D,這時就會在屏幕的底部簡單的顯示出有多少匹配的選項.這樣我們就可以用CTRL-P和CTRL-N來進(jìn)行自動完成的功能了.而命令CTRL-X CTRL-]則是查找下一個標(biāo)記(tag),標(biāo)記是一個C函數(shù)的定義.我們可以用命令ctags命令來生成一個C函數(shù)定義的列表.我們可以這樣的來使用這個命令:
$ctags *.c *.h
這樣以后我們就可以在插入模式入下用CTRL-X CTRL-]命令來進(jìn)行標(biāo)記的查找和匹配了.
在默認(rèn)的情況下,vim編輯器只是簡單的顯示出標(biāo)記的名字,我們可以執(zhí)行下面的命令,這樣以后就可以顯示出整個標(biāo)記了:
:set showfulltag
我們可以使用CTRL-X CTRL-F命令來匹配文件名.他會在當(dāng)前的目錄下查找文件并會顯示出匹配的內(nèi)容,這時你就可以用CTRL-P和CTRL-N命令來選擇你想要的匹配選項了.
到目前為止我們所說還只是對單詞進(jìn)行操作,我們可以用命令CTRL-X CTRL-L對一行進(jìn)行匹配操作,同樣的我們也可以用CTRL-N和CTRL-P來進(jìn)行選項的匹配.我們還可以在輸入CTRL-X命令后用CTRL-Y向下滾動文本,而用CTRL-E向上滾動文本.
vi編輯器的學(xué)習(xí)使用(十三)
Vim最大的一個優(yōu)點就是他的靈活性.使得他具有如此靈活性的一個重要原因就是自動命令.所謂的自動命令就是一條命令,所不同的只是他可以在某些事件發(fā)生時自動執(zhí)行.
例如通過Vim的這樣自動命令,我們可以使用Vim來編輯壓縮文件,這是因為我們可以定義一個自動命令在我們讀取文件時解壓縮,在我們寫入文件時進(jìn)行壓縮.
我們在處理文件時有時希望文件在保存時在文件的結(jié)尾處插入當(dāng)前的日期,而這在Vim當(dāng)中我們可以使用自動命令來完成.我們可以定義這樣的一個函數(shù):
:function DateInsert()
: $read !date "在文件的結(jié)尾處插入日期
:endfunction
當(dāng)我們要保存文件時可以調(diào)用這個函數(shù):
:call DateInsert()
然后我們就可以保存退出了.
我們還可以將這個功能綁定在一個按鍵上:
:map
這種方法使用問題的解決更簡單,因為我們只需在要保存文件時按一下F12鍵就可以了.
但是也許有時我們會忘記這樣的步驟,而使用正常的保存命令,那么這時這個函數(shù)也就失去了意義.我們希望這個插入日期的命令可以自動被執(zhí)行,這也正是自動命令的意義所在.
下面的命令就可以來滿足我們的要求了:
:autocmd FileWritePre * :callDateInsert()
這個命令會使得所有的文件在保存之前調(diào)用這個插入日期的函數(shù).我們并不需要每一次都要輸入:write來保存文件,也就是說當(dāng)我們定義了這個命令以后,當(dāng)我們輸入一次:write命令,vim就會自動檢查所有未保存的文件并執(zhí)行我們定義的這個命令,然后執(zhí)行保存命令.
:autocmd命令的一般格式如下:
:autocmd group events file_patter nested command
在這個格式中組名(group)是一個可選項,他被用于管理和調(diào)用命令.參數(shù)事件(events)是一個事件列表,指明引發(fā)命令的事件,而嵌套標(biāo)記(nested)可以允許嵌套自動命令,最后是所要執(zhí)行的命令.
命令:augroup可以使得我們定義一組自動命令.這個組名最好應(yīng)是一個和我們要定義的一組自動命令相關(guān)聯(lián)的名字,如下面的例子:
:augroup cprograms
: autocmd FileReadPost *.c :set cindent
: autocmd FileReadPost *.cpp :set cindent
:augroup END
在這里因為這些自動命令是在:augroup的作用域之內(nèi)的,所以他們被放在cprogram這個組內(nèi).這組自動命令是在讀取C和Cpp之后執(zhí)行的.如果我們想在這個組中添加關(guān)于頭文件的自動命令,我們可以使用:augroup命令,或者是在我們的定義中包含這個組名.
如果我們正在編輯的文件名為sam.cx,而我們想將他當(dāng)作C程序文件來對處理.這時我們可以通過命令來告訴Vim編輯器在文件讀入以后將他與*.c文件相匹配.我們所用的命令如下:
:doautocmd group event file_name
在這個命令執(zhí)行的時候,Vim是將假定當(dāng)前文件的名字為file_name,而實際上這并不是他真正的文件名.如果在這個命令中我們并沒有指明組(group),那么所有的組都會被用到.而且我們必須指明事件,并且Vim會認(rèn)為這個事件已經(jīng)發(fā)生.與命令:doautocmd相類似的是命令:doautoall,所不同的只是后者是針對每一個緩沖區(qū)(buffer).這個命令的格式為:
:doautoall group event file_name
我們可以使用下列的命令來引發(fā)命令:
BufNewFile 當(dāng)編輯一個新文件時引發(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è)置時有效
Syntax 當(dāng)Syntax設(shè)置時有效
StdinReadPre StdReadPost 由標(biāo)準(zhǔn)輸入設(shè)備讀入或是輸出
BufWritePre BufWritePost 在將整個緩沖區(qū)寫入文件之前或是之后
BufWrite BufWritePre的另一種說法
FileWritePre FileWritePost 將部分緩沖區(qū)內(nèi)容寫入文件之前或是之后
FileAppendPre FileAppendPost 將一個文件由過濾命令輸入之前或之后
FileChangedShell
這個事件是在Vim運行Shell命令而文件的修改時間已經(jīng)改變時引發(fā)
FocusGained FocusLost
這個事件是在Vim編輯器得到或是失運輸入光標(biāo)時引發(fā).這意味著vim運行圖形界面,并且是Vim成為當(dāng)前窗口或是其他的成為當(dāng)前窗口
CursorHold
用戶停止輸入的時間長于由updatetime所指定的時間時引發(fā)
BufEnter BufLeave 當(dāng)進(jìn)入或離開緩沖區(qū)時引發(fā)
BufUnload 在緩沖區(qū)未載入之前引發(fā)
BufCreate BufDelete 在緩沖區(qū)產(chǎn)生以后或是在緩沖區(qū)刪除以前引發(fā)
GuiEnter 啟動GUI時引發(fā)
VimEnter Vim啟動而初始化文件還沒有讀入進(jìn)引發(fā)
VimLeave 退出Vim編輯器而.viminfo還沒有改寫時引發(fā)
FileEncoding fileencoding已經(jīng)被設(shè)置時有效
TermChanged term選項被更改時引發(fā)
User
并不是一個真正的事件,而是命令:doautocmd一起使用的一個事件
當(dāng)存文件時,只有下列事件成對出現(xiàn)時才引發(fā):
BufWritePre BufWritePost
FilterWritePre FilterWritePost
FileAppendPre FileAppendPost
FileWritePre FileWritePost
當(dāng)讀文件進(jìn),只要下列事件中的一個被設(shè)置則會引發(fā):
BufNewFile
BufReadPre BufReadPost
FilterReadPre FilterReadPost
FileReadPre FileReadPost
文件名類型與UNIX標(biāo)準(zhǔn)系統(tǒng)相匹配.下面列出是一些特殊字符匹配的情況:
* 匹配任意長度的任意字符
匹配單個字符
' 分隔交替的類型
\? 字符?
\, 字符,
\character
將這個字符看作是一個要查找的類型字符,例如:a\+可以匹配,aa,aaa等等
一般情況下一個命令的執(zhí)行結(jié)果并不會引發(fā)另一個事件.例如Syntax的執(zhí)行結(jié)果并不會引發(fā)FileReadPre事件.但是如果我們在自動命令中加入nested關(guān)鍵字就可以來引發(fā)了,例如下面的命令:
:autocmd FileChangedShell *.c nested e!
我們可以使用命令:autocmd列出所有的自動命令.
如果我們想要得到所有這些命令中的一個子集命令,我們可以使用如下的命令:
:autocmd group event pattern
在這個命令中如果我們指定了group,那么就會所有與group相匹配的命令.event可以是以前定義的或是所有的事件,pattern指了與類型相匹配的文件選項.只有那些與命令相匹配的命令才會被列出來.
我們可以建立我們自已的自動命令,當(dāng)然了我們也可以移除那些我們不再需要的自動命令.例如命令:autocmd!就可以移除所有的自動命令.
我們也可以用下面的命令來移除指定的組命令:
:autocmd! group
在這個命令中我們當(dāng)然也可以為這個組指定事件或是類型
:autocmd! group event pattern
event可以用*代替所有的事件
我們可以用命令:autocmd!來移除那些已經(jīng)存在的自動命令,我們還可以同時在一個命令中再新建一個我們自己的自動命令.這個語法的格式如下:
:autocmd! group event pattern nested command
這個命令等價于下面的兩個命令:
:autocmd! group event pattern
:autocmd group event pattern nested command
有時我們并不想引發(fā)某個命令,在這樣的情況下我們可以設(shè)置eventignore選項來指定那些要忽略的事件.例如下面的命令將進(jìn)入窗口和離開窗口的事件忽略掉:
:set eventignore=WinEnter,WinLeave
如果要忽略所有的事件,可以用下面的命令:
:set eventignore=all
vi編輯器的學(xué)習(xí)使用(十四)
Vim編輯器的不僅可以使得我們編輯各種各樣的文件,而且還有一些附加的功能來完成我們的作.例如說Vim可以實現(xiàn)在對文本文件進(jìn)行加密,而且我們還可以通過一命令行參數(shù)來控制我們對文件的處理.我們還可以通過交換文本來實現(xiàn)對文件的修復(fù).
我們在用Vim時常用一些有用的命令行參數(shù),在這些命令行參數(shù)中最有用的一個要算是--help,這個命令行參數(shù)可以簡單的列出一個幫助屏幕,在這個屏幕上列出所有的命令行參數(shù).這個命令的執(zhí)行結(jié)果如下:
這個命令的格式如下:
$ vim --help
如果要查出我們所使用的Vim的版本,我們可以使用下面的命令:
$ vim --version
我們可以用-R參數(shù)來在只讀狀態(tài)下打開一個文件,命令格式如下:
$ vim -R filename
在大多數(shù)的系統(tǒng)中,這個命令與下面的命令是相同的:
$ view filename
-x參數(shù)可以告訴Vim編輯器對某一個文本文件進(jìn)行加密處理.例如我們想要建立一個文件來保存一些我們自己的小秘密時就可以使用下面的命令:
$ vim -x filename
這時Vim編輯器就會要你來輸入加密和解密時所需要的密碼.這樣以后我們就可以在正常的狀態(tài)下來編輯我們的文本文件了,當(dāng)我們完成編輯工作要退出時,Vim就會將文本進(jìn)行加密處理后退出.當(dāng)我們想用cat或是type命令來打印出已進(jìn)行過加密處理的文件時會得到一些無意義的信息.
我們當(dāng)然是可以在加密和非加密兩種狀態(tài)下進(jìn)行選擇和切換.選項key包含了加密時的密碼.如果我們將這一項設(shè)為空,那么也就意味著我們關(guān)閉了加密選項.這個命令為:
:set key=
如果我們設(shè)定了一個密碼,那么我們就打開了加密選項.例如下面的命令:
:set key=
保存退出.此時的文件就沒有密碼,我們可以通cat和type命令來打印文件中的內(nèi)容.
而我們也可以通過樣的命令來重置我們的加密密碼.例如下面的命令:
:set key=secret
但是這樣的設(shè)置并不是一個好主意,因為在輸入這個命令時你所輸入的密碼是可以明文顯示的,別人在旁邊晃動一下肩膀也許就可以看到了,因而這是一個不安全的加密方法.為了避免這樣的問題,我們可以使用:X命令,這個命令可以將我們所輸入的密碼用*打印出來,因而不易被人看到,所以安全得多.
但是我們要清楚的認(rèn)識到,Vim所采用的這種加密算法是很弱的.也許他可以防住偶爾路過的小偷,但是不可能防住一個很有時間的密碼學(xué)專家.同時我們還要認(rèn)識到我們在編輯文件時所使用的交換文件(swap file)并沒有經(jīng)過加密,因而當(dāng)我們在進(jìn)行文件編輯時,一個有著超級權(quán)限的人可以通過交換文件得知我們所編輯的內(nèi)容.一個解決的辦法就是我們在編輯文件時不使用交換文件.如果我們在命令行參數(shù)中指定-n參數(shù),我們就可以在編輯文件時不使用交換文件,這時我們所輸入的內(nèi)容是存在內(nèi)存中的.例如我們可以使用下面的命令來編輯一個加密的文件同時不使用交換文件:
$ vim -x -n filename
但是我們應(yīng)該知道在不使用交換文件的情況下,防止了別人偷看我們編輯器的內(nèi)容,而我們也不可能通過這個交換文件來恢復(fù)我們的文件了.
因為不使用交換文件時我們所輸入的內(nèi)容存在于內(nèi)存中,因而就百以文本方式存在的.任何人都可以通過查看編輯器的內(nèi)存來發(fā)現(xiàn)我們文件中的內(nèi)容.如果你真的是想保密你的文件,那只能在使用一個不用聯(lián)網(wǎng)的電腦,使用好的加密工具,當(dāng)電腦不用的時候我們要安全的鎖起來了.要不我們可要怎么辦呢?!:-)
想一下,如果我們要處理許多的文件,而要將這些文件中的字符串-person-換成Jones.我們應(yīng)怎么樣來做呢?一個辦法就是我們要輸入許多次來手工的更改(想一想這樣的事情有多的恐怖),另一個解決辦法就是我們可以寫一個Shell腳本或是批處理文件來做這樣的工作.Vim作為一個原始的屏幕編輯器在正常模式下啟動可以極好的完成這樣的工作.然而要批處理,Vim并不會產(chǎn)生一個空的有注釋的文件,因而我們要使用ex的命令模式.這種方式給了我們一個極好的命令行的接口可以很容易的放入批文件中.
在我們這個例子中我們所需要的命令如下:
:%s/-person-/Jones/g
:write
:quit
我們將這些命令放入一個名為change.vim的文件中,然后在批模式下運行Vim,這時我們可以使用這樣的命令:
$ vim -es file.txt<>
這個是告訴Vim是ex命令模式下運行處理文件file.txt并從change.vim中讀入文件.-s標(biāo)記告訴Vim不要給出任何的輸出提示一類的內(nèi)容.
還有另外的一些命令行參數(shù)使得我們可以更好的來控制Vim編輯器:
-R 打開一個文件只讀
-m 允許修改.這個選項允許我們可以設(shè)置write選項和修改文件
-Z
受限模式.這個命令參數(shù)可阻止我們使用:shell命令或是其他的一些命令來使用外部的Shell.但是這個選項并不會阻止我們使用:vi命令來編輯文件.
另外還有一些命令行參數(shù)可以允許我們決定讀取哪一個初始化文件:
-u file
使用file為初始化文件,而不是使用.vimrc作為初始化文件.如果沒有這個文件,那么就不會用任何的初始化文件.
-U file
使用file而不使用.gvimrc作為初始化文件.如果沒有這個文件,同樣不使用任何的初始化文件.
-i file 使用file而不使用.viminfo作為初始化文件.
在UNIX系統(tǒng)中,Vim編輯器實際上是一個有著不同的名字或鏈接的文件.Vim編輯器在哪種模式下啟動,取決于我們用什么樣的命令或是名字來啟動他.一些常用的命令如下:
vim 在終端模式下啟動(在當(dāng)前窗口內(nèi)啟動編輯)
gvim 在圖形模式下啟動(編輯器啟動他自己的窗口來進(jìn)行編輯)
ex 在ex模式下啟動
view 在正常模式下啟動,只讀
gview 在圖形模式下啟動,只讀
rvim 在終端模式下啟動,受限
rview 在終端模式下啟動,只讀,受限
rgvim 在圖形模式下啟動,受限
rgview 在圖形模式下啟動,只讀,受限
vi Linux下的啟動命令,同vim
我們也可以通過命令行參數(shù)來設(shè)置初始化模式:
-g 在圖形模式下啟動vim(與命令gvim相同)
-v 在可視化模式下啟動(與命令vim相同)
-e 在ex模式下啟動(與大多數(shù)系統(tǒng)上使用ex命令相同)
我們還可以使用一些命令行參數(shù)來調(diào)試我們的Vim編輯器,常用的命令行參數(shù)有下面的一些:
-Vnumber
顯示額外的信息以使我們知道在編輯器的內(nèi)部都做了一些什么.數(shù)字越大,我們得到的輸出信息也就越多.這個參數(shù)常用來調(diào)試我們的Vim編輯器腳本.
-f
前景.我們不要在背景模式下啟動圖形界面.這個啟動對于那些只有一個程序執(zhí)行完畢才開始執(zhí)行另一個程序的情況顯得尤為有用.當(dāng)然了這個選項對調(diào)試也是相當(dāng)有用的.
-w script
將用戶輸入的所有字符存入腳本文件.如果這個文件已經(jīng)存在,那么就追加在文件后面.
-W script -W相類似,只是這個選項會覆蓋掉已經(jīng)存在的數(shù)據(jù)
-s script 用-w選項來恢復(fù)腳本記錄
-T terminal
設(shè)置終端類型.在UNIX系統(tǒng)中,這會改寫$TERM的環(huán)境變量(當(dāng)然了,如果$TERM環(huán)境變量錯誤,其他的許多程序都將會崩潰)
我們還有一些兼容的命令行參數(shù).這些參數(shù)可以使得我們的Vim運行起來更像是Vi;
-N
這個參數(shù)可以使得Vim以自己的方式來運行,而不是不是像Vi的方式運行.這個參數(shù)是被.vimrc文件默認(rèn)定義的.
-C
兼容模式.這個參數(shù)關(guān)掉了許多Vim的自己的特征,而是盡量的像Vi的方式一樣的運行.
-l
Lisp模式.這種模式完全是由老版本的vi延續(xù)下來的.他設(shè)置了lisp和showmatch選項.這時的Vim的與文件類型相關(guān)的命令都可以很好的處理Lisp程序,并且這是可以自動完成的.
最后還有一些不知道該將他們歸為哪一類的命令行參數(shù):
-d device 打開編輯給定的設(shè)備文件
-b 二進(jìn)制模式.設(shè)置了noexpandtab,textwidth=0,nomodeline,binary
在一般的情況下,vim是不產(chǎn)生備份文件的.如果我們希望他產(chǎn)生備份文件,我們可以使用下面的命令:
:set backup
產(chǎn)生的備份文件的名稱是在原始文件名的最后加上了~.例如我們有一個名為data.txt的文件,那么由Vim所產(chǎn)生的備份文件名即為:data.txt~.
如果我們不喜歡這個備份文件的擴(kuò)展名,我們可以定義我們自己的備份文件擴(kuò)展名.這時我們要到下面的命令:
:set backupext=string
例如如果我們設(shè)置了backupext的值為.bak,那么新的備份文件名即為data.txt.bak
如果我們設(shè)置了patchmode選項,那么Vim編輯器就會以當(dāng)前文件名加上patchmode的值為文件名備份正在編輯的文件.但是我們要注意的是只有以這個文件名為文件名的備份文件不存在時才會產(chǎn)生這樣的備份文件.例如我們執(zhí)行下面的命令:
:set patchmode=.org
如果我們是第一次編輯一個已經(jīng)存在的文件:data.txt.當(dāng)我們執(zhí)行了這樣的命令保存退出想要看一下事實是否是這樣的.因為以前這個備份文件并不存在,所以會產(chǎn)生一個備份文件,名為:data.txt.org.但是當(dāng)我們再一次編輯這個文件保存退出后,因為這個備份文件已經(jīng)存在,所在現(xiàn)在的備份文件名:data.txt~.
通常情況下Vim編輯器會將備份文件放在與文件相同的目錄下,我們可以通過設(shè)置backupdir選項來選擇我們的備份文件存放的地方,例如我們想將備份文件放在~/tmp目錄下,我們可以通過執(zhí)行下面的命令來做到:
:set backupdir=~/tmp/
但是這樣的設(shè)置有時也會產(chǎn)生問題的,如果我們在不同的目錄下編輯具有相同文件名的文件,當(dāng)我們保存退出時,Vim會將備份文件放在~/tmp/目錄下,名字的沖突會使得老的備份文件丟失.同時我們還要知道的就是這個選項可以同時設(shè)置幾個值,中間用逗來分隔.Vim會將備份文件放在第一個目錄下.
一般情況下,當(dāng)Vim保存文件時,會執(zhí)行下面的步驟:
1
Vim要檢查Vim外面的文件是否被做了改動.例如也許有的人已將這個文件重新命名了,如果發(fā)生這樣的情況,Vim就會給出警告并詢問是否繼續(xù).
2
如果設(shè)置了writebackup或是backup選項,Vim就會將舊的備份文件移除,同時產(chǎn)生一個當(dāng)前文件的副本做為新的備份文件
3 將緩沖區(qū)的內(nèi)容寫入文件.
4
如果設(shè)置了patchmode選項而不存patch文件,那么Vim就會將備份文件重命名成為patch文件
5 如果沒有設(shè)置backup選項,而是設(shè)置了writebackup選項,就會移除備份文件
Vim覆蓋已經(jīng)存在的文件的原因是因為要保護(hù)UNIX系統(tǒng)上的硬鏈接.在非UNIX系統(tǒng)上,備份文件只是通過重命名當(dāng)前文件來產(chǎn)生
注意:如果我們設(shè)置了nobackup和nowritebackup選項,Vim會覆蓋已經(jīng)存在的文件.這在磁盤已滿而更新文件時會造成數(shù)據(jù)的丟失.
在默認(rèn)的情況下,Vim設(shè)置了writebackup選項.這就意味著Vim很難會丟失數(shù)據(jù).通過采用這樣的方法,在磁盤已滿的情況下,我們就沒有機(jī)會丟失文件.也許我們會不能寫入新文件,但是我們不會丟失我們的舊文件.
我們在用Vim來編寫時,Vim會在我們編寫的過程中產(chǎn)生一個臨時的交換文件,這個交換文件中包含著我們所做過的所有修改,當(dāng)我們完成編寫工作,保存退出后,這個臨時文件會被刪掉.但是如果Vim遇到了意外情況而退出時,這個臨時文件會因為來不及刪除而存在于硬盤上.當(dāng)Vim啟動時他會檢查在當(dāng)前目錄中是否存著交換文件,如果存在,則意味著有一個Vim正在編輯此文件,或者是我們在Vim編輯器的過程中遇到意外而退出,從而留下交換文件.這時Vim就會給出警告信息,并會給我們機(jī)會要我們自己來決定我們下一步要怎么做.這時我們可以有以下四個選項:
Open Read-Only(以只讀方式打開)
這個選項會告訴Vim以只讀方式打開.如果我們想要看到文件中的內(nèi)容或是有另一個編輯過程正在運行,我們可以選擇這個選項
Edit anyway
如果我們選擇這個選項我們可以對這個文件進(jìn)行編輯.我們最好不要選擇這個選項,除非我們對我們正在做的事情有著絕對的把握.這時我們應(yīng)該知道,如果同時有兩個或是多個編輯過程同時編輯一個文件,只有最后一個保存的編輯過程有效
Recover
如果我們正在編輯我們的文件,而由于系統(tǒng)故障或是其他的原因而導(dǎo)致vim意外退出時我們可以選擇這個選項.此時Vim會檢查交換文件,并試著從我們意外退出的地方重新開始
Quit 取消對此文件的修改
在我們選擇了其中的一項后我們就可以正常的開始我們的編輯工作了.如果我們選擇了Recover我們要十分小心,因為我們以前所做過的修改并不一定被保存下來.
如果我們記得Vim意外退出時我們正在編輯的文件,我們可以用-r命令參數(shù)在修復(fù)模式下啟動Vim.例如我們在編輯文件commands.c時Vim意外退出,我們就可以用下面的命令在修復(fù)模式下啟動vim:
$ vim -r commands.c
如果我們想得到一個可以修復(fù)的編輯器程序列表,我們可以用下面的命令:
$ vim -r
這樣Vim就會在當(dāng)前目錄和標(biāo)準(zhǔn)的臨時的目錄下查找交換文件,命令的執(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在意外退出的情況下并不會覆蓋舊的交換文件.例如第一次編輯時產(chǎn)生的交換文件名為.file.txt.swp.如果我們再編輯又遇到意外退出時所產(chǎn)生的交換文件名為.file.txt.swo,到第三次時所交生的交換文件為.file.txt.swn,如此類推.
我們在啟動Vim時可以指明用哪一個交換文件來修復(fù)文件,命令如下:
$ vim -r .file.txt.swo
如果想知道我們當(dāng)前正在使用的交換文件的名稱可以使用下面的命令:
:swapname
這樣就會顯示交換文件的名稱.
通常情況下,交換文件會每4秒或是每隔200個字符保存一次.這個數(shù)值是由updatecount和updatetime選項來控制的.我們可以用下面的命令來設(shè)置交換文件每23秒保存一次:
:set updatetime=23000
(注:這個數(shù)值是以微秒計的)
或者是我們可用下面的命令來設(shè)置vim每400個字符保存一次:
:set updatecount=400
如果我們將updatecount的值為0,那么交換文件就不會被保存了.
事實上我們可以來控制是不是要在編輯的過程中產(chǎn)生交換文件,例如下面的命令是在產(chǎn)生交換文件,而這也正是Vim所默認(rèn)的:
:set swapfile
我們也可以用下面的命令來使Vim不產(chǎn)生交換文件:
:set noswapfile
我們可以對每一個編輯的文件將這個選項設(shè)置或是重置.如果我們正在編輯一個大文件而我們又不想可以修復(fù),我們可設(shè)置noswapfile.如果我們同時正在另一個窗口編輯一個文件,那么這個窗口中的文件仍是使用交換文件的.
在UNIX或是Linux系統(tǒng)中,當(dāng)我們要保存文件時,通常數(shù)據(jù)被裝入內(nèi)存緩沖區(qū),并肯是在系統(tǒng)認(rèn)為是一個合適的時才會被寫入文件.這通常只是幾秒鐘的事情.如果我們想要確認(rèn)數(shù)據(jù)到達(dá)了磁盤,我們可以使用下面的命令:
:set swapsync
這個命令是告訴Vim編輯器在每一次將文件寫入交換文件的同時寫入磁盤.swapsync選項可以是fsync或是sync,這個取決于我們要保存文件時的系統(tǒng)調(diào)用.
通常情況下,Vim是在和當(dāng)前文件相同的目錄下產(chǎn)生交換文件,我們可以通過directory選項來更改交換文件產(chǎn)生的目錄.例如下面的命令可以將產(chǎn)生的交換文件放在/tmp目錄下:
:set directory=/tmp
這并不是一個好主意,因為如果我們是在不同的目錄下編輯具有相同文件名的文件時會產(chǎn)生名字沖突.
我們也可以將這個選項設(shè)成一個目錄列表,中間用逗號來分隔.最好的方法就是將當(dāng)前目錄(.)設(shè)為目錄列表的第一個選擇.在存放交換文件時首先放在列表的第一項指的目錄處,這樣交換文件首先會被存放在當(dāng)前目錄下.
如果我們已經(jīng)做許多的改動,我們想保存我們當(dāng)前所做工作,我們可以使用下面的命令:
:write
但是這個命令是用我們當(dāng)前所做的改動來重寫已經(jīng)存的文件,與其相關(guān)的一個命令是
:preserve
這個命令是將我們所做工作存入交換文件,而原始的保持不變,直到我們用:write或是ZZ命令退出時才會被重寫.在這樣的情況下,如果Vim遇到意外,我們可以用交換文件來修復(fù)我們所做的工作,哪怕是原始文件已經(jīng)丟失.如果沒有用這個命令,我們就不得不同時修復(fù)原始文件和交換文件.
我們不僅可以在啟動vim時修復(fù)文件,還可以用下面的命令來修復(fù)文件:
:recover file.txt
這個命令與下面的有著同樣的作用:
$ vim -r file.txt
如果我們用:recover命令試圖修復(fù)我們正編輯的文件則會返回錯誤.如果沒有指定文件名,則默認(rèn)的當(dāng)前緩沖區(qū)中的文件.如果我們想要放棄我們所做的修改并試圖修復(fù)時,我們可以使用下面的命令:
:recover! file.txt
vi編輯器的學(xué)習(xí)使用(十五)
Vim大量的工作是通過命令行的方式來完成,這樣的命令行方式對于則接觸Vim新手來說也許會覺得難于操作,可是當(dāng)我們習(xí)慣了這樣的工作方式后,我們就不得不佩服Vim的強(qiáng)大功能,正是這些命令使得我們可以高效的來完成我們的工作.而在Vim當(dāng)中還有一些其他的命令.
命令:ascii或者是ga可以用ASCII碼和八進(jìn)制及十六進(jìn)制打印出來.當(dāng)我們編輯多字節(jié)文件時,例如說我們的漢語,這個命令就可以打印所有的字節(jié).
命令countgo可以到達(dá)當(dāng)前文件中由count所字的字符數(shù)的位置.例如命令3go就可以到達(dá)文件中的第三個字符處.而命令gCTRL-G可顯示出當(dāng)前文件中的字符數(shù)的信息,同是顯示出當(dāng)前行,當(dāng)前列以及其他的一些信息.
而命令:goto offset可以將光標(biāo)置于由offset所指定的字符處.而命令gg則與我們以前見到過的G命令相類似,他也可以到達(dá)由count所指定的行.例如5gg可以到達(dá)第5行.gg命令與G命令所不同的地方只是在沒有指定count值時前者回到第一行,而后者要到最后一行.
而命令CTRL-L可以起到重畫屏幕的作用.這個命令在我們使用終端窗口或是在屏幕上存在著一些系統(tǒng)信息時顯得尤為有用.而命令:sleep time可以使得我們的Vim編輯器在指定的時間不做任何事情(Sleep嘛:-)).在這個命令中如果時間是以m結(jié)尾則是指的微秒.這個命令在我們想暫停執(zhí)行宏時顯得更為有用.而命令count gs命令也有同樣的作用.
在大多數(shù)的終端上,CTRL-S可以停止輸出,如果我們要重新啟動他,則要CTRL-Q命令.這兩個命令并不是Vim命令中的一部分.為了避免鍵盤的沖突,我們在Vim中并不用這兩個命令.我們最好也不要試著用:map命令將一些功能和這兩個鍵進(jìn)行綁定,因為在執(zhí)行這兩個命令時是鍵盤得到命令而不會到達(dá)Vim.
如果我們是在UNIX或是LINUX系統(tǒng)的終端模式下進(jìn)行工作,我們可以用命令CTRL-Z來中止我們的正常編輯狀態(tài).如果我們要繼續(xù)編輯則要使用Shell命令fg.而命令:suspend也會有同樣的作用.
在一般的情況下我們可以使用:help或是F1鍵來顯示幫助屏幕,從而得到一般的幫助信息.
我們可以使用z height
我們在沒有輸入文件名的情況下啟動Vim時會看到一個介紹的屏幕,這個屏幕在我們輸入任一字符后消失,如果我們想再看到他,可以使用下面的命令:
:intro
vi編輯器的學(xué)習(xí)使用(十六)
Vim是一個強(qiáng)大的文本編輯器,這個強(qiáng)大的文本編輯器的大部分工作是通過命令行的方式完成的.Vim一系列的命令可以使得我們快速高效的完成我們的各種各樣的工作.下面我們就來看一下在Vim的編輯中常出現(xiàn)的問題的一些解決辦法.
在我們快速的輸入文本的時候,很容易使得一些單詞輸入錯誤.例如我們本應(yīng)輸入的是the,而我們卻錯輸入成了teh,這時我們可以通過簡單的命令使得這e和h這兩個字母交換一下位置來達(dá)我們改錯的目的.我們可以將光標(biāo)放在e上,然后輸入命令xp,x命令刪除掉字母e,而p命令則是將他放在當(dāng)前光標(biāo)的后面,也就是h字母的后,從而就達(dá)到了改錯的目的.
在我們進(jìn)行文本編輯的時候有時要做一些文本替換的工作,例如是將文中所有的字符串idiots替換成managers.這時我們可以使用下面的命令:
:1,$s/idiots/manages/g
這個是命令是以冒號(:)開頭的,則表明這是一個ex模式的命令.所有的ex命令都指明了命令要作用的范圍.在這種情況選定了當(dāng)前的所有文本,從第一行到最后一行($).我們可以也可以用%來簡單指整篇文章.而s命令是命令:substitute的縮寫.舊的文本放在前面,而新的文本則放在后面,g標(biāo)記則指明這是一個全局的替換,這樣就不會出在一行中多交出現(xiàn)要替換的文本而只替換第一個的情況了.
但是有時我們希望在進(jìn)行文本替換以前Vim可以向我們進(jìn)行一些詢問,然后由我們來決定下一步的操作.在這樣的情況下我們可以按照下面的方法來做:
1 執(zhí)行命令1G到文檔的開始處.
2 執(zhí)行命令/idiot來查找文章中出idiot的地方
3 執(zhí)行命令cwmanager
4 執(zhí)行命令n重復(fù)上一次的查找
5 執(zhí)行命令.重復(fù)上一次的編輯操作,如果在這一步我們不想進(jìn)行替換,我們可以跳過這一步,進(jìn)行下一次的查找.
6 重復(fù)以上兩步直到將文件中的所有字符idiot替換成manager
我們還可以執(zhí)行下面的命令來達(dá)到同樣的作用:
:%s/idiot/manager/cg
在這個命令中我們是用%來指代文章中的所有的行,與上一個命令不同的地方是我們加入了標(biāo)記c,這個標(biāo)記可以告訴Vim每一次在替換之前都要進(jìn)行詢問.
我們在進(jìn)行文本編輯時想要進(jìn)行文本的移動操作我們又該如何來做呢?這時我們可以按照下面的步驟來做:
1 將光標(biāo)移到我們要移動的段落的開頭部分
2 用命令ma在此處做上標(biāo)記.
3 將光標(biāo)移到這個段落的底部
4 執(zhí)行命令d'a來刪除剛才做了標(biāo)記的文本.
5 將光標(biāo)移到我們想放置文本的地方.
6 執(zhí)行命令p將這段文本放在此處
這樣我們就達(dá)到移動文本的目的.
我們可以按照下面的方法來做,可以達(dá)到同樣的效果:
1 用光標(biāo)放在第一行并將其標(biāo)記為a
聯(lián)系客服