# Vim Tutorial

---
# 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
<!--  -->
<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}]"}