幾個月前, Linux 基金會發起了 LFCS (Linux 基金會認證系統管理員(Linux Foundation Certified System administrator))認證,以幫助世界各地的人來驗證他們能夠在 Linux 系統上做從基礎的到中級的系統管理任務:如系統支持、第一手的故障診斷和處理、以及何時向上游支持團隊提出問題的智能決策。
在 Linux 中學習 vi 編輯器
這篇文章是系列教程的第二講,在這個部分中,我們會介紹 vi/vim 基本的文件編輯操作,幫助讀者理解編輯器中的三個模式,這是 LFCS 認證考試中必須掌握的。
vi 是為 Unix 而生的第一個全屏文本編輯器。它的設計小巧簡單,對於僅僅使用過諸如 NotePad++ 或 gedit 等圖形界面的文本編輯器的用戶來說,使用起來可能存在一些困難。
為了使用 vi,我們必須首先理解這個強大的程序操作中的三種模式,方便我們後邊學習這個強大的文本處理軟件的相關操作。
請注意,大多數的現代 Linux 發行版都集成了 vi 的變種——— vim(改進版 VI(Vi IMproved)),相比於 vi,它有更多新功能。所以,我們會在本教程中交替使用 vi 和 vim。
如果你的發行版還沒有安裝 vim,你可以通過以下方法來安裝:
至少有以下兩個理由:
因為它是 POSIX 標准的一部分,所以不管你使用什麼發行版 vi 總是可用的。
vi 基本不消耗多少系統資源,並且允許我們僅僅通過鍵盤來完成任何可能的任務。
此外,vi 有著非常豐富的內置幫助手冊,程序打開後就可以通過 :help
命令來查看。這個內置幫助手冊比 vi/vim 的 man 頁面包含了更多信息。
vi Man 頁面
可以通過在命令提示符下輸入 vi 來啟動。
使用 vi 編輯器
然後按下字母 i,你就可以開始輸入了。或者通過下面的方法來啟動 vi:
#vi filename
這樣會打開一個名為 filename 的緩存區(buffer)(稍後會詳細介紹緩存區),在你編輯完成之後就可以存儲在磁盤中了。
yy
(或Y
) 復制當前的整行,3yy
(或3Y
) 復制當前整行和下邊緊接著的兩行(總共3行)。通過 Esc
鍵可以隨時進入命令模式(而不管當前工作在什麼模式下)。事實上,在命令模式下,鍵盤上所有的輸入都被解釋為命令而非文本,這往往使得初學者困惑不已。在末行(ex)模式中,我們可以處理文件(包括保存當前文件和運行外部程序)。我們必須在命令模式下輸入一個冒號(:
),才能進入這個模式,緊接著是要在末行模式下使用的命令。執行之後 vi 自動回到命令模式。
在文本輸入(insert)模式(通常在命令模式下使用字母 i
進入這個模式)中,我們可以隨意輸入文本。大多數的鍵入將以文本形式輸出到屏幕(一個重要的例外是Esc
鍵,它將退出文本編輯模式並回到命令模式)。
vi 文本插入模式
下面的表格列出常用的 vi 命令。文件編輯的命令可以通過添加歎號的命令強制執行(如,:q!
命令強制退出編輯器而不保存文件)。
h
或 ←
光標左移一個字符
j
或 ↓
光標下移一行
k
或 ↑
光標上移一行
l
(小寫字母 L) 或 →
光標右移一個字符
H
光標移至屏幕頂行
L
光標移至屏幕末行
G
光標移至文件末行
w
光標右移一個詞
b
光標左移一個詞
0
(數字零)
光標移至行首
^
光標移至當前行第一個非空格字符
$
光標移至當前行行尾
Ctrl-B
向後翻頁
Ctrl-F
向前翻頁
i
在光標所在位置插入文本
I
(大寫字母 i)
在當前行首插入文本
J
(大寫字母 j)
將下一行與當前行合並(下一行上移到當前行)
a
在光標所在位置後追加文本
o
(小寫字母 O)
在當前行下邊插入空白行
O
(大寫字母 O)
在當前行上邊插入空白行
r
替換光標所在位置的一個字符
R
從光標所在位置開始覆蓋插入文本
x
刪除光標所在位置的字符
X
立即刪除光標所在位置之前(左邊)的一個字符
dd
剪切當前整行文本(為了之後進行粘貼)
D
剪切光標所在位置到行末的文本(該命令等效於 d$
)
yX
給出一個移動命令 X (如 h
、j
、H
、L
等),復制適當數量的字符、單詞或者從光標開始到一定數量的行
yy
或 Y
復制當前整行
p
粘貼在光標所在位置之後(下一行)
P
粘貼在光標所在位置之前(上一行)
.
(句點)
重復最後一個命令
u
撤銷最後一個命令
U
撤銷最後一行的最後一個命令,只有光標仍在最後一行才能執行。
n
在查找中跳到下一個匹配項
N
在查找中跳到前一個匹配項
:n
下一個文件,編輯多個指定文件時,該命令加載下一個文件。
:e file
加載新文件來替代當前文件
:r file
將新文件的內容插入到光標所在位置的下一行
:q
退出並放棄更改
:w file
將當期打開的緩存區保存為file。如果是追加到已存在的文件中,則使用 :w >> file
命令
:wq
保存當前文件的內容並退出。等效於 x!
和 ZZ
:r! command
執行 command 命令,並將命令的輸出插入到光標所在位置的下一行
下列選項可以讓你在運行 Vim 的時候很方便(需要寫入到 ~/.vimrc
文件):
#echoset number >>~/.vimrc
#echo syntax on >>~/.vimrc
#echoset tabstop=4>>~/.vimrc
#echoset autoindent >>~/.vimrc
vi編輯器選項
vi 具有通過查找將光標移動到(在單獨一行或者整個文件中的)指定位置。它還可自動或者通過用戶確認來執行文本替換。
a) 在行內查找。f
命令在當前行查找指定字符,並將光標移動到指定字符出現的位置。
例如,命令 fh
會在本行中將光標移動到字母h
下一次出現的位置。注意,字母 f
和你要查找的字符都不會出現在屏幕上,但是當你按下回車的時候,要查找的字符會被高亮顯示。
比如,以下是在命令模式按下 f4
之後的結果。
在 vi 中查找字符
b) 在整個文件內查找。使用 /
命令,緊接著需要查找的單詞或短語。這個查找可以通過使用 n
命令或者 N
重復查找上一個查找的字符串。以下是在命令模式鍵入 /Jane
的查找結果。
在 vi 中查找字符
c) vi 通過使用命令來完成多行或者整個文件的替換操作(類似於 sed)。我們可以使用以下命令,使得整個文件中的單詞 “old” 替換為 “young”。
:%s/old/young/g
注意:冒號位於命令的最前面。
vi 的查找和替換
冒號 (:
) 進入末行模式,在本例中 s
表示替換,%
是從第一行到最後一行的表示方式(也可以使用 nm 表示范圍,即第 n 行到第 m 行),old 是查找模式,young 是用來替換的文本,g
表示在每個查找出來的字符串都進行替換。
另外,在命令最後增加一個 c
,可以在每一個匹配項替換前進行確認。
:%s/old/young/gc
將舊文本替換為新文本前,vi/vim 會向我們顯示以下信息:
vi 中替換字符串
y
: 執行替換(yes)n
: 跳過這個匹配字符的替換並轉到下一個(no)a
: 在當前匹配字符及後邊的相同項全部執行替換q
或 Esc
: 取消替換l
(小寫 L): 執行本次替換並退出Ctrl-e
, Ctrl-y
: 下翻頁,上翻頁,查看相應的文本來進行替換
我們在命令提示符輸入 vim file1 file2 file3 如下:
#vim file1 file2 file3
vim 會首先打開 file1,要跳到 file2 需用 :n
命令。當需要打開前一個文件時,:N
就可以了。
為了從 file1 跳到 file3
a) :buffers
命令會顯示當前正在編輯的文件列表
:buffers
編輯多個文件
b) :buffer 3
命令(後邊沒有 s)會打開第三個文件 file3 進行編輯。
在上邊的圖片中,標記符號 #
表示該文件當前已被打開,但是是在後台,而 %a
標記的文件是正在被編輯的。另外,文件號(如上邊例子的 3)後邊的空格表示該文件還沒有被打開。
為了復制連續的多行(比如,假設為 4 行)到一個名為 a 的臨時緩存區(與文件無關),並且還要將這些行粘貼到在當前 vi 會話文件中的其它位置,我們需要:
按下 Esc
鍵以確認 vi 處在命令模式
將光標放在我們希望復制的第一行文本
輸入 a4yy
復制當前行和接下來的 3 行,進入一個名為 a 的緩存區。我們可以繼續編輯我們的文件————我們不需要立即插入剛剛復制的行。
當到了需要使用剛剛復制的那些行的位置,在 p
(小寫)或 P
(大寫)命令前使用a
來將復制行插入到名為 a 的 緩存區:
ap
,復制行將插入到光標位置所在行的下一行。aP
,復制行將插入到光標位置所在行的上一行。如果願意,我們可以重復上述步驟,將緩存區 a 中的內容插入到我們文件的多個位置。像本節中這樣的一個臨時緩存區,會在當前窗口關閉時釋放掉。
像我們看到的一樣,vi/vim 在命令接口下是一個強大而靈活的文本編輯器。通過以下鏈接,隨時分享你自己的技巧和評論。