---
# System prepended metadata

title: vim
tags: [Linux]

---

# vim

`$ vimtutor`

- Vim 是一種文字介面的文字編輯器，是 vi 的升級版
- 支援多種指令和快捷鍵
- 某些較精簡的發行版中不會預裝 Vim，需要另外安裝

https://learnbyexample.github.io/vim_reference/Introduction.html

[用 vim script 打造專屬自己的快捷鍵](https://ithelp.ithome.com.tw/articles/10235968)

## 使用 Vim 編輯檔案

### `vim` 指令

- 執行 `vim` 開啟編輯器
    - 指令中沒有檔名，會建立一個新的檔案，在最後**存檔時會要求輸入檔案名稱**
        ```
        vim
        ```
    - 指令中有檔名
        ```
        vim my_file.txt
        ```
        - 若檔案已存在會開啟該檔案
        - 如果不存在會建立一個新檔案，且檔名為指令中指定的檔名
- 如果指令中的**路徑不是檔案而是目錄**，會進入互動式的選單且列出目錄中的所有檔案，可以用**上下鍵和 Enter 選擇要開啟的檔案**
    - 開啟目前的目錄
        ```
        vim ./
        ```
    - 會進入類似下面的畫面，會列出目錄中的所有檔案
        ![](https://hackmd.io/_uploads/BkiAFMNJp.png)
        - 用上下鍵可以選擇檔案
        - Enter 開啟選擇的檔案

### Vim 的不同模式

Vim 在使用時有多個不同的模式，每個模式下的主要功能和使用方式都不太相同

- **Normal Mode**
    - 預設的模式，開啟 vim 時會進入這個模式中
    - 任何時候按下 <kbd>Esc</kbd> 進入此模式
    - 從 normal mode 可以進入其他模式
    - 只能使用 vim 的快捷鍵編輯檔案
- **Insert Mode**
    - Normal mode 時按 <kbd>i</kbd> 或是 <kbd>Insert</kbd> (<kbd>Ins</kbd>) 進入此模式
        - 按 <kbd>a</kbd> 也可以進入 insert mode，游標的初始位置會和按 <kbd>i</kbd> 時不同
        - 按 <kbd>o</kbd> 也可以進入 insert mode，會插入一個換行到檔案中
    - 左下角會顯示 `-- INSERT --`
    - 操作時和一般文字編輯器相同，可以直接編輯檔案內容
- **Command-Line Mode**
    - Normal mode 時按 <kbd>:</kbd> 進入此模式
    - 游標會跑到畫面的最下方，並且可以看到輸入的指令，透過指令進行操作
- **Visual Mode**
    - Normal mode 時按 <kbd>v</kbd> 進入此模式
    - 左下角會顯示 `-- VISUAL --`
    - 可以用方向鍵選取文字

## Normal Mode 操作

- 此模式下可以用**方向鍵控制游標**
    - 除了方向鍵，有四個字母也對應到上下左右，目的是讓手保持在鍵盤中間的位置，預設的設定如下
        - <kbd>k</kbd> 對應上
        - <kbd>j</kbd> 對應下
        - <kbd>h</kbd> 對應左
        - <kbd>i</kbd> 對應右
    - <kbd>Back Space</kbd> 不會刪除文字，會像是左鍵一樣讓游標向左移動
- **沒辦法輸入文字**，只能透過**指令編輯檔案**

### 刪除文字

- <kbd>Del</kbd> 或 <kbd>x</kbd>: 刪除游標後的一個字元
- <kbd>dd</kbd>: 刪除游標所在的行
- <kbd>X</kbd>: 刪除游標前的一個字元

### 複製文字

- <kbd>yy</kbd> 或 <kbd>Y</kbd>: 複製游標所在的行

### 貼上文字

- <kbd>p</kbd>: 貼上文字

### Undo / Redo

- <kbd>u</kbd>: 返回上一步 (GUI 環境中的 <kbd>Ctrl + z</kbd>)
- <kbd>Ctrl + r</kbd>: 取消上個 undo (GUI 環境中的 <kbd>Ctrl + y</kbd>)

### 切換模式

- <kbd>i</kbd>, <kbd>Ins</kbd>: 進入 insert mode
    - 游標會停留在目前的位置
- <kbd>a</kbd>: 進入 insert mode
    - 游標會切換到右邊一個字元的位置
- <kbd>o</kbd>: 進入 insert mode
    - 會新增一個空行到下一行，並些游標會切換到下一行
- <kbd>v</kbd>: 進入 visual mode
    - 可以用方向鍵選擇文字
- <kbd>:</kbd>: 進入 command line mode
    - 可以輸入指令進行編輯

## Command-Line Mode

- Normal mode 按 `:` 進入此模式
- 鍵盤的內容會出現在視窗最下方

### 存檔

- `w`: 儲存檔案

### 離開

- `q`: 一般離開，需要先存檔
    - 通常用 `wq` 結合兩個指令使用
- `q!`: 強制離開
    - 放棄修改的內容，直接離開

## Vision Mode

- 可以用方向鍵選擇文字

