1.什么是vi/vim?
????????簡單來說,vi是老式的文本編輯器,不過功能已經很齊全了,但是還是有可以進步的地方。vim則可以說是程序開發者的一項很好用的工具,就連 vim的官方網站( http://www.vim.org)自己也說vim是一個程序開發工具而不是文本處理軟件。
????????Vim是從 vi 發展出來的一個文本編輯器。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用,和Emacs并列成為類Unix系統用戶最喜歡的文本編輯器。
????????vim的設計理念是命令的組合。用戶學習了各種各樣的文本間移動/跳轉的命令和其他的普通模式的編輯命令,并且能夠靈活組合使用的話,能夠比那些沒有模式的編輯器更加高效的進行文本編輯。同時VIM與很多快捷鍵設置和正則表達式類似,可以輔助記憶。并且vim針對程序員做了優化。
2.為何要學vi/vim?
其實是有原因的,因為:
- 很多軟件的編輯接口都會主動調用vi(例如crontab、visudo、edquota等命令);
- 所有的UNIX-like系統都會內置vi文本編輯器,其他的文本編輯器則不一定會存在;
- vim 具有程序編輯的能力,可以主動地以字體顏色辨別語法的正確性,方便程序設計;
- 因為程序簡單,編輯速度相當快速;
其實重點是上述的第二點,因為有太多Linux上面的命令都默認使用vi作為數據編輯的接口,所以你一定要學會Vi,否則很多命令你根本就無法操作。
3.vim的使用
由于啊這個vi和vim的用法基本一樣,我們就講一樣就行了
基本上vim共分為3種模式,分別是一般命令模式、編輯模式與命令行模式。
這3種模式的作用分別是:
- 一般命令模式(command mode)
以vi打開一個文件就直接進入一般命令模式了(這是默認的模式,也簡稱為一般模式)。
????????在這個模式中,你可以使用【上下左右】按鍵來移動光標,你可以使用【刪除字符】或【刪除整行】來處理文件內容,也可以使用【復制、粘貼】來處理你的文件內容。
- 編輯模式/插入模式(insert mode)
在一般命令模式中可以進行刪除、復制、粘貼等的操作,但是卻無法編輯文件的內容。要等到你按下【i、I(大寫i)、o、O(大寫o)、a、A、R】等任何一個字母之后才會進入編輯模式。
????????注意了,通常在Linux中,按下【i、I(大寫i)、o、O(大寫o)、a、A】時,在界面的左下方會出現【INSERT】,按下【R】時會出現【REPLACE】的字樣,此時才可以進行編輯,
而如果要回到一般命令模式時,則必須要按下【Esc】這個按鍵即可退出編輯模式。
- 命令行模式/底行模式(command-line mode)
在一般模式當中,輸入【:? /? ?】三個中的任何一個按鈕,就可以將光標移動到最下面那一行。
????????在這個模式當中,可以提供你【查找數據】的操作,而讀取、保存、批量替換字符、退出vi、顯示行號等的操作則是在此模式中完成。
簡單地說,我們可以將這3個模式想成下面的圖例來表示:
注意到上面的圖例,你會發現一般命令模式可與編輯模式及命令行模式切換,但編輯模式與命令行模式之間不可互相切換,這非常重要。
閑話不多說,我們下面以一個簡單的例子來進行說明吧!
3.1.簡易執行范例
如果你想要使用vim來建立一個名為welcome.txt的文件時,你可以這樣做:
- 1.使用【vim filename】進入一般命令模式
直接輸入【vim文件名】就能夠進入vi的一般命令模式。另外,請注意,記得vim后面一定要加文件名,不管該文件名存在與否。沒有的話vim會自己創建一個新文件進去之后底行就會出現下面這些字樣
整個界面主要分為兩部分,上半部分與最下面一行兩者可以視為獨立的。上半部分顯示的是文件的實際內容,最下面一行則是狀態顯示行(圖所示的[New File]信息),或是命令執行行。
我們使用vim打開一個新文件
如果使用vim打開的文件是已經存在的文件,則可能會出現如下的信息:
如圖所示,
- 底行的那個【"/etc/man_db.conf"[readonly] 131L,5165c】代表的是現在打開的文件名為/etc/man_db.conf,由于打開者的身份緣故,目前文件為只讀狀態,且文件內有131行以及具有5165個字符的意思。
- 右邊那個1,1的意思是光標目前處于第一行的第一個字符
- Top代表目前這個頁面是在整個文件的最頂端
那一行的內容并不是在文件內,而是 vim 顯示一些信息的地方,此時是在一般命令模式的環境下,接下來開始來輸入吧!
- ?2.按下i進入編輯模式,開始編輯文字
在一般命令模式之中,只要按下【i、o、a】等字符就可以進入編輯模式了,在編輯模式當中,你可以發現在左下角狀態欄中會出現--INSERT--的字樣,那就是可以輸入任意字符的提示。
這個時候,鍵盤上除了[Esc]這個按鍵之外,其他的按鍵都可以視作為一般的輸入按鈕,所以你可以進行任何的編輯。
當然,除了按【i、o、a】等字符之外,我們還可以按【R】,只不過R進入的是替換模式,意思就是只能替換
- 3.按下[Esc]鍵回到一般命令模式
好了,假設我已經按照上面的樣式給它編輯完畢了,那么應該要如何退出呢?是的,沒錯,就是給它按下[Esc]這個鍵即可,馬上你就會發現界面左下角的-INSERT-不見了。
- 4.進入命令行模式,文件保存并退出vi環境
OK,我們要保存了,保存(write)并退出(quit)的命令很簡單,輸入【:wq】即可保存退出。(注意了,按下:該光標就會移動到最下面一行去)
這時你在提示字符后面輸入【Is-l】即可看到我們剛剛建立的test2文件,整個圖有點像下面這樣:
如此一來,你的文件 test2 就已經建立。????????需要注意的是,如果你的文件權限不對,例如為-r--r-—r--時,那么可能會無法寫入,此時可以使用【強制寫入】的方式嗎?
可以,使用【:wq!】多加一個感嘆號即可。不過,需要特別注意,那個是在你的權限可以改變的情況下才能成立的。
3.2按鍵說明
除了上面簡易示范的i、[Esc]、:wq 之外,其實vim還有非常多的按鍵可以使用。
在介紹之前還是要再次強調,vi的三種模式只有一般命令模式可以與編輯、命令行模式切換,編輯模式與命令行模式之間并不能切換。
下面就來談談vi軟件中會用到的按鍵功能吧!
第一部分:一般命令模式可用的功能按鍵說明,光標移動、復制粘貼、查找替換等
h? 或向左箭頭鍵 | 光標向左移動一個字符 |
j? ?或向下箭頭鍵 | 光標向下移動一個字符 |
k? ?或向上箭頭鍵 | 光標向上移動一個字符 |
i? ?或向右箭頭鍵 | 光標向右移動一個字符 |
[Ctrl]+[f] | 屏幕【向下】移動一頁,相當于[PageDown]按鍵(常用) |
[Ctrl]+[b] | 屏幕【向上】移動一頁,相當于[PageUp]按鍵(常用) |
[Ctrl]+[d] | 屏幕【向下】移動半頁 |
[Ctrl] + [u] | 屏幕【向上】移動半頁 |
+ | 光標移動到非空格符的下一行 |
- | 光標移動到非空格符的上一行 |
n<space> | 那個n表示【數字】,按下數字n后再按空格鍵,光標會向右移動這一行的n個字符,例如20<space>則光標會向后面移動20個字符距離 |
0或功能鍵[Home] | 這是數字【0】:移動到這一行的最前面字符處(常用) |
$或功能鍵[End] | 移動到這一行的最后面字符(常用) |
H | 光標移動到這個屏幕的最上方那一行的第一個字符 |
M | 光標移動到這個屏幕的中央那一行的第一個字符 |
L | 光標移動到這個屏幕的最下方那一行的第一個字符 |
G | 移動到這個文件的最后一行(常用) |
nG | n為數字,移動到這個文件的第n行,例如20G則會移動到這個文件的第20行(可配合:set nu) |
gg | 移動到這個文件的第一行,相當于1G(常用) |
n<Enter> | n為數字,光標向下移動n行(常用) |
注意:如果你將右手放在鍵盤上的話,你會發現hjki是排行在一起的,因此可以使用這四個按鍵來移動光標。
????????如果想要進行多次移動的話,例如向下移動30行,可以使用“30j”或“30↓”的組合按鍵,亦即加上想要進行的次數(數字)后,按下操作即可
/word | 向光標之下尋找一個名稱為word的字符串。 例如要在文件內查找vbird 這個字符串,就輸入/vbird即可(常用) |
?word | 向光標之上尋找一個字符串名稱為word的字符串 |
n | 這個n是英文按鍵,代表【重復前一個查找的操作】。 舉例來說, 如果剛剛我們執行/bird去向下查找vbird這個字符串,則按下n后,會向下繼續查找下一個名稱為vbird的字符串. 如果是執行?vbird的話,那么按下n則會向上繼續查找名稱為vbird的字符串 |
N | 這個N是英文按鍵,與n剛好相反,為【反向】進行前一個查找操作,例如/vbird后,按下N則表示【向上】查找vbird |
:n1,n2s/word1/word2/g | n1與n2為數字,在第n1與n2行之間尋找word1這個字符串,并將該字符串替換為word2, 舉例來說,在100到200行之間查找 vbird 并替換為 VBIRD則:“:100,200s/vbird/VBIRD/g”(常用) |
:1,$s/word1/word2/g | 從第一行到最后一行尋找word1字符串,并將該字符串替換為word2(常用) |
:1,$s/word1/word2/gc | 從第一行到最后一行尋找word1字符串,并將該字符串替換為word2,且在替換前顯示提示字符給用戶確認(confirm)是否需要替換(常用) |
x和X | 在一行當中,x為向后刪除一個字符(相當于[del]按鍵),X為向前刪除一個字符(相當于[Backspace]即退格鍵)(常用) |
nx | n為數字,連續向后刪除n個字符。 舉例來說,我要連續刪除 10個字符,【10x】 |
dd | 刪除(剪切)光標所在的那一整行(常用) |
ndd | n為數字,刪除(剪切)光標所在的向下n行,例如20dd則是刪除(剪切)20行(常用) |
d1G | 刪除(剪切)光標所在處到第一行的所有數據 |
dG | 刪除(剪切)光標所在處到最后一行的所有數據 |
d$ | 刪除(剪切)光標所在處,到該行的最后一個字符 |
d0 | 那個是數字的0,刪除(剪切)光標所在處,到該行的最前面一個字符 |
yy | 復制光標所在的那一行(常用) |
nyy | n為數字,復制光標所在的向下n行,例如20yy則是復制20行(常用) |
y1G | 復制光標所在行到第一行的所有數據 |
yG | 復制光標所在行到最后一行的所有數據 |
y0 | 復制光標所在的那個字符到該行行首的所有數據 |
y$ | 復制光標所在的那個字符到該行行尾的所有數據 |
p和P | p為將已復制的數據在光標下一行粘貼,P則為貼在光標上一行。 舉例來說,我目前光標在第20行,且已經復制了10行數據,則按下p后,那10行數據會貼在原本的20行之后,即由21行開始貼,但如果是按下P呢?那么原本的第20行會被推到變成30行(常用) |
J | 將光標所在行與下一行的數據結合成同一行 |
c | 重復刪除多個數據,例如向下刪除10行,[10cj] |
u | 恢復前一個操作(常用) |
[Ctrl]+r | 重做上一個操作(常用) |
. | 不要懷疑,這就是小數點,意思是重復前一個操作的意思。 如果你想要重復刪除、重復粘貼等操作,按下小數點【.】就好(常用) |
這個u與[Ctrl]+r是很常用的命令。一個是恢復,另一個則是重做一次,利用這兩個功能按鍵,你的編輯,嘿嘿,很快樂的啊。
第二部分:一般命令模式切換到編輯模式的可用的按鍵說明
i和I | 進入插入模式(Insert mode): i為【從目前光標所在處插入】,|為【在目前所在行的第一個非空格符處開始插入】(常用) |
a和A | 進入插入模式(Insert mode ): a為【從目前光標所在的下一個字符處開始插入】,A為【從光標所在行的最后一個字符處開始插入】(常用) |
o和O | 進入插入模式(Insert mode): 這是英文字母o的大小寫,o為【在目前光標所在的下一行處插入新的一行】;O為在目前光標所在處的上一行插入新的一行(常用) |
r和R | 進入替換模式(Replace mode): r只會替換光標所在的那一個字符一次;R會一直替換光標所在的文字,直到按下Esc為 止(常用) |
Esc | 退出編輯模式,回到一般命令模式中(常用) |
上面這些按鍵中,在vim界面的左下角處會出現【--INSERT-】或【--REPLACE--】的字樣。由名稱就知道該操作了吧!
特別注意的是,我們上面也提過,你想要在文件里面輸入字符時,一定要在左下角處看到 INSERT 或 REPLACE才能輸入。
第三部分:一般命令模式切換到命令行模式的可用按鍵說明
:w | 將編輯的數據寫入硬盤文件中(常用) |
:w! | 若文件屬性為【只讀】時,強制寫入該文件。不過,到底能不能寫入,還是跟你對該文件的文件權限有關 |
:q | 退出vim(常用) |
:q! | 若曾修改過文件,又不想保存,使用!為強制退出不保存 注意一下,那個感嘆號(!)在vim當中,常常具有【強制】的意思。 |
:wq | 保存后退出,若為:wq!則為強制保存后退出(常用) |
ZZ | 這是大寫的Z,若文件沒有修改,則不保存退出,若文件已經被修改過,則保存后退出 |
:w? [filename] | 將編輯的數據保存成另一個文件(類似另存新文件) |
:r [filename] | 在編輯的數據中,讀入另一個文件的數據,亦即將【filename】這個文件內容加到光標所在行后面 |
:n1,n2 w [filename] | 將n1到n2的內容保存為filename 這個文件 |
:! command | 暫時退出vim到命令行模式下執行command的顯示結果。例如【:!ls /home 】即可在vi當中查看/home下面以Is輸出的文件信息 |
set? nu | 顯示行號,設置之后,會在每一行的前綴顯示該行的行號 |
set nonu | 與set nu相反,為取消行號 |
特別注意,在Vim中,【數字】是很有意義的,數字通常代表重復做幾次的意思,也有可能是代表去到第幾個什么什么的意思。
舉例來說,要刪除(剪切)50行,則是用【50dd 】。數字加在操作之前,那我要向下移動20行呢?那就是【20j】或是【20↓】即可。
????????OK,會這些命令就已經很厲害了,因為常用到的命令也只有不到一半。通常vim的命令除了上面鳥哥注明“常用”的幾個外,其他是不用背的,你可以做一張簡單的命令表在你的屏幕壁紙上,一有疑問可以馬上查詢。
3.3. vim的緩存、恢復與打開時的警告信息
????????目前主要的文本編輯軟件都會有恢復的功能,即當你的系統因為某些原因而導致類似宕機的情況時,還可以通過某些特別的機制來讓你將之前未保存的數據【救】回來,這就是鳥哥這里所謂的恢復功能。
那么vim有沒有恢復功能?有的,vim就是通過緩存來恢復。
????????當我們在使用vim 編輯時,vim會在與被編輯的文件的目錄下,再建立一個名為filename.swp的文件。
????????比如說編輯/tmp/vitest/man_db.conf這個文件時,vim會主動的建立/tmp/vitest/.man_db.conf.swp的緩存,你對man_db.conf 做的操作就會被記錄到這個.man_db.conf.swp當中。如果你的系統因為某些原因掉線了,導致你編輯的文件還沒有保存,這個時候.man_db.conf.swp就能夠發揮恢復功能了。
我們來測試一下吧!下面的練習有些部分的命令
我們尚未談到,沒關系,你先照著做,后續再回來了解。
我們使用vim打開vitest,此時會進入到vim的界面,在vim的一般命令模式下按下【[ctrl]-z】的組合鍵就會退出來,就像下面這樣子
????????當我們在vim的一般命令模式下按下[ctl]-z的組合按鍵時,你的vim會被丟到后臺去執行。這部分的功能我們會在進程管理當中談到,你這里先知道一下即可。
回到命令提示字符后,接下來我們來模擬將 vim的工作不正常的中斷吧!
我們看最后一行那個.vitest.swp
我們來模擬vim停止工作
這個 kil 可以模擬將系統的vim工作刪除的情況,你可以模擬宕機。
由于vim的工作被不正常地中斷,導致緩存無法借由正常流程來結束,所以緩存就不會消失,而繼續保留下來,此時如果你繼續編輯那個vitest,會出現什么情況?會出現如下所示的狀態:
????????由于緩存存在的關系,因此 vim會主動的判斷你的這個文件可能有些問題,在上面的圖例中vim提示兩點主要的問題與解決方案,分別是這樣的:
- 問題一:可能有其他人或程序同時在編輯這個文件:
由于 Linux是多人多任務的環境,因此很可能有很多人同時在編輯同一個文件。如果在多人共同編輯的情況下,萬一大家同時保存,那么這個文件的內容將會變的亂七八糟。為了避免這個問題,因此vim會出現這個警告窗口,解決的方法則是:
- 找到另外那個程序或人員,請它將該vim的工作結束,然后你再繼續處理。
- 如果你只是要看該文件的內容并不會有任何修改編輯的操作,那么可以選擇開啟成為只讀(O)文件,即上述界面反白部分輸入英文【o】即可,其實就是[O]pen Read-Only的選項。
- 問題二:在前一個 vim 的環境中,可能因為某些不知名原因導致vim 中斷(crashed):
這就是常見的不正常結束vim產生的后果,解決方案依據不同的情況而不同,常見的處理方法為:
- 如果你之前的vim 處理操作尚未保存,此時你應該要按下【R】,亦即使用(R)ecover 的選項,此時vim會加載.vitest.swp的內容,讓你自己來決定要不要保存,這樣就能夠救回來你之前未保存的信息。不過這個.vitest.swp 并不會在你結束vim 后自動刪除,所以你退出vim后還得要自行刪除,.vitest.swp才能避免每次打開這個文件都會出現這樣的警告。
- 如果你確定這個緩存是沒有用的,那么你可以直接按下【D】刪除掉這個緩存,即(D)elete it 這個選項即可。此時vim會加載.vitest.swp,并且將舊的.vitest.swp刪除后,建立這次會使用的新的.vitest.swp。
至于這個發現緩存警告信息的界面中,有出現六個可用按鍵,各按鍵的說明如下:
- [O]pen Read-Only:打開此文件成為只讀文件,可以用在你只是想要查看該文件內容并不想要進行編輯操作時。一般來說,在上課時,如果你是登錄到同學的計算機去看它的配置文件,結果發現其實同學它自己也在編輯時,可以使用這個模式;
- (E)dit anyway:還是用正常的方式打開你要編輯的那個文件,并不會加載緩存的內容,不過很容易出現兩個用戶互相改變對方的文件等問題。
- (R)ecover:就是加載緩存的內容,用在你要救回之前未保存的工作,不過當你救回來并且保存退出vim后,還是要手動自行刪除那個緩存。
- (D)elete it:你確定那個緩存是無用的,那么打開文件前會先將這個緩存刪除,這個操作其實是比較常做。因為你可能不確定這個緩存是怎么來的,所以就刪除掉它吧!。
- (Q)uit:按下q就退出vim,不會進行任何操作回到命令提示字符。
- (A)bort:忽略這個編輯操作,感覺上與quit 非常類似,也會送你回到命令提示字符。