# Vim Tutorial ![](https://i.imgur.com/NkeKG7A.png =300x) --- # Introduction ---- ## Q1: 什麼是 Vim? ---- ## A1: Vim 是一個文字介面下的文字編輯器。平常大家用的 VsCode、NotePad++、Sublime 之類的是圖形介面下的文字編輯器。 ---- ## Q2: 為啥要學 Vim? ---- ## A2: 1. 大多的 Unix-like system 都會內建 vim,其他的編輯器則不一定會存在。 2. 以後用 ssh 連工作站大多是 Linux,需要用到 Vim(至少基本操作)。 3. 許多程式的操作介面會自動呼叫 Vim,沒學的話很多指令都不能用。 4. Loading 速度比起圖形介面編輯器快很多。 5. 可以把你的編輯器變得很有個人風格、提升碼農輸出效率 + **裝逼用**。 ---- ## Q3: Vi / Vim 的關係是? ---- ## A3: Vi 比較老,比較難用,Vim 是 Vi Improved 的縮寫,現在大多的系統都會裝 Vim,然後很多人(包括我)會創一個 command alias ```shell $ alias vi='vim' ``` 讓我們打 vi 就可以執行 vim。 --- # Basic Concept ---- ## Vim modes + <font color=orange>**Normal mode**</font>: 游標移動、搜尋、取代、刪除、複製、貼上... + <font color=orange>**Insert mode**</font>: 打字輸入文字 + <font color=orange>**Command mode**</font>: 分割視窗、讀檔、存檔... + <font color=orange>**Visual mode**</font>: 選取文字 ---- ## Vim modes <!-- ![vim_modes](https://raw.githubusercontent.com/durgaswaroop/Your_First_Lesson_In_Vim/master/pictures/vim_modes_small.png =500x) --> <img src=https://raw.githubusercontent.com/durgaswaroop/Your_First_Lesson_In_Vim/master/pictures/vim_modes_small.png style="background-color:white; width:500px"> 由上圖可知不知道自己在哪個 mode 的時候狂按 Esc 就會回到 normal mode 了。 --- # First Practice ---- ## 首先先確保大家都有 vim ```shell $ sudo apt install vim ``` ---- ## cd 進今天的練習用資料夾 ```shell $ mkdir ~/test $ cd ~/test ``` ---- ## 編輯一個 `test.txt` 的檔案 ```shell $ vi test.txt ``` 預設進去會是 Normal mode ---- ## 插入一些字吧! 按 `i` 進入 insert mode,之後打進這些字。 ``` Hello, world! Hi 123 ``` ---- 註:backspace 可能會不如你的預期,如果想讓 backspace 比較符合直覺可以先按 Esc 回到 Normal mode 再打以下的指令 ``` :set backspace=indent,eol,start ``` ---- 按 `Esc` 退出 insert mode,回到 normal mode,之後按 `:` 進入 command mode。輸入 `wq` 就可以儲存並離開。 > 所以記法就是 `:wq` 是存檔並離開 ---- ## 結論 首先如果覺得 backspace 怪怪的,打以下指令: ``` :set backspace=indent,eol,start ``` 之後其實只要會 i 進入 insert mode,Esc 回到 normal mode,然後用上下左右鍵就可以用 vim 了,然後 `:wq` 存檔。 之後會開始講一坨其他的快捷鍵,若沒興趣其實可以不用聽,所以會講比較快。 --- # Reference --- # Normal Mode ---- ## 游標移動 - 1 | 按鍵 | 功能 | | --------------- | -------------------------------- | | Arrow Up / k | 游標向上移一個字 | | Arrow Down / j | 游標向下移一個字 | | Arrow Left / h | 游標向左移一個字 | | Arrow Right / l | 游標向右移一個字 | 註:可加數字,例如 4h 就會把游標往左移4個字。 ---- ## 游標移動 - 2 | 按鍵 | 功能 | | --------------- | -------------------------------- | | 0 | 游標移到整行最前面 | | ^ | 游標移到同一行最前面的非空白字元 | | $ | 游標移到整行最後面 | ---- ## 游標移動 - 3 | 按鍵 | 功能 | | ---- | ------------------------------------------------------------------------ | | G | 游標移動到這個檔案的最後一列 | | nG | n 為數字。移動到這個檔案的第 n 列。例如 20G 會移動到這個檔案的第 20 列 | | gg | 游標移動到這個檔案的第一列,相當於 1G | ---- ## 游標移動 - 4 | 按鍵 | 功能 | | ---- | -------------------------------------------------- | | w | 游標移動到下一個字的開頭(以詞為單位) | | W | 游標移動到下一個字的開頭(以連續非空白字元為單位) | | b | 游標移動到上一個字的開頭(以詞為單位) | | B | 游標移動到上一個字的開頭(以連續非空白字元為單位) | ---- ## 游標移動 - 5 | 按鍵 | 功能 | | ---- | --------------------------------------------------------- | | fn | n 可換成其他字符,游標移動到同一行往右最近的n上 | | Fn | n 可換成其他字符,游標移動到同一行往左最近的n上 | | tn | n 可換成其他字符,游標移動到同一行往右最近的n的前一個字符 | ---- ## 頁面捲動 | 按鍵 | 功能 | | ------ | ------------ | | ctrl+f | 向下捲動一頁 | | ctrl+b | 向上捲動一頁 | ---- ## 刪除 | 按鍵 | 功能 | | ------ | -------------------------- | | x | 刪除游標在的那個字 | | dd | 刪除游標在的那整行 | | D / d$ | 刪除游標在的位置到那行行尾 | | dG | 刪除游標在的位置到檔案結尾 | 註:一樣可加數字,例如 4dd 就會刪除 4 行。 ---- ## 複製 / 貼上 | 按鍵 | 功能 | | ---- | ---------------------------- | | yy | 複製游標在的那整行 | | p | 將已複製的資料貼在游標下一行 | | P | 將已複製的資料貼在游標上一行 | 註:一樣可加數字,例如 4yy 就會複製 4 行、4p 就會貼上 4 次。 ---- ## 重做 / 復原 / 反復原 | 按鍵 | 功能 | | ------ | ---------------- | | . | 重複上一個動作 | | u | 復原上一個動作 | | ctrl+r | 反復原上一個動作 | ---- ## 搜尋 | 按鍵 | 功能 | | ----- | -------------------------------------- | | /word | 向游標之下尋找一個名稱為 word 的字串。 | | ?word | 向游標之上尋找一個名稱為 word 的字串。 | | n | 重複前一個搜尋的動作 | | N | 反向重複前一個搜尋的動作 | ---- ## 取代 - 1 | 按鍵 | 功能 | | --------------------- | -------------------------------------------------------------------------------- | | :n1,n2s/word1/word2/g | n1 與 n2 為數字。在第 n1 與 n2 列之間尋找 word1 這個字串,並將該字串取代為 word2 | 註:其實 word1 是 vim 版 regular expresion,例如 <font color=red>`\<`</font> 是 left word boundary,可以用 <font color=red>`/\v`</font> 設定成 very magic,就會比較像正常的 regex ---- ## 取代 - 2 | 按鍵 | 功能 | | ----------------- | ------------------------------------------------- | | :%s/word1/word2/g | 從整個檔案尋找 word1 字串,並將該字串取代為 word2 | ---- ## 取代 - 3 | 按鍵 | 功能 | | ----------------- | ------------------------------------------------- | | :%s/word1/word2/gc | 從整個檔案尋找 word1 字串,並將該字串取代為 word2,且在取代前顯示提示字元給使用者確認是否需要取代 | ---- ## 其他 | 按鍵 | 功能 | | ---- | ----------------------------------------- | | ZZ | 若檔案改過,存檔並離開;若沒改過,直接離開 | | J | 將游標所在列與下一列的資料結合成同一列 | | ciw | 刪掉當前的字並進入插入模式 | ---- 註:其實上一張投影片第3個按鍵叫做 text object,有興趣可以去查,<font color=red>iw</font>是字,<font color=red>diw</font>可以刪掉字,<font color=red>yiw</font>可以複製字,其他還有<font color=red>`i(`</font>,<font color=red>`a(`</font>, <font color=red>`it`</font> 之類的,<font color=red>`di(`</font>可以刪掉`()`裡的字,<font color=red>`da(`</font>可以刪掉包含`()`的字,<font color=red>`dit`</font>可以刪掉html tag裡面的字。 --- # Insert Mode ---- ## 進入 Insert mode - 1 | 按鍵 | 功能 | | ---- | ---------------------------------------- | | i | 從目前游標所在處前面插入 | | a | 從目前游標所在處後面插入 | | I | 在目前所在列的第一個非空白字元處開始插入 | | A | 從游標所在列的行尾處開始插入 | ---- ## 進入 Insert mode - 2 | 按鍵 | 功能 | | ---- | -------------------------------- | | o | 在目前游標所在的下一列處開始插入 | | O | 在目前游標所在的上一列處開始插入 | | r | 進入取代模式,取代當前字元一次 | --- # Command Mode ---- ## 存檔操作 | 按鍵 | 功能 | | ---- | ------------------------ | | `:w` | 存檔 | | `:w!` | 強制存檔 | | `:q` | 離開 | | `:q!` | 強制離開(不存檔便離開) | | `:wq` | 存檔並離開 | ---- ## 視窗切割 | 按鍵 | 功能 | | --------------------- | -------------------------------------------------------- | | :sp 檔名 | 水平分割視窗開啟檔案 | | :vsp 檔名 | 垂直分割視窗開啟檔案 | | ctrl+w kjhl或上下左右 | 先按ctrl+w,放開,再按上下左右或kjhl,在分割的視窗間移動 | ---- ## 其他 | 按鍵 | 功能 | | --------- | -------------------- | | `:help` | 看各種 documentation | | `:set nu` | 顯示行數 | 註:vim 博大精深,其他還有 <font color=red>`:tabe`</font>、<font color=red>`:term`</font> 之類的,但太多了所以就先不講了,不過可以 show 一下。 --- # Visual Mode | 按鍵 | 功能 | | ------ | ------------------- | | v | 以字為單位選取 | | V | 以行為單位選取 | | ctrl+v | 以 block 為單位選取 | 選取之後可以用 y 複製和用 x 刪掉之類的。 --- 這是一個可愛的互動網頁 https://www.openvim.com/ ,讓你可以熟悉 vim 的操作喔~ --- # Vimrc 簡介 ---- 可以把設定寫在 `~/.vimrc` 裡,會讓你的 vim 瞬間變很厲害喔,尤其再加上 plugin,或是自己寫 vim script,但今天沒辦法教那麼多所以就 show 給大家看就好。 想學 vim script 可以去以下網站: https://learnvimscriptthehardway.stevelosh.com/ --- # Special Special Thanks ---- 奇聖的投影片 (歡迎大家去看他的[設定檔](https://github.com/MortalHappiness/Linux-config/tree/master/vim-config) ,幫他按星星ㄛ~~) --- # The End
{"metaMigratedAt":"2023-06-15T16:01:09.070Z","metaMigratedFrom":"YAML","title":"Vim Tutorial","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"90f81fe6-9642-4f32-9aa7-eaccec059a0f\",\"add\":207,\"del\":15},{\"id\":\"3283cada-956a-4fe4-adfc-dbde9b910191\",\"add\":248,\"del\":175},{\"id\":\"a4f7cec5-0d48-4d7e-bc83-4dfab3030445\",\"add\":8472,\"del\":597}]"}
    1003 views
   owned this note