vi 的使用
php
基本上 vi 共分爲三種模式,分別是『通常模式』、『編輯模式』與『指令列命令模式』。 這三種模式的做用分別是:linux
簡單的說,咱們能夠將這三個模式想成底下的圖標來表示:vim
注意到上面的圖示,你會發現通常模式可與編輯模式及指令列模式切換, 但編輯模式與指令列模式之間不可互相切換喔!這很是重要啦! 閒話很少說,咱們底下以一個簡單的例子來進行說明吧!
session
若是你想要使用 vi 來創建一個名爲 test.txt 的檔案時,你能夠這樣作:測試
[root@www ~]# vi test.txt
|
Tips: 在 vi 裏面, [tab] 這個按鈕所獲得的結果與空格符所獲得的結果是不同的,特別強調一下! |
如此一來,你的檔案 test.txt 就已經創建起來囉!須要注意的是,若是你的檔案權限不對,例如爲 -r--r--r-- 時,那麼可能會沒法寫入,此時可使用『強制寫入』的方式嗎?能夠!使用『 :wq! 』 多加一個驚歎號便可!不過,須要特別注意呦!那個是在『你的權限能夠改變』的狀況下才能成立的! 關於權限的概念,請自行回去翻一下第六章的內容吧!ui
除了上面簡易範例的 i, [Esc], :wq 以外,其實 vim 還有很是多的按鍵可使用喔!在介紹以前仍是要再次強調, vim 的三種模式只有通常模式能夠與編輯、指令列模式切換,編輯模式與指令列模式之間並不能切換的! 這點在圖2.1裏面有介紹到,注意去看看喔!底下就來談談 vim 軟件中會用到的按鍵功能吧!
this
移動光標的方法 | |
h 或 向左箭頭鍵(←) | 光標向左移動一個字符 |
j 或 向下箭頭鍵(↓) | 光標向下移動一個字符 |
k 或 向上箭頭鍵(↑) | 光標向上移動一個字符 |
l 或 向右箭頭鍵(→) | 光標向右移動一個字符 |
若是你將右手放在鍵盤上的話,你會發現 hjkl 是排列在一塊兒的,所以可使用這四個按鈕來移動光標。 若是想要進行屢次移動的話,例如向下移動 30 行,可使用 "30j" 或 "30↓" 的組合按鍵, 亦即加上想要進行的次數(數字)後,按下動做便可! | |
[Ctrl] + [f] | 屏幕『向下』移動一頁,至關於 [Page Down]按鍵 (經常使用) |
[Ctrl] + [b] | 屏幕『向上』移動一頁,至關於 [Page Up] 按鍵 (經常使用) |
[Ctrl] + [d] | 屏幕『向下』移動半頁 |
[Ctrl] + [u] | 屏幕『向上』移動半頁 |
+ | 光標移動到非空格符的下一列 |
- | 光標移動到非空格符的上一列 |
n<space> | 那個 n 表示『數字』,例如 20 。按下數字後再按空格鍵,光標會向右移動這一行的 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 行(經常使用) |
搜尋與取代 | |
/word | 向光標之下尋找一個名稱爲 word 的字符串。例如要在檔案內搜尋 vbird 這個字符串,就輸入 /vbird 便可! (經常使用) |
?word | 向光標之上尋找一個字符串名稱爲 word 的字符串。 |
n | 這個 n 是英文按鍵。表明『重複前一個搜尋的動做』。舉例來講, 若是剛剛咱們執行 /vbird 去向下搜尋 vbird 這個字符串,則按下 n 後,會向下繼續搜尋下一個名稱爲 vbird 的字符串。若是是執行 ?vbird 的話,那麼按下 n 則會向上繼續搜尋名稱爲 vbird 的字符串! |
N | 這個 N 是英文按鍵。與 n 恰好相反,爲『反向』進行前一個搜尋動做。 例如 /vbird 後,按下 N 則表示『向上』搜尋 vbird 。 |
使用 /word 配合 n 及 N 是很是有幫助的!可讓你重複的找到一些你搜尋的關鍵詞! | |
: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 爲『從目前光標所在處插入』, I 爲『在目前所在行的第一個非空格符處開始插入』。 (經常使用) |
a, A | 進入插入模式(Insert mode): a 爲『從目前光標所在的下一個字符處開始插入』, A 爲『從光標所在行的最後一個字符處開始插入』。(經常使用) |
o, O | 進入插入模式(Insert mode): 這是英文字母 o 的大小寫。o 爲『在目前光標所在的下一行處插入新的一行』; O 爲在目前光標所在處的上一行插入新的一行!(經常使用) |
r, R | 進入取代模式(Replace mode): r 只會取代光標所在的那一個字符一次;R會一直取代光標所在的文字,直到按下 ESC 爲止;(經常使用) |
上面這些按鍵中,在 vi 畫面的左下角處會出現『--INSERT--』或『--REPLACE--』的字樣。 由名稱就知道該動做了吧!!特別注意的是,咱們上面也提過了,你想要在檔案裏面輸入字符時, 必定要在左下角處看到 INSERT 或 REPLACE 才能輸入喔! | |
[Esc] | 退出編輯模式,回到通常模式中(經常使用) |
指令列的儲存、離開等指令 | |
:w | 將編輯的數據寫入硬盤檔案中(經常使用) |
:w! | 若文件屬性爲『只讀』時,強制寫入該檔案。不過,到底能不能寫入, 仍是跟你對該檔案的檔案權限有關啊! |
:q | 離開 vi (經常使用) |
:q! | 若曾修改過檔案,又不想儲存,使用 ! 爲強制離開不儲存檔案。 |
注意一下啊,那個驚歎號 (!) 在 vi 當中,經常具備『強制』的意思~ | |
:wq | 儲存後離開,若爲 :wq! 則爲強制儲存後離開 (經常使用) |
ZZ | 這是大寫的 Z 喔!若檔案沒有更動,則不儲存離開,若檔案已經被更動過,則儲存後離開! |
:w [filename] | 將編輯的數據儲存成另外一個檔案(相似另存新檔) |
:r [filename] | 在編輯的數據中,讀入另外一個檔案的數據。亦即將 『filename』 這個檔案內容加到遊標所在行後面 |
:n1,n2 w [filename] | 將 n1 到 n2 的內容儲存成 filename 這個檔案。 |
:! command | 暫時離開 vi 到指令列模式下執行 command 的顯示結果!例如 『:! ls /home』便可在 vi 當中察看 /home 底下以 ls 輸出的檔案信息! |
vim 環境的變動 | |
:set nu | 顯示行號,設定以後,會在每一行的前綴顯示該行的行號 |
:set nonu | 與 set nu 相反,爲取消行號! |
特別注意,在 vi 中,『數字』是頗有意義的!數字一般表明重複作幾回的意思! 也有多是表明去到第幾個什麼什麼的意思。舉例來講,要刪除 50 行,則是用 『50dd』 對吧! 數字加在動做以前~那我要向下移動 20 行呢?那就是『20j』或者是『20↓』便可。spa
OK!會這些指令就已經很厲害了,由於經常使用到的指令也只有不到一半!一般 vi 的指令除了上面鳥哥註明的經常使用的幾個外,其餘是不用背的,你能夠作一張簡單的指令表在你的屏幕牆上, 一有疑問能夠立刻的查詢呦!這也是當初鳥哥使用 vim 的方法啦!blog
來來來!趕忙測試一下你是否已經熟悉 vi 這個指令呢?請依照底下的需求進行指令動做。 (底下的操做爲使用 CentOS 5.2 中的 man.config 來作練習的,該檔案你能夠在這裏下載: http://cn.linux.vbird.org/linux_basic/0310vi/man.config。) 看看你的顯示結果與鳥哥的結果是否相同啊?ip
整個步驟能夠以下顯示:
若是你的結果均可以查的到,那麼 vi 的使用上面應該沒有太大的問題啦!剩下的問題會是在…打字練習…。
在目前主要的編輯軟件都會有『回覆』的功能,亦即當你的系統由於某些緣由而致使相似當機的狀況時, 還能夠透過某些特別的機制來讓你將以前未儲存的數據『救』回來!這就是鳥哥這裏所謂的『回覆』功能啦! 那麼 vim 有沒有回覆功能呢?有的! vim 就是透過『暫存檔』來救援的啦!
當咱們在使用 vim 編輯時, vim 會在與被編輯的檔案的目錄下,再創建一個名爲 .filename.swp 的檔案。 好比說咱們在上一個小節談到的編輯 /tmp/vitest/man.config 這個檔案時, vim 會主動的創建 /tmp/vitest/.man.config.swp 的暫存檔,你對 man.config 作的動做就會被記錄到這個 .man.config.swp 當中喔!若是你的系統由於某些緣由斷線了, 致使你編輯的檔案尚未儲存,這個時候 .man.config.swp 就可以發會救援的功能了!咱們來測試一下吧! 底下的練習有些部分的指令咱們還沒有談到,不要緊,你先照着作,後續再回來瞭解囉!
[root@www ~]# cd /tmp/vitest
[root@www vitest]# vim man.config # 此時會進入到 vim 的畫面,請在 vim 的通常模式下按下『 [ctrl]-z 』的組合鍵 [1]+ Stopped vim man.config <==按下 [ctrl]-z 會告訴你這個訊息 |
當咱們在 vim 的通常模式下按下 [ctrl]-z 的組合按鍵時,你的 vim 會被丟到背景去執行! 這部份的功能咱們會在第十七章的程序管理當中談到, 你這裏先知道一下便可。回到命令提示字符後,接下來咱們來模擬將 vim 的工做不正常的中斷吧!
[root@www vitest]# ls -al
total 48
drwxr-xr-x 2 root root 4096 Jan 12 14:48 .
drwxrwxrwt 7 root root 4096 Jan 12 13:26 ..
-rw-r--r-- 1 root root 4101 Jan 12 13:55 man.config
-rw-r--r-- 1 root root 4096 Jan 12 14:48 .man.config.swp <==就是他,暫存檔 -rw-r--r-- 1 root root 4101 Jan 12 13:43 man.test.config [root@www vitest]# kill -9 %1 <==這裏仿真斷線中止 vim 工做 [root@www vitest]# ls -al .man.config.swp -rw-r--r-- 1 root root 4096 Jan 12 14:48 .man.config.swp <==暫存檔仍是會存在! |
那個 kill 能夠仿真將系統的 vim 工做刪除的狀況,你能夠僞裝當機了啦! 因爲 vim 的工做被不正常的中斷,致使暫存盤沒法藉由正常流程來結束, 因此暫存檔就不會消失,而繼續保留下來。此時若是你繼續編輯那個 man.config ,會出現什麼狀況呢? 會出現以下所示的狀態喔:
[root@www vitest]# vim man.config
E325: ATTENTION <==錯誤代碼 Found a swap file by the name ".man.config.swp" <==底下數行說明有暫存檔的存在 owned by: root dated: Mon Jan 12 14:48:24 2009 file name: /tmp/vitest/man.config <==這個暫存盤屬於哪一個實際的檔案? modified: no user name: root host name: www.vbird.tsai process ID: 11539 While opening file "man.config" dated: Mon Jan 12 13:55:07 2009 底下說明可能發生這個錯誤的兩個主要緣由與解決方案! (1) Another program may be editing the same file. If this is the case, be careful not to end up with two different instances of the same file when making changes. Quit, or continue with caution. (2) An edit session for this file crashed. If this is the case, use ":recover" or "vim -r man.config" to recover the changes (see ":help recovery"). If you did this already, delete the swap file ".man.config.swp" to avoid this message. Swap file ".man.config.swp" already exists!底下說明你可進行的動做 [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: |
因爲暫存盤存在的關係,所以 vim 會主動的判斷你的這個檔案可能有些問題,在上面的圖示中 vim 提示兩點主要的問題與解決方案,分別是這樣的:
至於這個發現暫存盤警告訊息的畫面中,有出現六個可用按鈕,各按鈕的說明以下:
轉自:http://cn.linux.vbird.org/linux_basic/0310vi_2.php