第四章 使用 vi(m) 編輯檔案
vi(m) 是一個非常強大的編輯程式, 在許多作業系統都是內附的。為何是打 vi(m) 呢? 因為這邊指的其實都是 vim (Vi IMproved 的縮寫), 但有滿多作業系統打 vi 的時候其實叫出來的是 vim。由於 vi 打習慣了, 指令也少一個字元, 因此常常就直接稱它為 vi 了。更多資訊可以參考維基百科 (Vim)。這邊會涵蓋一些最入門的教學。
首先, 我們在 command line 裡面打 vi
或是指定檔案名稱如 vi [file]
$ vi
多種模式
如果你在上面的畫面開始想要打字編輯, 你會發現不如你的預期, 因為 vi 其實有多種模式, 最常見的三種模式分別是
- 普通模式
- 輸入模式 (取代模式)
- 命令列模式
當我們一進入 vi 的時候, 我們都是在普通模式。而普通模式的各種按件都是不同的指令, 例如 h
, j
, k
, l
分別是游標向左、下、上、右移動。
而按下 i
(insert) 可以進入輸入模式, 在輸入模式的時候按下 ESC
可以跳回普通模式。如下圖, 你會看到輸入模式時會有一個很明顯的「-- INSERT --」在最下方。
在使用 vi 的時候, 大部分的時間都是停在普通模式, 當要輸入的時候才按下 i
或其他類似指令進入輸入模式, 然後輸入完會馬上再按 ESC
跳出。
我個人認為 vi 超強大的點在於它普通模式的指令, vgod 大大製作了一張精美的 vim cheat-sheet 給大家參考, 這張表可是一目了然!!
最後要介紹的是命令列模式, 又稱作 Ex 模式, 基本上就是在普通模式按下 :
(冒號) 就會進入這個模式, 如下圖, 你會發現左下方多出一個冒號, 然後你的游標會跑到最下面。此時你就可以打一些指令, 如上表, 按下 w
就是存擋, 按下 q
就是退出。你也可以用 wq
來存擋並退出, 或是用 x
來做相同的事情。
常用的指令
輸入 i
I
a
A
o
O
i
會在原地開始插入輸入。I
會從行頭開始插入輸入。a
會從游標的下一個字元開始插入輸入。A
會從行尾開始輸入。o
會在游標的下面插入一行新的開始輸入。O
則是在游標的上面插入一行新的開始輸入。
左下上右 h
j
k
l
上 k
跟下 j
在 Ptt 的看板列表以及 Facebook 都是可以用的。
搜尋 /
?
如果你想要在編輯的檔案搜尋某個字串, 你可以先按下 /
(search), 它就會很像按下 :
一樣, 在左下角出現 /
然後游標跑到那邊去。
此時只要接著輸入你想要搜尋的字串, 接著按下 ENTER
, 你就會跑到有符合的字串。當你按下 ENTER
的同時, 它會跳回普通模式, 此時你只要按下 n
(下一個) 或 N
(上一個) 來進行搜尋。
如果你打的是問號, 它搜尋的方向會相反。
到 ## 行 :##
如果你想要跳到某一行, 直接鍵入冒號 :
然後緊接著打行數, 再按 ENTER
, 你就會跳到那一行了。所以如果你要跳到第一行, 就是 :1
。但如果你想要到最後一行的話, 你可以在普通模式輸入 G
。
這個通常在 debug 或是搭配 command line 的指令 grep
非常好用。
到行尾 $
如果要跳到這一行的行尾, 按下 $
即可。
在 regular expression 裡面, $
也是代表結尾的意思。
到行首 |
^
如果你要跳到這一行的第一個字元, 按下 |
, 但如果檔案有縮排, 你希望跳到第一個不是空白的字元, 按 ^
。
在 regular expression 裡面, ^
也是代表開頭的意思。
上頁 Ctrl-B
下頁 Ctrl-F
如標題, 這個按鍵在很多其他 command line 指令也適用, 如 more
或 less
...
刪除一行 dd
按下 dd
可以刪除游標所在的這一行。如果你想要往下刪除很多行, 例如刪除包含游標在內的三行, 可以用 3dd
。
刪除一個字元 x
跟刪除一行很像, x
可以刪除目前游標所在的字元。如果要刪除 10 個字元可以用 10x
。
回復 u
如果你不小心做錯事情怎麼辦? 可以按 u
回復。你可以按很多下回復到很多動之前。
取消回復 Ctrl-R
如果你按了 u
, 但其實你按錯了, 可以按下 Ctrl-R
取消剛剛的回復。
這一行跟下一行接起來 J
如果發生某些狀況, 原本是一行的斷成兩行了, 可以直接按 J
把游標所在這一行跟下一行接起來。它接起來的時候會多留一個空白。
目前資訊 (所在行數) Ctrl-G
按下 Ctrl-G
會顯示一些資訊在最下面一行, 包括現在所在的行數, 這個檔案總共有幾行... 等。
跳出 :q
不存檔離開。如果你有修改檔案, 不想要存檔, 要用 :q!
。如果想要存檔離開可以用 :qw
或是 :x
。
重新載入 :e
如果你想要重新載入現在編輯的檔案, 例如你在看 access.log
然後現在有新的東西進來了, 那你可以用 :e
。