vim-logo.gif上次我們只約略講了為什麼要用 vim,以及很簡略地說明 vim 的安裝,並給了我個人目前在用的設定檔

今天打算介紹的是怎麼進入和離開 vim。

對於 windows 的使用者來說,離開程式有很多種方法,像是把左上角的「X」按下去、Alt-F4、Ctrl-Alt-Del按下去之後把工作管理員叫出來把 vim 這個程式砍掉,或是作業系統自己當機等等有意或非有意的作法。而對於 un*ix 的使用者來說,他們可能沒有「X」可以按,也沒有 Alt-F4,更沒有 Ctrl-Alt-Del,他們遇到看似冷酷的 vim 諸鍵不靈的時候,他們可能選擇 Ctrl-z 然後用 kill % 把vim的 precess 砍掉。

有沒有溫柔一點的方式?

有,這就是今天要說的出入 vim。

離開 vim 的正常方法其實不只一種,根據你想離開的方式,以及你的個人喜好不同,vim 都有不同的對應方法。但是這些方法都還牽涉到 vim 的模式問題,所以在這裡先岔出去談一下 vim 的模式。

上次我們只是約略提到在 vim 的環境裡面有模式的差異:有編輯模式和指令模式。事實上還有一個叫做 Visual 模式。至於其它的模式在我們現在或是未來的討論裡面應該都不會出現。所以我們只需要知道這三種模式就可以了。而這三種的模式切換常用的如下圖:

vim mode switch

所以從圖上我們可以看到 command (指令模式)是最容易碰到的,vim裡面很多強大的功能也都需要透過指令模式來達成。

當我們進入 vim 的時候如果沒有特別指定, 一開始就會是在指令模式下。而各模式之間的切換也如上圖示。基本上只要你想回到指令模式,就是<Esc>或是用Ctrl-C按一下(或者有時候需要多按幾次)就會回到指令模式了。那進入編輯模式和Visual(我稱之為選取模式)的方式就是在指令模式下按圖上所標示的那些字母中的任何一個就可以了。舉例來說,我想從指令模式跳到編輯模式去,那我就是按 a 或 i 或 o 或甚至是 R。要特別注意的是在 vim 裡面這些指令的大小寫是有差別的。這是為了滿足不同的需要。

(其實是可以在編輯模式下跳到指令模式執行完命令,不經過 a i o 等按鍵直接跳回編輯模式的方式,那就是用 ctrl-O,這個可能多數人也不常用。我也只有在編輯模式下,修改某一行的中間懶得跳到最後面按 Enter 開新行才會這樣做:就是按 ctrl-O 然後再按一個 o 就會開一個新行並同時進入編輯模式。)

從指令模式跳到編輯(Edit)模式,各按鍵說明如下:

  • 按 a 的話表示要在游標所在位置的後面開始寫入東西。
  • 按 i 的話表示要在游標所在位置的前面開始寫入東西
  • 按 o 的話則表示從游標所在的下一行開始寫入東西

剛剛說了 vim 是有區分大小寫的,那如果把上面的輸入都換成大寫會是什麼意思呢?在 vim 裡面如果只用到一個大寫字母的話,通常有大範圍的意思,或是和原來小寫字母功能方向相反的意思。我們先看上面那些字母變成大寫會是什麼意思:

  • 按 A 的話表示要在游標所在位置那行後面開始寫入東西。
  • 按 I 的話表示要在游標所在位置那行前面開始寫入東西
  • 按 O 的話則表示從游標所在的一行開始寫入東西

這樣一說,你大概可以有點感覺 vim 的設計想法。這些以後都會很常看到類似的例子。

在指令模式跳到編輯模式的時候,你可能會發現我還少講了一個「R」,那這個「R」是什麼意思呢?

「R」代表的是 Replace,取代的意思。在前面所講的 a i o 通通都是在你按下去之後,會跳到編輯模式的 insert(插入)狀態,也就是說你打入的任何東西,比方說我游標在 A處,而現在看到的字串是AB,現在我按下 a 之後,我打了一串 12345678之後就會變成 A12345678B,游標就停在B處了。但是如果我現在用的是 R,取代。那麼結果就會變成 A12345678,B就會在輸入 1 的時候被取代了。

那進入選取模式有 v 和 ctrl-V,事實上聰明的你可能已經想到其實還會有「V」,的確,是有「V」。看圖可能比較有感覺,所以我們先來看幾張圖:

    vim visual block mode

  • 上圖這是用 ctrl-V 做出來的結果,你可以看到他會選擇一個方塊區域,所以 ctrl-V 又會被稱作 visual 中的 block mode。
  • vim visual normal mode

  • 和 block mode 不同的就是一般的模式 v ,它會按照你游標上下左右移動把經過的字元都標記起來如上圖。

那至於大寫「V」就和小寫 v 不同的地方是它是整行選取,你只能一行一行的選,不能像 v 那樣,可以只選到某行的中間。

因為在不同的模式下都各有其不同的功能好用,所以在這裡為了避免離題太遠,模式的切換就先談到這裡。

回過頭我們繼續來講怎麼離開 vim。很明顯,如果你是在選取模式或是編輯模式下,你就會需要把模式切換到指令模式上,切過來之後根據你的需求和喜好有不同的離開方法。一般來說,對於指令本身,通常會用冒號「:」開頭,其後跟上你想要執行的指令串。不過也有一些指令或是你會設定熱鍵,就不需要透過以冒號開頭的方式來執行。不過在這裡我們還是先從冒號開頭的方式講起:

  • 假設你只是不小心進來 vim 想要馬上離開,而且你也沒有任何寫入的動作,可以用 :q 離開, q 就是結束(quit)的意思
  • 假如你對於寫入的結果不滿意而想要保留最後寫入之前的狀態下離開,那就是 :q! 。我們可以看到後面多了一個驚嘆號,在 vim 裡面驚嘆號「!」放在指令後面通常用於表示強制的意思。萬一你不小心進入 vim 又弄不清楚自己是不是有做過什麼事情,用 :q! 是一定可以離開 vim 環境的。
  • 如果你覺得想要寫入後再離開,那就是 :wq, w 就是寫入(write)的意思。不過有時候你可能不小心編輯的是一個唯讀的檔案,其實當你寫入的時候 vim 就會警告你說你正在修改一個唯讀的檔案。如果你確定真的要寫入, 那就必須告訴 vim 強制寫入,因為是強制命令,所以寫入的時候就不能使用 :w ,而是必須使用 :w!

前面我們提到有不需要冒號開頭而可以離開 vim 的方式,這些方式一樣也會根據你的需求而有不同的指令,不過這些指令我個人不用,也許有人比較喜歡多記一些指令,所以也在這裡介紹:

  • 「ZZ」(注意是大寫) 寫入後離開,相同於 :wq
  • 「ZQ」不寫入而要離開,等同於 :q

不管你喜不喜歡 vim ,第一步你至少已經知道怎麼離開它的環境了。

不過這裡可以順便提一下,心細的讀者可能會發現 vim 在編輯一個檔案的時候都會另外做出一個「 . 你編輯的檔案名稱 . swp」的東西,這個是幹什麼用的呢?這就是 vim 另外一個強大的地方。有時候我們在編輯文件的時候,可能因為跳電或是種種原因造成檔案不正常關閉,這個時候 vim 就可以根據這個 .swp 檔案把你最後編輯的東西叫回來。讓你不會因為跳電或種種原因而導致重大損失,所以你幾乎可以放心大膽地 vim,加上 vim 的 undo/redo 功能(按鍵 u 和 ctrl-R),讓你在編輯上可以更自由。

假如你願意使用 CVS 來當作你的文件版本控制,也可以參考拙文 CVS 的安裝與啟動 CVS 的其他使用 來更進一步管理自己的文件版本。

附帶一提,DK長輩對於編輯模式下的 Insert mode 很有意見,長輩認為在 Insert mode 下就不應具備刪除文字的功能,也就是說你按 BackSpace 或是 Del 鍵都是沒用的。不過我個人散漫慣了,還是比較喜歡在編輯模式下可以刪改東西。如果你非常欣賞DK長輩嚴謹的治學態度,也請到DK長輩的 blog 上寫信詢問長輩的 vim 設定檔。