<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
# 文字編輯器 Vim
###### tags: `vim`
- [slide:https://hackmd.io/@ewnlm/Sk6ohKAqp] <!-- Put the link to this slide here so people can follow -->
---
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 開檔
- 開啟 FILE.
```shell!
% vim FILE
```
- 開啟 FILE1, FILE2 存在 vim buffer list, 並用`:n`開啟下一份檔案.
```shell!
% vim FILE1 FILE2
```
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 開檔
- 開啟 FILE, 並直接跳到第N行.
```shell!
% vim +N FILE
```
- 開啟 FILE, 並直接搜尋字串PATTERN.
```shell!
% vim +/PATTERN FILE
```
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 開檔
- 以 Tablist 開啟 FILE1, FILE2.
```shell!
% vim -p FILE1 FILE2
```
- 以 上下視窗的方式 開啟 FILE1, FILE2.
```shell!
% vim -o FILE1 FILE2
% vim -O FILE1 FILE2 # 左右視窗的方式開啟
```
---
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 模式
- 大致的模式, 透過對應按鍵切換.
```graphviz
digraph vimmode {
nodesep=1.0 // increases the separation between nodes
node [color=Red,fontname=Courier,shape=egg] //All nodes will this shape and colour
edge [color=Blue, style=dashed] //All the lines look like this
開啟vim->命令模式
命令模式 -> 插入模式 [label="i,a"]
命令模式 -> 指令模式 [label=":"]
edge [color=red, style=dashed]
指令模式 -> 命令模式 [label="ESC"]
插入模式 -> 命令模式 [label="ESC"]
}
```
---
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 按鍵 `h` (左), `l`(右); `j`(下), `k`(上)
- ==數字+(指令)是很有威力的功能, 且適用很多地方==
- 例如, `10j` 往下移動十行。
- `ctrl+f` (下一頁, forward); `ctrl+b` (上一頁, backward)
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 在同一畫面裡,
- `H` 游標移至畫面頂端
- `M` 游標移至畫面中線
- `L` 游標移至畫面底端
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 移動所在游標至畫面指定處. 將游標所在的行, 放至畫面的
- `zt` 頂端
- `zz` 中間
- `zb` 底部
- 將所在行移至中間,方便看前後行內容.
- 移至底部,方便看之前內容.
- 移至頂端,方便看後面內容.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下, `gg`移動至整份檔案開頭
- `G`移動至整份檔案結尾
- 在第一行才有用, 一樣在命令模式下, 輸入`n%`(n為數字0~100), 可移動整份檔案百分之n處.
- 例如, `50%`可移動至整份檔案中間處.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下
- 按鍵`0`, 移動游標至行首.
- 按鍵`^`, 移動游標至整行第一個字首.
- 按鍵`$`, 移動游標至行尾.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下
- 按鍵`w`, 移動至下一個字的字首, 不包含符號, 也就是以空白或符號當間隔的下個字字首.
- 按鍵`e`, 移動至下一個字的字尾, 規則同上.
- 按鍵`b`, 倒退至前一個字的字首, 規則一樣同上.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下
- 按鍵`W`, 類似`w`, 但是只有空白當間隔.
- 意思就是可以跳的比較遠,例如, `if(a>b)`, 可直接跳到下一個敘述.
- 按鍵`E`, 類似`e`, 只認空白當間隔.
- 按鍵`B`, 類似`b`, 規則同上.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下
- 按鍵`%`, 移動至最接近的括號組合.
- 括號組合包含,`()`, `[]`, `{}`.
- 很適合用來找程式缺少的括號.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下
- 按鍵`fx`, 以游標為基準, 向右移動至字元x處.
- 按鍵`Fx`, 以游標為基準, 向左移動至字元x處.
- `x`可以為任意字元或符號, 讓你可以隨意移動指定處.
- "/cygdrive/d/d/IN_PROGRAM/Work/File.txt"
- 假設游標在開頭`/`處,
- `6f/` 可以讓你直接移動到最後一個`/`符號.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 移動方式
- 命令模式(ESC)下
- 游標所在文字是檔案, 按鍵`gf`, 可直接開啟檔案.
- `ctrl+o` 可以回上一份檔案.
---
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 先確定在命令模式, 按ESC鍵可以回到命令模式.
- 按鍵`i`, 在游標前插入文字
- 按鍵`a`, 在游標後插入文字
- ==善用數字==
- `10a=` 在游標後連續插入10個`=`符號.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 一樣在命令模式, 按鍵`o`往下開新行
- 按鍵`O`,往上開新行.
- ==善用數字==
- `10o=` 在游標後連續開10行.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 按鍵`J`, 連接下一行內容.
- 將游標所在行的換行符號拿掉, 則下一行的內容會連接在後.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 按鍵`cc`, 更換(change) 整行內容.
- 把游標所在整行刪除, 並直接進行插入模式, 等待輸入新資料.
- 搭配前述的移動方式, 可做出不同的更換.
- `cw` 刪掉游標所在word, 並進行更換.
- `c4l` 刪掉游標右邊四個字元, 直接插入新內容.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 按鍵`x`, 刪除游標之後的字元, 一樣維持在命令模式底下(ESC).
- 按鍵`X`, 刪除游標之前的字元.
- `x`算是最後動作, 所以修飾的量詞要放在前面.
- 例如, `5x`, 刪除游標之後的五個字元.
- 刪除後, 一直會留在命令模式.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 同樣是刪除, 按鍵`d`變化更多. 類似`c` change.
- `dd` 刪除整行。
- 搭配前述的移動方式,可以做出
- `dw` 刪除一個字.
- `d$` 從游標處刪至行尾.
- `dG` 從游標處刪至檔案結尾.
- 同`x`, 動作完一樣留在命令模式下.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 按鍵`r`(replace), 取代游標當下的字元.
- 按鍵`r`之後會變成輸入模式, 直接按下想替換的字即可.
- 一樣可以用數字連續取代n個字. `nr` 刪掉游標右邊n個字元, 並進入插入模式.
- 與`r`不同的是, 按鍵`R`會留在取代模式, 一直蓋掉後面的文字直到按`ESC`鍵.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 復原
- ==很重要!很重要!==
- `u` (undo)復原上一動, 可以無限還原至剛開啟的狀態.
- `ctrl+r` redo. 一樣沒有次數限制.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 排版
- `>>`, `<<` 在命令模式下, 將整行左移或右移.
- `gg=G` 命令模式下, 將整份檔案調整成 c-style indent.
----
<!-- .slide: data-transition="zoom" -->
<!-- .slide: data-background="https://hackmd.io/_uploads/rkZ8MIjbi.png" -->
## 編輯
- 按鍵`y`(yank)
{"title":"文字編輯器. Vim","breaks":true,"description":"Brief of Vim","showTags":"true","contributors":"[{\"id\":\"0b93a0f4-2322-4e3e-9569-2c17e87a9819\",\"add\":8639,\"del\":2360}]"}