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