---
# System prepended metadata

title: Vim 使用 & Vim IDE
tags: [Linux 基礎]

---

---
title: 'Vim 使用 & Vim IDE'
disqus: kyleAlien
---

Vim 使用 & Vim IDE
===

## OverView of Content

以下使用 Vim 8，簡單介紹一下它有的特性

1. 異步 I/O 操作，支持通道 Channel
2. 多任務
3. 定時器
4. 對 GTK + 3 支持

[TOC]

## Ubuntu 安裝 Vim

* 使用 Ubuntu 命令行安裝 Vim
    ```shell=
    sudo apt install vim
    ```
    > ![](https://i.imgur.com/tp3Bsui.png)


## Vim 3 種工作模式

Vim 編譯器有 3 種工作模式，^1^ Command Mode、^2^ Insert Mode、^3^ Last line mode


### Command Mode
* 當用戶使用 vim 來編譯文件時就會先進入 **Command Mode**
    > ![](https://i.imgur.com/DtCggtM.png)

### Insert Mode
* 透過關鍵字 `i`  就可以從 Command Mode 轉換到 Insert Mode (等等會介紹關其他鍵字)
    > ![](https://i.imgur.com/TzcH3b9.png)

### Last Line Mode
* 可以透過關鍵字 `:` 從 Command Mode 轉換到 Last Line Mode，在該模式下可以輸入包含單個 or 多個字符指令
    > ![](https://i.imgur.com/3SS9MkA.png)

### Vim 模式切換

1. Command Mode => Insert Mode，輸入以下關鍵字就可以進入插入模式
    
    | 功能 | 輸入字元 | 說明 |
    | -------- | -------- | -------- |
    | 插入字符 | i | 在箭頭 (鼠標、光標...) 所在位子輸入字符 |
    | 插入字符 | I | 在箭頭 (鼠標、光標...) 所在位子中第一個非 "空白" 處開始輸入 |
    | 插入字符 | a | 在箭頭 (鼠標、光標...) 所在位子的下一個地方開始輸入。記 **append** |
    | 插入字符 | A | 在箭頭 (鼠標、光標...) 所在位子的行數尾端開始輸入。記 **。記 append** |
    | 新增一行 | o | 在箭頭 (鼠標、光標...) 所在位子的行數 "後" 插入一行 |
    | 新增一行 | O | 在箭頭 (鼠標、光標...) 所在位子的行數 "前" 插入一行 |
    > ![](https://i.imgur.com/pH3iiBu.png)

2. Insert Mode => Command Mode
    按 `Ese` 就可以退出插入模式，進入到命令模式
    
3. Command Mode => Last Line Mode
    輸入 `:` 就可以進入 Last Line Mode

    > ![](https://i.imgur.com/bZZkQNF.png)

### 命令模式 - 光標移動

* **在 ++命令模式下++ Vim 編輯器放棄鍵盤上的分向鍵**，使用關鍵字來實現方向移動 (熟悉後鍵盤關鍵字後，速度相對快一點)

    | 命令 | 說明 |
    | -------- | -------- |
    | h | 左 |
    | j | 下 |
    | k | 上 |
    | l | 又 |
    
* 常見光標移動命令
    > ![](https://i.imgur.com/6Ybmwqb.png)

    | 命令 | 說明 |
    | -------- | -------- |
    | w | 移動到下個單字的頭 (Hello 移動到 World) |
    | b | 若光標在 Hello 的中間，則會移動到 Hello 的開頭 (也就是 H) |
    | f{char} | 找尋 {char} 字符所在 (**這好像會跟進插入模式的關鍵字衝突 ?**) |
    | Ctrl + f | 功能類似 Page Down (記憶 front) |
    | Ctrl + b | 功能類似 Page Up (記憶 back) |
    | Ctrl + d | 向下移動半頁 |
    | Ctrl + u | 向上移動半頁 |
    | $ | 移動到該行的最尾端 |
    | 0 | 數字 0，移動到該行的開頭 |
    | H | 移動該螢幕最 "上方" 的那行的第一個字符 |
    | L | 移動到螢幕最 "下方" 的那行的第一個字符 |
    | G | 移動到文件的最後一行 |
    | gg | 移動到文件的第一航 |
    | nG | n 代表要移動到文件的第 n 行(**指定**) |
    | nEnter | 光標往下移動 n 行 |

### 命令模式 - Copy、Paste、Delete
* **在 ++命令模式下++ 可以做到 Copy、Paste、Delete 操作**

    | 命令 | 說明 |
    | -------- | -------- |
    | x | 刪除當前光標所在位子的字符 |
    | X | 類似於 BackSpace (刪除光標前一個字符) |
    | dd | 刪除該行 |
    | ndd | 刪除光標所在底下的 n 行 |
    | yy | 複製該行 |
    | nyy | 複製光標所在底下的 n 行 |
    | p | 把複製的數據貼到光標的下一行 |
    | u | 撤銷前一個命令 |
    
    
### 命令模式 - 查找
* **在 ++命令模式下++ 可以做到查找你要的字元功能**

    | 命令 | 說明 |
    | -------- | -------- |
    | /<查找的字元> | 往下尋找 |
    | ?<查找的字元> | 往上尋找 |
    | :{作用範圍}s/{目標}/{替換}/{替換標誌} | 看下面範例 |

* 輸入 %s/alien/Ubuntu/g，用來搜尋全域範圍的 alien，並替換成 Ubtuntu
    1. 輸入前
        ![](https://i.imgur.com/eJQKSvs.png)
    2. 輸入後結果
        ![](https://i.imgur.com/EsSeEWO.png)



### 底行模式 - 文件操作
* 文件操作要在 **++底行模式下++** (**輸入 `:`**)

    | 命令 | 說明 |
    | -------- | -------- |
    | q | 退出 |
    | q! | 強退出，並不保留 |
    | w | 寫入 |
    | w! | 強制寫入 |
    | wq | 寫入並離開 |
    | wq! | 強制寫入並離開 |
    | x | 同 wq |
    | x! | 同 wq! |

## 使用 Vim 打造 IDE
* 前提: 先安裝 Vim & Git
    ```shell=
    sudo apt install git vim
    ```

### Vim 插件管理工具 - [Vundle](https://github.com/VundleVim/Vundle.vim)
* Vim 支持許多的插件，以前需要到插件網站下載 & 複製到 home 目錄下的 .vim 子目錄才可以使用。

* **[Vundle](https://github.com/VundleVim/Vundle.vim) 是一個插件管理工具 (單然管理工具還有很多)，它可以在 .vimrc 中跟蹤、管理、自動更新插件**

1. 首先透過 git clone 該專案
    ```shell=
    # clone
    # 目標路徑為 ~/.vim/bundle/Vundle.vim

    git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    ```
    > ![](https://i.imgur.com/FGXnzk2.png)

2. User 目錄下建造 `.vimrc` 文件
    ```shell=
    cd ~
    
    # 創建 .vimrc 文件
    touch .vimrc
    ```

3. 配置 `.vimrc` 文件 (參考 GitHub 範例)
    ```shell=
    # 開始編輯
    vim .vimrc
    ```

    ```cmake=
    set nocompatible              " be iMproved, required
    set nu!			      " show line number

    syntax enable
    syntax on
    colorscheme desert

    filetype off                  " required


    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()

    "Plugin 'VundleVim/Vundle.vim'
    Plugin 'gmarik/Vundle.vim'
    Plugin 'majutsushi/tagbar'
    Plugin 'scrooloose/nerdtree'
    Plugin 'w0rp/ale'
    Plugin 'Valloric/YouCompleteMe'
    Plugin 'ludovicchabant/vim-gutentags'

    call vundle#end()            " required
    filetype plugin indent on    " required
    ```
    
4. 開啟 vim，在底行模式下輸入 `PluginInstall`
    > ![](https://i.imgur.com/fFX3sfu.png)

### ctags 工具
* ctags 是 generate tag files for source code，**ctags 工具用於掃描指定 source code，並找出其中包含的語法元素，並將其記錄下來**，方便之後尋找

1. 透過 Apt 安裝 `universal-ctags`
    ```shell=
    sudo apt install universal-ctags
    ```
    > ![](https://i.imgur.com/9nxYT5q.png)

2. 手動生成引所文件 (建立 tags 需要一點時間)
    ```shell=
    # 移動到之前下載 Linux kernel 的地方
    cd ~/Downloads/linux-5.14.13
    
    # 建立 tags
    ctags -R .
    ```
    
3. 開啟 vim 並加載 tags
    ```shell=
    :set tags=tags
    ```

### cscope 工具

1. 透過 Apt 安裝 `cscope`
    ```shell=
    sudo apt install cscope
    ```
    > ![](https://i.imgur.com/0UTCyfc.png)

2. 生成員代碼引索庫
    ```shell=
    cscope -Rbq
    ```
    > ![](https://i.imgur.com/xR4NJE5.png)

### Tagbar 插件

* Tagbar 插件可以替 Source code 生成大綱，包括 類、方法、變量 & 函數名等等，可以選重病快速跳轉到目標位置

1. 在 `.vimrc` 中設定安裝 Tagbar 插件
    
    ```shell=
    Plugin 'majutsushi/tagbar'
    ```
2. 進入 Vim 底行模式，輸入 `:PluginInstall`
3. 為了配置 Tagbar 插件，可在 `.vimrc` 文件中添加以下內容
    ```cmake=
    " Tagbar setting
    let g:tagbar_width=25
    autocmd BufReadPost *.cpp,*.c,*.h,*.cc,*.cxx call tagbar#autoopen()
    ```

### NerdTree 插件
* NerdTree 插件用於顯示樹狀目錄

1. 在 `.vimrc` 中設定安裝 NerdTree 插件
    
    ```shell=
    Plugin 'scrooloose/nerdtree'
    ```
2. 進入 Vim 底行模式，輸入 `:PluginInstall`
3. 為了配置 NerdTree 插件，可在 `.vimrc` 文件中添加以下內容
    ```cmake=
    " NerdTree setting
    autocmd StdinReadPre * let:std_in=1
    autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
    let NERDTreeWinSize=15
    let NERDTreeShowLineNumbers=1
    let NERDTreeAutoCenter=1
    let NERDTreeShowBookmarks=1
    ```

### ale 動態語法檢查 - 插件
* 在 Coding 的時候就自動幫我們檢查與法是否正確 (不必等到編譯期間檢查)

1. 在 `.vimrc` 中設定安裝 動態語法檢查 插件
    
    ```shell=
    Plugin 'w0rp/ale'
    ```
2. 進入 Vim 底行模式，輸入 `:PluginInstall`
3. 為了配置 NerdTree 插件，可在 `.vimrc` 文件中添加以下內容
    ```cmake=
    " ale setting
    let g:ale_sign_column_alway=1
    let g:ale_sign_error=1
    let g:ale_sign_warning='w'
    let g:ale_statusline_formate=[' %d',' %d',' OK']
    let g:ale_echo_msg_format='[%linter%] %code: %%s'
    let g:ale_lint_on_text_changed='normal'
    let g:ale_lint_on_insert_leave=1
    let g:ale_c_gcc_options='-Wall -O2 -std=c99'
    let g:ale_cpp_gcc_options='-Wall -O2 -std=c++14'
    let g:ale_c_cppcheck_options=''
    let g:ale_cpp_cppcheck_options=''
    ```
    > ![](https://i.imgur.com/NuwjWJh.png)

### 自動補齊 - YouCompleteMe
* **YouCompleteMe 也是 Vim Plgin 的工具之一**，它可以幫助我們補齊不足的程式 (就像提示)

:::warning
* Vim 的版本最低要使用 7.4.1578
    ```shell=
    # 查詢 Vim 版本資訊
    vim --version
    ```
    > ![](https://i.imgur.com/pP3HVKk.png)
:::
1. 在 `.vimrc` 中設定安裝 YouCompleteMe 插件
    
    ```shell=
    # .vimrc 檔
    Plugin 'Valloric/YouCompleteMe'
    ```
2. 進入 Vim 底行模式，輸入 `:PluginInstall`

3. 透過 apt 安裝 Pythone3、cmake、build-essential
    ```shell=
    sudo apt install build-essential cmake python3-dev
    ```
    :::info
    * 若有多個 python (你可能之前安裝過 python2，但現在要求要使用 python3)，可以透過 `update-alternatives` 來選擇要使用的 python
    ```shell=
    sudo update-alternatives --config python
    ```
    :::
   
4. 切換到 .vim 目錄下的 `bundle/YouCompleteMe` 並使用 python 執行 `install.py`
    ```shell=
    # 切換到 ~/.vim/bundle/YouCompleteMe
    cd ~/.vim/bundle/YouCompleteMe
    
    git submodule update --init --recursive

    # py 編譯檔案
    python3 install.py --clang-completer
    
    cd ~/.vim/bundle/YouCompleteMe/third_party/ycmd
    
    python3 build.py
    ```

5. 複製 `.ycm_extra_config.py` 到 `~/.vim` 目錄下
    ```shell=
    cp -r ~/.vim/bundle/YouCompleteMe/third_party/ycmd ~/.vim
    ```



6. 為了配置 YouCompleteMe 插件，可在 `.vimrc` 文件中添加以下內容
    ```cmake=
     " YouCompleteMe
     let g:ycm_server_python_interpreter='/usr/bin/python'
     let g:ycm_global_ycm_extra_conf='~.vim/.ycm_extra_conf.py'
    ```
    
    
* 開啟 vim 寫一個簡單的 c 檔案，輸入一半字它就會猜測你要輸入的內容
    > ![](https://i.imgur.com/PBEVK10.png)


### 自動索引 - vim-gutentags

* 在上面我們使用 ctags 的時候都要手動創建 tags，而 **vim-gutentags 是可以自動產生 tags 引索的插件**


1. 在 `.vimrc` 中設定安裝 vim-gutentags 插件
    
    ```shell=
    # .vimrc 檔
    Plugin 'ludovicchabant/vim-gutentags'
    ```
2. 進入 Vim 底行模式，輸入 `:PluginInstall`

3. 為了配置 YouCompleteMe 插件，可在 `.vimrc` 文件中添加以下內容
    ```cmake=
    " vim-gutentags
    let g:gutentags_project_root=['.root','.svn','.git','.hg','.gutentags_project_root']
    let g:futentags_ctas_extra_args=['--field=+niazS','--extra=+q']
    let g:futentags_ctas_extra_args=['--c++-kinds=+px']
    let g:futentags_ctas_extra_args=['--c-kinds=+px']
    ```

## 使用 Vim IDE Loading Linux

https://github.com/torvalds/linux.git



## Appendix & FAQ

:::info
:::

###### tags: `Linux 基礎`
