---
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 基礎`