Vim 入門:基礎
我還清晰地記得我第一次接觸 Vim 的時候。那時我還是一名大學生,計算機學院的機房裡都裝著 Ubuntu 系統。儘管我在上大學前也曾接觸過不同的 Linux 發行版(比如 RHEL —— Red Hat 在百思買出售它的 CD),但這卻是我第一次要在日常中頻繁使用 Linux 系統,因為我的課程要求我這樣做。當我開始使用 Linux 時,正如我的前輩和將來的後繼者們一樣,我感覺自己像是一名「真正的程序員」了。
![Real Programmers comic](/data/attachment/album/201904/20/104307h6o5ntn9h225onn0.jpg "Real Programmers comic")
真正的程序員,來自 xkcd
學生們可以使用像 Kate 一樣的圖形文本編輯器,這也安裝在學校的電腦上了。對於那些可以使用 shell 但不習慣使用控制台編輯器的學生,最流行的選擇是 Nano,它提供了很好的互動式菜單和類似於 Windows 圖形文本編輯器的體驗。
我有時會用 Nano,但當我聽說 Vi/Vim 和 Emacs 能做一些很棒的事情時我決定試一試它們(主要是因為它們看起來很酷,而且我也很好奇它們有什麼特別之處)。第一次使用 Vim 時嚇到我了 —— 我不想搞砸任何事情!但是,一旦我掌握了它的訣竅,事情就變得容易得多,我就可以欣賞這個編輯器的強大功能了。至於 Emacs,呃,我有點放棄了,但我很高興我堅持和 Vim 在一起。
在本文中,我將介紹一下 Vim(基於我的個人經驗),這樣你就可以在 Linux 系統上用它來作為編輯器使用了。這篇文章不會讓你變成 Vim 的專家,甚至不會觸及 Vim 許多強大功能的皮毛。但是起點總是很重要的,我想讓開始的經歷儘可能簡單,剩下的則由你自己去探索。
第 0 步:打開一個控制台窗口
在使用 Vim 前,你需要做一些準備工作。在 Linux 操作系統打開控制台終端。(因為 Vim 也可以在 MacOS 上使用,Mac 用戶也可以使用這些說明)。
打開終端窗口後,輸入 ls
命令列出當前目錄下的內容。然後,輸入 mkdir Tutorial
命令創建一個名為 Tutorial
的新目錄。通過輸入 cd Tutorial
來進入該目錄。
![Create a folder](/data/attachment/album/201904/20/104312nbyok8arxho0bnok.jpg "Create a folder")
這就是全部的準備工作。現在是時候轉到有趣的部分了——開始使用 Vim。
第 1 步:創建一個 Vim 文件和不保存退出
還記得我一開始說過我不敢使用 Vim 嗎?我當時在害怕「如果我改變了一個現有的文件,把事情搞砸了怎麼辦?」畢竟,一些計算機科學作業要求我修改現有的文件。我想知道:如何在不保存更改的情況下打開和關閉文件?
好消息是你可以使用相同的命令在 Vim 中創建或打開文件:vim <FILE_NAME>
,其中 <FILE_NAME>
表示要創建或修改的目標文件名。讓我們通過輸入 vim HelloWorld.java
來創建一個名為 HelloWorld.java
的文件。
你好,Vim!現在,講一下 Vim 中一個非常重要的概念,可能也是最需要記住的:Vim 有多種模式,下面是 Vim 基礎中需要知道的的三種:
模式 | 描述 |
---|---|
正常模式 | 默認模式,用於導航和簡單編輯 |
插入模式 | 用於直接插入和修改文本 |
命令行模式 | 用於執行如保存,退出等命令 |
Vim 也有其他模式,例如可視模式、選擇模式和命令模式。不過上面的三種模式對我們來說已經足夠用了。
你現在正處於正常模式,如果有文本,你可以用箭頭鍵移動或使用其他導航鍵(將在稍後看到)。要確定你正處於正常模式,只需按下 esc
(Escape)鍵即可。
提示:
Esc
切換到正常模式。即使你已經在正常模式下,點擊Esc
只是為了練習。
現在,有趣的事情發生了。輸入 :
(冒號鍵)並接著 q!
(完整命令::q!
)。你的屏幕將顯示如下:
![Editing Vim](/data/attachment/album/201904/20/104313nxbiqx37yq3kk5qx.jpg "Editing Vim")
在正常模式下輸入冒號會將 Vim 切換到命令行模式,執行 :q!
命令將退出 Vim 編輯器而不進行保存。換句話說,你放棄了所有的更改。你也可以使用 ZQ
命令;選擇你認為更方便的選項。
一旦你按下 Enter
(回車),你就不再在 Vim 中。重複練習幾次來掌握這條命令。熟悉了這部分內容之後,請轉到下一節,了解如何對文件進行更改。
第 2 步:在 Vim 中修改並保存
通過輸入 vim HelloWorld.java
和回車鍵來再次打開這個文件。你可以在插入模式中修改文件。首先,通過 Esc
鍵來確定你正處於正常模式。接著輸入 i
來進入插入模式(沒錯,就是字母 i)。
在左下角,你將看到 -- INSERT --
,這標誌著你這處於插入模式。
![Vim insert mode](/data/attachment/album/201904/20/104315z2klgi2lwlbvthgg.jpg "Vim insert mode")
寫一些 Java 代碼。你可以寫任何你想寫的,不過這也有一份你可以參照的例子。你的屏幕將顯示如下:
public class HelloWorld {
public static void main([String][11][] args) {
}
}
非常漂亮!注意文本是如何在 Java 語法中高亮顯示的。因為這是個 Java 文件,所以 Vim 將自動檢測語法並高亮顏色。
保存文件:按下 Esc
來退出插入模式並進入命令行模式。輸入 :
並接著 x!
(完整命令::x!
),按回車鍵來保存文件。你也可以輸入 wq
來執行相同的操作。
現在,你知道了如何使用插入模式輸入文本並使用以下命令保存文件::x!
或者 :wq
。
第 3 步:Vim 中的基本導航
雖然你總是可以使用上箭頭、下箭頭、左箭頭和右箭頭在文件中移動,但在一個幾乎有數不清行數的大文件中,這將是非常困難的。能夠在一行中跳躍游標將會是很有用的。雖然 Vim 提供了不少很棒的導航功能,不過在一開始,我想向你展示如何在 Vim 中到達某一特定的行。
單擊 Esc
來確定你處於正常模式,接著輸入 :set number
並鍵入回車。
瞧!你現在可以在每一行的左側看到行號。
![Showing Line Numbers](/data/attachment/album/201904/20/104319ow29q27wwzs00s0y.jpg "Showing Line Numbers")
好,你也許會說,「這確實很酷,不過我該怎麼跳到某一行呢?」再一次的,確認你正處於正常模式。接著輸入 :<LINE_NUMBER>
,在這裡 <LINE_NUMBER>
是你想去的那一行的行數。按下回車鍵來試著移動到第二行。
:2
現在,跳到第三行。
![Jump to line 3](/data/attachment/album/201904/20/104322x033zctfxff9ff2z.jpg "Jump to line 3")
但是,假如你正在處理一個一千多行的文件,而你正想到文件底部。這該怎麼辦呢?確認你正處於正常模式,接著輸入 :$
並按下回車。
你將來到最後一行!
現在,你知道如何在行間跳躍了,作為補充,我們來學一下如何移動到一行的行尾。確認你正處於有文本內容的一行,如第三行,接著輸入 $
。
![Go to the last character](/data/attachment/album/201904/20/104325w6poo9hhj9x6ozi9.jpg "Go to the last character")
你現在來到這行的最後一個位元組了。在此示例中,高亮左大括弧以顯示游標移動到的位置,右大括弧被高亮是因為它是高亮的左大括弧的匹配字元。
這就是 Vim 中的基本導航功能。等等,別急著退出文件。讓我們轉到 Vim 中的基本編輯。不過,你可以暫時順便喝杯咖啡或茶休息一下。
第 4 步:Vim 中的基本編輯
現在,你已經知道如何通過跳到想要的一行來在文件中導航,你可以使用這個技能在 Vim 中進行一些基本編輯。切換到插入模式。(還記得怎麼做嗎?是不是輸入 i
?)當然,你可以使用鍵盤逐一刪除或插入字元來進行編輯,但是 Vim 提供了更快捷的方法來編輯文件。
來到第三行,這裡的代碼是 public static void main(String[] args) {
。雙擊 d
鍵,沒錯,就是 dd
。如果你成功做到了,你將會看到,第三行消失了,剩下的所有行都向上移動了一行。(例如,第四行變成了第三行)。
![Deleting A Line](/data/attachment/album/201904/20/104329i0oripvlg8wz8lk7.jpg "Deleting A Line")
這就是 刪除 命令。不要擔心,鍵入 u
,你會發現這一行又回來了。喔,這就是 撤銷 命令。
![Undoing a change in Vim](/data/attachment/album/201904/20/104332o8nnv8qlqqlnelim.jpg "Undoing a change in Vim")
下一課是學習如何複製和粘貼文本,但首先,你需要學習如何在 Vim 中突出顯示文本。按下 v
並向左右移動游標來選擇或反選文本。當你向其他人展示代碼並希望標識你想讓他們注意到的代碼時,這個功能也非常有用。
![Highlighting text in Vim](/data/attachment/album/201904/20/104335ol7u6u61uprm7bmr.jpg "Highlighting text in Vim")
來到第四行,這裡的代碼是 System.out.println("Hello, Opensource");
。高亮這一行的所有內容。好了嗎?當第四行的內容處於高亮時,按下 y
。這就叫做 複製 模式,文本將會被複制到剪貼板上。接下來,輸入 o
來創建新的一行。注意,這將讓你進入插入模式。通過按 Esc
退出插入模式,然後按下 p
,代表 粘貼 。這將把複製的文本從第三行粘貼到第四行。
![Pasting in Vim](/data/attachment/album/201904/20/104338li1hb4qmyeq46d2h.jpg "Pasting in Vim")
作為練習,請重複這些步驟,但也要修改新創建的行中的文字。此外,請確保這些行對齊工整。
提示: 您需要在插入模式和命令行模式之間來回切換才能完成此任務。
當你完成了,通過 x!
命令保存文件。以上就是 Vim 基本編輯的全部內容。
第 5 步:Vim 中的基本搜索
假設你的團隊領導希望你更改項目中的文本字元串。你該如何快速完成任務?你可能希望使用某個關鍵字來搜索該行。
Vim 的搜索功能非常有用。通過 Esc
鍵來進入命令模式,然後輸入冒號 :
,我們可以通過輸入 /<SEARCH_KEYWORD>
來搜索關鍵詞, <SEARCH_KEYWORD>
指你希望搜索的字元串。在這裡,我們搜索關鍵字元串 Hello
。在下面的圖示中沒有顯示冒號,但這是必須輸入的。
![Searching in Vim](/data/attachment/album/201904/20/104340tlsr8a33l2zr2zdl.jpg "Searching in Vim")
但是,一個關鍵字可以出現不止一次,而這可能不是你想要的那一個。那麼,如何找到下一個匹配項呢?只需按 n
鍵即可,這代表 下一個 。執行此操作時,請確保你沒有處於插入模式!
附加步驟:Vim 中的分割模式
以上幾乎涵蓋了所有的 Vim 基礎知識。但是,作為一個額外獎勵,我想給你展示 Vim 一個很酷的特性,叫做 分割 模式。
退出 HelloWorld.java
並創建一個新文件。在控制台窗口中,輸入 vim GoodBye.java
並按回車鍵來創建一個名為 GoodBye.java
的新文件。
輸入任何你想輸入的讓內容,我選擇輸入 Goodbye
。保存文件(記住你可以在命令模式中使用 :x!
或者 :wq
)。
在命令模式中,輸入 :split HelloWorld.java
,來看看發生了什麼。
![Split mode in Vim](/data/attachment/album/201904/20/104345e9e9ucep9o9cruo4.jpg "Split mode in Vim")
Wow!快看! split
命令將控制台窗口水平分割成了兩個部分,上面是 HelloWorld.java
,下面是 GoodBye.java
。該怎麼能在窗口之間切換呢? 按住 Control
鍵(在 Mac 上)或 Ctrl
鍵(在 PC 上),然後按下 ww
(即雙擊 w
鍵)。
作為最後一個練習,嘗試通過複製和粘貼 HelloWorld.java
來編輯 GoodBye.java
以匹配下面屏幕上的內容。
![Modify GoodBye.java file in Split Mode](/data/attachment/album/201904/20/104349vqbzq47gnzq4x99u.jpg "Modify GoodBye.java file in Split Mode")
保存兩份文件,成功!
提示 1: 如果你想將兩個文件窗口垂直分割,使用
:vsplit <FILE_NAME>
命令。(代替:split <FILE_NAME>
命令,<FILE_NAME>
指你想要使用分割模式打開的文件名)。提示 2: 你可以通過調用任意數量的
split
或者vsplit
命令來打開兩個以上的文件。試一試,看看它效果如何。
Vim 速查表
在本文中,您學會了如何使用 Vim 來完成工作或項目,但這只是你開啟 Vim 強大功能之旅的開始,可以查看其他很棒的教程和技巧。
為了讓一切變得簡單些,我已經將你學到的一切總結到了 一份方便的速查表 中。
via: https://opensource.com/article/19/3/getting-started-vim
作者:Bryant Son 選題:lujun9972 譯者:Modrisco 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive