天天看點

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

這幾個指令中有一些需要說明的地方:[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<Tab>,這時的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中用一個縮寫的字元來代替一個單詞, 然後在我們想要輸入這個單詞時隻要輸入這個縮寫的字元就可輸入我們想要的單詞了。我們如何來做到這些呢?這時我們要用到的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

這 個縮寫可以在加快我們添加注釋的速度。我們在編寫程式檔案時常有這樣的習慣,那就是在程式的開頭總是要加上一個注釋塊,來标明我們此程式的目的等。在這個 縮寫中有一點要我們注意的地方,那就是我們希望在寫程式的注釋塊時下一行要和上一行對齊,要做到這一點就要求第二行的注釋開頭的兩個字母要是空格,但是在 這個縮寫指令中會忽略到空格的作用,因而我們在寫這個縮寫時在開頭寫上<space>,這樣就會滿足我們的要求了。也許有時我們會在一個檔案 中設定了多個縮寫,我們可以指令:abbreviate來列出我們這個檔案中所有的縮寫的設定。

另一個比較有趣和強大的指令就是:map指令,這個指令可以使得我們将鍵盤上的一個按鍵與vi中的指令綁定在一起。例如我們現在将一個單詞用花括号括起來,例如我們要将amount變成{amount}的形式,這時我們就可以這樣的來應用這個指令:

:map <F5> i{<Esc>ea}<Esc>

在這個指令中:map是vi中的指令,而F5則是說将下面的指令與F5鍵綁定,後面的則是具體的指令内容,i{<Esc>是說插入字元{,然後退回到指令狀态。e是移到單詞的結尾處,a}<Esc>則是增加字元}然後退至指令狀态。

在我們做過這樣的工作以後我們就可以來執行我們的指令了,我們将光标定位在一個單詞上,例如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

我們還可以加入一些其他的東西,這樣就可大的友善我們的工作了。而這也正是vi的強大之處 。

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指令。我想這對于程式人員來說真是一個巨大的幫助。:)

vi編輯器的學習使用(十)

在我們談起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-Left Mouse>    選中到光标處的文本

<S-Right Mouse>    顯示彈出菜單

中鍵:        将系統剪切闆中的文本粘貼到檔案

(注:其中的S為Shift鍵)

其他的一些特殊的用法:

Shift+左鍵:    向前搜尋光标處的文本

Shift+右鍵:    向後搜尋光标處的文本

Ctrl+左鍵:    跳轉到以光标處的文本為名字的标記(tag)處

Ctrl+右鍵:    跳轉到前一個标記處

在 圖形界面的Vim編輯器還有一個有趣的特征,那就是當我們點開一個菜單時就會發在子菜單的第一行有一條虛線,點選此虛線就可以将這個菜單移其他的地方。關 閉後Vim的菜單結構又恢複到正常的狀态了。在GTK版本和Windows版本中的圖形界面的Vim還有一個工具欄,這些工具可以快速的完成我們的工作。

vi編輯器的學習使用(十一)

雖然現在的專業的文字處理軟體例如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是我們要使用的指令的名字.

在 早期的列印機的時代,開始新的一行要占用兩個字元的時間.如果到了一行的結尾處,你要他快速的回到新的一行的開頭,列印的針頭在紙面上飛快到掠過,常常就 會在紙面的中間留不希望的污點.這個問題的解決辦法就是用兩個字元來解決:一個字元<Return>來移到第一列,而字元<Line feed>來新增一行.計算機産生以後,存儲較為昂貴,在如何解決回車換行這個老問題上,人們産生了不同的意見.UNIX人認為在到達一行的結尾時 新增一行(<Line feed>),而蘋果人則認同<Return>的解決辦法,MS則堅持古老的<Return>,<Line feed>的方法.這就意味着如果你将一個檔案從一個系統轉移到另一個系統,你就面臨着回車換行的問題.而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編輯器認為我們的檔案是由行組成的,也就是他認為檔案中的最後一行是以<EOL>為結束符的.有時我們會遇到不包含有結束 标記行的檔案,當Vim遇到這樣的檔案時,他就會設定noendofline選項,而當遇到正常結束符的檔案時則會設定endofline選項.如果你想 設定你的檔案以<EOL>結束符結尾則可以用下面的指令:

:set endofline

如果你想設定一個檔案不以<EOL>結束符來結尾,則可以用下面的指令:

;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??來加密目前行.當我們對一文本進行兩次加密處理就為解密處理了.

vi編輯器的學習使用(十二)

我們在用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向上滾動文本.

vi編輯器的學習使用(十三)

Vim最大的一個優點就是他的靈活性.使得他具有如此靈活性的一個重要原因就是自動指令.所謂的自動指令就是一條指令,所不同的隻是他可以在某些事件發生時自動執行.

例如通過Vim的這樣自動指令,我們可以使用Vim來編輯壓縮檔案,這是因為我們可以定義一個自動指令在我們讀取檔案時解壓縮,在我們寫入檔案時進行壓縮.

我們在處理檔案時有時希望檔案在儲存時在檔案的結尾處插入目前的日期,而這在Vim當中我們可以使用自動指令來完成.我們可以定義這樣的一個函數:

:function DateInsert()

:    $read !date    "在檔案的結尾處插入日期

:endfunction

當我們要儲存檔案時可以調用這個函數:

:call DateInsert()

然後我們就可以儲存退出了.

我們還可以将這個功能綁定在一個按鍵上:

:map <F12>:call DateInsert()<CR>/|:write<CR>

這種方法使用問題的解決更簡單,因為我們隻需在要儲存檔案時按一下F12鍵就可以了.

但是也許有時我們會忘記這樣的步驟,而使用正常的儲存指令,那麼這時這個函數也就失去了意義.我們希望這個插入日期的指令可以自動被執行,這也正是自動指令的意義所在.

下面的指令就可以來滿足我們的要求了:

:autocmd FileWritePre * :callDateInsert()<CR>

這個指令會使得所有的檔案在儲存之前調用這個插入日期的函數.我們并不需要每一次都要輸入: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

vi編輯器的學習使用(十四)

Vim編輯器的不僅可以使得我們編輯各種各樣的檔案,而且還有一些附加的功能來完成我們的作.例如說Vim可以實作在對文本檔案進行加密,而且我們還可以通過一指令行參數來控制我們對檔案的處理.我們還可以通過交換文本來實作對檔案的修複.

我們在用Vim時常用一些有用的指令行參數,在這些指令行參數中最有用的一個要算是--help,這個指令行參數可以簡單的列出一個幫助螢幕,在這個螢幕上列出所有的指令行參數.這個指令的執行結果如下:

這個指令的格式如下:

$ vim --help

如果要查出我們所使用的Vim的版本,我們可以使用下面的指令:

$ vim --version

我們可以用-R參數來在隻讀狀态下打開一個檔案,指令格式如下:

$ vim -R filename

在大多數的系統中,這個指令與下面的指令是相同的:

$ view filename

-x參數可以告訴Vim編輯器對某一個文本檔案進行加密處理.例如我們想要建立一個檔案來儲存一些我們自己的小秘密時就可以使用下面的指令:

$ vim -x filename

這 時Vim編輯器就會要你來輸入加密和解密時所需要的密碼.這樣以後我們就可以在正常的狀态下來編輯我們的文本檔案了,當我們完成編輯工作要退出時,Vim 就會将文本進行加密處理後退出.當我們想用cat或是type指令來列印出已進行過加密處理的檔案時會得到一些無意義的資訊.

我們當然是可以在加密和非加密兩種狀态下進行選擇和切換.選項key包含了加密時的密碼.如果我們将這一項設為空,那麼也就意味着我們關閉了加密選項.這個指令為:

:set key=

如果我們設定了一個密碼,那麼我們就打開了加密選項.例如下面的指令:

:set key=

儲存退出.此時的檔案就沒有密碼,我們可以通cat和type指令來列印檔案中的内容.

而我們也可以通過樣的指令來重置我們的加密密碼.例如下面的指令:

:set key=secret

但 是這樣的設定并不是一個好主意,因為在輸入這個指令時你所輸入的密碼是可以明文顯示的,别人在旁邊晃動一下肩膀也許就可以看到了,因而這是一個不安全的加 密方法.為了避免這樣的問題,我們可以使用:X指令,這個指令可以将我們所輸入的密碼用*列印出來,因而不易被人看到,是以安全得多.

但是我們要 清楚的認識到,Vim所采用的這種加密算法是很弱的.也許他可以防住偶爾路過的小偷,但是不可能防住一個很有時間的密碼學專家.同時我們還要認識到我們在 編輯檔案時所使用的交換檔案(swap file)并沒有經過加密,因而當我們在進行檔案編輯時,一個有着超級權限的人可以通過交換檔案得知我們所編輯的内容.一個解決的辦法就是我們在編輯檔案 時不使用交換檔案.如果我們在指令行參數中指定-n參數,我們就可以在編輯檔案時不使用交換檔案,這時我們所輸入的内容是存在記憶體中的.例如我們可以使用 下面的指令來編輯一個加密的檔案同時不使用交換檔案:

$ vim -x -n filename

但是我們應該知道在不使用交換檔案的情況下,防止了别人偷看我們編輯器的内容,而我們也不可能通過這個交換檔案來恢複我們的檔案了.

因 為不使用交換檔案時我們所輸入的内容存在于記憶體中,因而就百以文本方式存在的.任何人都可以通過檢視編輯器的記憶體來發現我們檔案中的内容.如果你真的是想 保密你的檔案,那隻能在使用一個不用聯網的電腦,使用好的加密工具,當電腦不用的時候我們要安全的鎖起來了.要不我們可要怎麼辦呢?!:-)

想一 下,如果我們要處理許多的檔案,而要将這些檔案中的字元串-person-換成Jones.我們應怎麼樣來做呢?一個辦法就是我們要輸入許多次來手工的更 改(想一想這樣的事情有多的恐怖),另一個解決辦法就是我們可以寫一個Shell腳本或是批處理檔案來做這樣的工作.Vim作為一個原始的螢幕編輯器在正 常模式下啟動可以極好的完成這樣的工作.然而要批處理,Vim并不會産生一個空的有注釋的檔案,因而我們要使用ex的指令模式.這種方式給了我們一個極好 的指令行的接口可以很容易的放入批檔案中.

在我們這個例子中我們所需要的指令如下:

:%s/-person-/Jones/g

:write

:quit

我們将這些指令放入一個名為change.vim的檔案中,然後在批模式下運作Vim,這時我們可以使用這樣的指令:

$ vim -es file.txt<change.vim

這個是告訴Vim是ex指令模式下運作處理檔案file.txt并從change.vim中讀入檔案.-s标記告訴Vim不要給出任何的輸出提示一類的内容.

還有另外的一些指令行參數使得我們可以更好的來控制Vim編輯器:

-R    打開一個檔案隻讀

-m    允許修改.這個選項允許我們可以設定write選項和修改檔案

-Z

受限模式.這個指令參數可阻止我們使用:shell指令或是其他的一些指令來使用外部的Shell.但是這個選項并不會阻止我們使用:vi指令來編輯檔案.

另外還有一些指令行參數可以允許我們決定讀取哪一個初始化檔案:

-u file

使用file為初始化檔案,而不是使用.vimrc作為初始化檔案.如果沒有這個檔案,那麼就不會用任何的初始化檔案.

-U file

使用file而不使用.gvimrc作為初始化檔案.如果沒有這個檔案,同樣不使用任何的初始化檔案.

-i file        使用file而不使用.viminfo作為初始化檔案.

在UNIX系統中,Vim編輯器實際上是一個有着不同的名字或連結的檔案.Vim編輯器在哪種模式下啟動,取決于我們用什麼樣的指令或是名字來啟動他.一些常用的指令如下:

vim    在終端模式下啟動(在目前視窗内啟動編輯)

gvim    在圖形模式下啟動(編輯器啟動他自己的視窗來進行編輯)

ex    在ex模式下啟動

view    在正常模式下啟動,隻讀

gview    在圖形模式下啟動,隻讀

rvim    在終端模式下啟動,受限

rview    在終端模式下啟動,隻讀,受限

rgvim    在圖形模式下啟動,受限

rgview    在圖形模式下啟動,隻讀,受限

vi    Linux下的啟動指令,同vim

我們也可以通過指令行參數來設定初始化模式:

-g    在圖形模式下啟動vim(與指令gvim相同)

-v    在可視化模式下啟動(與指令vim相同)

-e    在ex模式下啟動(與大多數系統上使用ex指令相同)

我們還可以使用一些指令行參數來調試我們的Vim編輯器,常用的指令行參數有下面的一些:

-Vnumber

顯示額外的資訊以使我們知道在編輯器的内部都做了一些什麼.數字越大,我們得到的輸出資訊也就越多.這個參數常用來調試我們的Vim編輯器腳本.

-f

前景.我們不要在背景模式下啟動圖形界面.這個啟動對于那些隻有一個程式執行完畢才開始執行另一個程式的情況顯得尤為有用.當然了這個選項對調試也是相當有用的.

-w script

将使用者輸入的所有字元存入腳本檔案.如果這個檔案已經存在,那麼就追加在檔案後面.

-W script    -W相類似,隻是這個選項會覆寫掉已經存在的資料

-s script    用-w選項來恢複腳本記錄

-T terminal

設定終端類型.在UNIX系統中,這會改寫$TERM的環境變量(當然了,如果$TERM環境變量錯誤,其他的許多程式都将會崩潰)

我們還有一些相容的指令行參數.這些參數可以使得我們的Vim運作起來更像是Vi;

-N

這個參數可以使得Vim以自己的方式來運作,而不是不是像Vi的方式運作.這個參數是被.vimrc檔案預設定義的.

-C

相容模式.這個參數關掉了許多Vim的自己的特征,而是盡量的像Vi的方式一樣的運作.

-l

Lisp模式.這種模式完全是由老版本的vi延續下來的.他設定了lisp和showmatch選項.這時的Vim的與檔案類型相關的指令都可以很好的處理Lisp程式,并且這是可以自動完成的.

最後還有一些不知道該将他們歸為哪一類的指令行參數:

-d device    打開編輯給定的裝置檔案

-b        二進制模式.設定了noexpandtab,textwidth=0,nomodeline,binary

在一般的情況下,vim是不産生備份檔案的.如果我們希望他産生備份檔案,我們可以使用下面的指令:

:set backup

産生的備份檔案的名稱是在原始檔案名的最後加上了~.例如我們有一個名為data.txt的檔案,那麼由Vim所産生的備份檔案名即為:data.txt~.

如果我們不喜歡這個備份檔案的擴充名,我們可以定義我們自己的備份檔案擴充名.這時我們要到下面的指令:

:set backupext=string

例如如果我們設定了backupext的值為.bak,那麼新的備份檔案名即為data.txt.bak   

如果我們設定了patchmode選項,那麼Vim編輯器就會以目前檔案名加上patchmode的值為檔案名備份正在編輯的檔案.但是我們要注意的是隻有以這個檔案名為檔案名的備份檔案不存在時才會産生這樣的備份檔案.例如我們執行下面的指令:

:set patchmode=.org

如 果我們是第一次編輯一個已經存在的檔案:data.txt.當我們執行了這樣的指令儲存退出想要看一下事實是否是這樣的.因為以前這個備份檔案并不存在, 是以會産生一個備份檔案,名為:data.txt.org.但是當我們再一次編輯這個檔案儲存退出後,因為這個備份檔案已經存在,所在現在的備份檔案名: data.txt~.

通常情況下Vim編輯器會将備份檔案放在與檔案相同的目錄下,我們可以通過設定backupdir選項來選擇我們的備份檔案存放的地方,例如我們想将備份檔案放在~/tmp目錄下,我們可以通過執行下面的指令來做到:

:set backupdir=~/tmp/

但 是這樣的設定有時也會産生問題的,如果我們在不同的目錄下編輯具有相同檔案名的檔案,當我們儲存退出時,Vim會将備份檔案放在~/tmp/目錄下,名字 的沖突會使得老的備份檔案丢失.同時我們還要知道的就是這個選項可以同時設定幾個值,中間用逗來分隔.Vim會将備份檔案放在第一個目錄下.

一般情況下,當Vim儲存檔案時,會執行下面的步驟:

1

Vim要檢查Vim外面的檔案是否被做了改動.例如也許有的人已将這個檔案重新命名了,如果發生這樣的情況,Vim就會給出警告并詢問是否繼續.

2

如果設定了writebackup或是backup選項,Vim就會将舊的備份檔案移除,同時産生一個目前檔案的副本做為新的備份檔案

3 将緩沖區的内容寫入檔案.

4

如果設定了patchmode選項而不存patch檔案,那麼Vim就會将備份檔案重命名成為patch檔案

5 如果沒有設定backup選項,而是設定了writebackup選項,就會移除備份檔案

Vim覆寫已經存在的檔案的原因是因為要保護UNIX系統上的硬連結.在非UNIX系統上,備份檔案隻是通過重命名目前檔案來産生

注意:如果我們設定了nobackup和nowritebackup選項,Vim會覆寫已經存在的檔案.這在磁盤已滿而更新檔案時會造成資料的丢失.

在預設的情況下,Vim設定了writebackup選項.這就意味着Vim很難會丢失資料.通過采用這樣的方法,在磁盤已滿的情況下,我們就沒有機會丢失檔案.也許我們會不能寫入新檔案,但是我們不會丢失我們的舊檔案.

我 們在用Vim來編寫時,Vim會在我們編寫的過程中産生一個臨時的交換檔案,這個交換檔案中包含着我們所做過的所有修改,當我們完成編寫工作,儲存退出 後,這個臨時檔案會被删掉.但是如果Vim遇到了意外情況而退出時,這個臨時檔案會因為來不及删除而存在于硬碟上.當Vim啟動時他會檢查在目前目錄中是 否存着交換檔案,如果存在,則意味着有一個Vim正在編輯此檔案,或者是我們在Vim編輯器的過程中遇到意外而退出,進而留下交換檔案.這時Vim就會給 出警告資訊,并會給我們機會要我們自己來決定我們下一步要怎麼做.這時我們可以有以下四個選項:

Open Read-Only(以隻讀方式打開)

這個選項會告訴Vim以隻讀方式打開.如果我們想要看到檔案中的内容或是有另一個編輯過程正在運作,我們可以選擇這個選項

Edit anyway

如果我們選擇這個選項我們可以對這個檔案進行編輯.我們最好不要選擇這個選項,除非我們對我們正在做的事情有着絕對的把握.這時我們應該知道,如果同時有兩個或是多個編輯過程同時編輯一個檔案,隻有最後一個儲存的編輯過程有效

Recover

如果我們正在編輯我們的檔案,而由于系統故障或是其他的原因而導緻vim意外退出時我們可以選擇這個選項.此時Vim會檢查交換檔案,并試着從我們意外退出的地方重新開始

Quit    取消對此檔案的修改

在我們選擇了其中的一項後我們就可以正常的開始我們的編輯工作了.如果我們選擇了Recover我們要十分小心,因為我們以前所做過的修改并不一定被儲存下來.

如果我們記得Vim意外退出時我們正在編輯的檔案,我們可以用-r指令參數在修複模式下啟動Vim.例如我們在編輯檔案commands.c時Vim意外退出,我們就可以用下面的指令在修複模式下啟動vim:

$ vim -r commands.c

如果我們想得到一個可以修複的編輯器程式清單,我們可以用下面的指令:

$ vim -r

這樣Vim就會在目前目錄和标準的臨時的目錄下查找交換檔案,指令的執行結果就像下面的樣子:

$ vim -r

找到以下的交換檔案:

   在目前目錄:

1.    .vi14.txt.swp

            所有者: mayuelong    日期: Wed Jul 27 19:19:39 2005

              檔案名: ~mayuelong/Documents/vi14.txt

            修改過: 是

            使用者名: mayuelong      主機名: localhost.localdomain

           程序 ID: 3070 (正在執行)

   在目錄 ~/tmp:

      -- 無 --

   在目錄 /var/tmp:

      -- 無 --

   在目錄 /tmp:

      -- 無 --

Vim在意外退出的情況下并不會覆寫舊的交換檔案.例如第一次編輯時産生的交換檔案名為.file.txt.swp.如果我們再編輯又遇到意外退出時所産生的交換檔案名為.file.txt.swo,到第三次時所交生的交換檔案為.file.txt.swn,如此類推.

我們在啟動Vim時可以指明用哪一個交換檔案來修複檔案,指令如下:

$ vim -r .file.txt.swo

如果想知道我們目前正在使用的交換檔案的名稱可以使用下面的指令:

:swapname

這樣就會顯示交換檔案的名稱.

通常情況下,交換檔案會每4秒或是每隔200個字元儲存一次.這個數值是由updatecount和updatetime選項來控制的.我們可以用下面的指令來設定交換檔案每23秒儲存一次:

:set updatetime=23000

(注:這個數值是以微秒計的)

或者是我們可用下面的指令來設定vim每400個字元儲存一次:

:set updatecount=400

如果我們将updatecount的值為0,那麼交換檔案就不會被儲存了.

事實上我們可以來控制是不是要在編輯的過程中産生交換檔案,例如下面的指令是在産生交換檔案,而這也正是Vim所預設的:

:set swapfile

我們也可以用下面的指令來使Vim不産生交換檔案:

:set noswapfile

我們可以對每一個編輯的檔案将這個選項設定或是重置.如果我們正在編輯一個大檔案而我們又不想可以修複,我們可設定noswapfile.如果我們同時正在另一個視窗編輯一個檔案,那麼這個視窗中的檔案仍是使用交換檔案的.

在UNIX或是Linux系統中,當我們要儲存檔案時,通常資料被裝入記憶體緩沖區,并肯是在系統認為是一個合适的時才會被寫入檔案.這通常隻是幾秒鐘的事情.如果我們想要确認資料到達了磁盤,我們可以使用下面的指令:

:set swapsync

這個指令是告訴Vim編輯器在每一次将檔案寫入交換檔案的同時寫入磁盤.swapsync選項可以是fsync或是sync,這個取決于我們要儲存檔案時的系統調用.

通常情況下,Vim是在和目前檔案相同的目錄下産生交換檔案,我們可以通過directory選項來更改交換檔案産生的目錄.例如下面的指令可以将産生的交換檔案放在/tmp目錄下:

:set directory=/tmp

這并不是一個好主意,因為如果我們是在不同的目錄下編輯具有相同檔案名的檔案時會産生名字沖突.

我們也可以将這個選項設成一個目錄清單,中間用逗号來分隔.最好的方法就是将目前目錄(.)設為目錄清單的第一個選擇.在存放交換檔案時首先放在清單的第一項指的目錄處,這樣交換檔案首先會被存放在目前目錄下.

如果我們已經做許多的改動,我們想儲存我們目前所做工作,我們可以使用下面的指令:

:write

但是這個指令是用我們目前所做的改動來重寫已經存的檔案,與其相關的一個指令是

:preserve

這 個指令是将我們所做工作存入交換檔案,而原始的保持不變,直到我們用:write或是ZZ指令退出時才會被重寫.在這樣的情況下,如果Vim遇到意外,我 們可以用交換檔案來修複我們所做的工作,哪怕是原始檔案已經丢失.如果沒有用這個指令,我們就不得不同時修複原始檔案和交換檔案.

我們不僅可以在啟動vim時修複檔案,還可以用下面的指令來修複檔案:

:recover file.txt

這個指令與下面的有着同樣的作用:

$ vim -r file.txt

如果我們用:recover指令試圖修複我們正編輯的檔案則會傳回錯誤.如果沒有指定檔案名,則預設的目前緩沖區中的檔案.如果我們想要放棄我們所做的修改并試圖修複時,我們可以使用下面的指令:

:recover! file.txt

vi編輯器的學習使用(十五)

Vim大量的工作是通過指令行的方式來完成,這樣的指令行方式對于則接觸Vim新手來說也許會覺得難于操作,可是當我們習慣了這樣的工作方式後,我們就不得不佩服Vim的強大功能,正是這些指令使得我們可以高效的來完成我們的工作.而在Vim當中還有一些其他的指令.

指令:ascii或者是ga可以用ASCII碼和八進制及十六進制列印出來.當我們編輯多位元組檔案時,例如說我們的漢語,這個指令就可以列印所有的位元組.

指令countgo可以到達目前檔案中由count所字的字元數的位置.例如指令3go就可以到達檔案中的第三個字元處.而指令gCTRL-G可顯示出目前檔案中的字元數的資訊,同是顯示出目前行,目前列以及其他的一些資訊.

而 指令:goto offset可以将光标置于由offset所指定的字元處.而指令gg則與我們以前見到過的G指令相類似,他也可以到達由count所指定的行.例如 5gg可以到達第5行.gg指令與G指令所不同的地方隻是在沒有指定count值時前者回到第一行,而後者要到最後一行.

而指令CTRL-L可以 起到重畫螢幕的作用.這個指令在我們使用終端視窗或是在螢幕上存在着一些系統資訊時顯得尤為有用.而指令:sleep time可以使得我們的Vim編輯器在指定的時間不做任何事情(Sleep嘛:-)).在這個指令中如果時間是以m結尾則是指的微秒.這個指令在我們想暫 停執行宏時顯得更為有用.而指令count gs指令也有同樣的作用.

在大多數的終端上,CTRL-S可以停止輸出,如果我們要重新啟動他,則要 CTRL-Q指令.這兩個指令并不是Vim指令中的一部分.為了避免鍵盤的沖突,我們在Vim中并不用這兩個指令.我們最好也不要試着用:map指令将一 些功能和這兩個鍵進行綁定,因為在執行這兩個指令時是鍵盤得到指令而不會到達Vim.

如果我們是在UNIX或是LINUX系統的終端模式下進行工作,我們可以用指令CTRL-Z來中止我們的正常編輯狀态.如果我們要繼續編輯則要使用Shell指令fg.而指令:suspend也會有同樣的作用.

在一般的情況下我們可以使用:help或是F1鍵來顯示幫助螢幕,進而得到一般的幫助資訊.

我們可以使用z height<CR>來調整目前視窗的高度.如果目前僅有一個視窗,這個指令隻是影響到視窗中的行數.

我們在沒有輸入檔案名的情況下啟動Vim時會看到一個介紹的螢幕,這個螢幕在我們輸入任一字元後消失,如果我們想再看到他,可以使用下面的指令:

:intro

vi編輯器的學習使用(十六)

Vim是一個強大的文本編輯器,這個強大的文本編輯器的大部分工作是通過指令行的方式完成的.Vim一系列的指令可以使得我們快速高效的完成我們的各種各樣的工作.下面我們就來看一下在Vim的編輯中常出現的問題的一些解決辦法.

在 我們快速的輸入文本的時候,很容易使得一些單詞輸入錯誤.例如我們本應輸入的是the,而我們卻錯輸入成了teh,這時我們可以通過簡單的指令使得這e和 h這兩個字母交換一下位置來達我們改錯的目的.我們可以将光标放在e上,然後輸入指令xp,x指令删除掉字母e,而p指令則是将他放在目前光标的後面,也 就是h字母的後,進而就達到了改錯的目的.

在我們進行文本編輯的時候有時要做一些文本替換的工作,例如是将文中所有的字元串idiots替換成managers.這時我們可以使用下面的指令:

:1,$s/idiots/manages/g

這 個是指令是以冒号(:)開頭的,則表明這是一個ex模式的指令.所有的ex指令都指明了指令要作用的範圍.在這種情況標明了目前的所有文本,從第一行到最 後一行($).我們可以也可以用%來簡單指整篇文章.而s指令是指令:substitute的縮寫.舊的文本放在前面,而新的文本則放在後面,g标記則指 明這是一個全局的替換,這樣就不會出在一行中多交出現要替換的文本而隻替換第一個的情況了.

但是有時我們希望在進行文本替換以前Vim可以向我們進行一些詢問,然後由我們來決定下一步的操作.在這樣的情況下我們可以按照下面的方法來做:

1 執行指令1G到文檔的開始處.

2 執行指令/idiot來查找文章中出idiot的地方

3 執行指令cwmanager<ESC>,當我們執行cw指令時目前光标處的文本被删除并進入插入模式,這時我們就可以将我想要替換成的文本輸入,并退回到指令狀态.

4 執行指令n重複上一次的查找

5 執行指令.重複上一次的編輯操作,如果在這一步我們不想進行替換,我們可以跳過這一步,進行下一次的查找.

6 重複以上兩步直到将檔案中的所有字元idiot替換成manager

我們還可以執行下面的指令來達到同樣的作用:

:%s/idiot/manager/cg

在這個指令中我們是用%來指代文章中的所有的行,與上一個指令不同的地方是我們加入了标記c,這個标記可以告訴Vim每一次在替換之前都要進行詢問.

我們在進行文本編輯時想要進行文本的移動操作我們又該如何來做呢?這時我們可以按照下面的步驟來做:

1 将光标移到我們要移動的段落的開頭部分

2 用指令ma在此處做上标記.

3 将光标移到這個段落的底部

4 執行指令d'a來删除剛才做了标記的文本.

5 将光标移到我們想放置文本的地方.

6 執行指令p将這段文本放在此處

這樣我們就達到移動文本的目的.

我們可以按照下面的方法來做,可以達到同樣的效果:

1 用光标放在第一行并将其标記為a

繼續閱讀