vim-配置教程+原始碼

李柱明發表於2020-11-08


前言

  • 放棄滑鼠,提高效率,這只是 vim 的標配目標
  • 定製自己的編輯器,提高效率 + 花裡胡哨的入門時本文目標
  • IDE相對於編輯器
    • 最大的優勢在於其整合了編譯、除錯、智慧補全、語法高亮、工程管理等軟體開發工具和環境
    • 而這些Vim都可以通過其強大豐富的外掛擴充套件來完成
  • 不建議直接拷貝本文原始碼,除非真的忍不住

參考連結

簡單配置後的vim效果

vim 優點

  1. 模式編輯器
  2. 高度可擴充套件
  3. 高度可定製

vim 配置

  • 這裡提一下 neovim 有興趣的可以瞭解下。
  • 原理:最終還是根據 .vimrc 來配置 vim

vim 配置方法一

  • 參考Github:vimrc
    • 簡略步驟:(linux)
      1. home 目錄建立 .vim_runtime 資料夾
      2. 執行命令 git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
      3. 執行命令 sh ~/.vim_runtime/install_awesome_vimrc.sh
      4. .vimrc 檔案和 .vim_runtime 目錄配置 vim。

vim 配置方法二

  • 直接配置 .vimrc
自動新增檔案頭
  • 一下為識別 .sh 檔案並新增相應檔案頭資訊的原始碼
  • 其它檔案,.c .h .md 等等都可以參考以下原始碼
"==============================================================================
" filetype 檔案識別,新增檔案頭
"==============================================================================
filetype on
autocmd BufNewFile *.sh   exec ":call SetSHTitle()" 
""定義函式SetTitle,自動插入檔案頭 
func SetSHTitle() 
    call setline(1,         "/** @file         ".expand("%"))
    call append(line(".")+0, " *  @brief        簡要說明")
    call append(line(".")+1, " *  @details      詳細說明") 
    call append(line(".")+2, " *  @author       lzm")
    call append(line(".")+3, " *  @date         ".strftime("%Y-%m-%d %H:%M:%S"))  "建立時間
    call append(line(".")+6, " *")
    call append(line(".")+7," */")
    call append(line(".")+8,"")
    call append(line(".")+9,"#!/bin/sh")
    call append(line(".")+10, "")
endfunc 
  • 效果圖
一般設定
  • 按喜好設定+遮蔽
"==============================================================================
" set 一般設定
"==============================================================================
set nocompatible                "不相容vi
syntax enable                   "語法高亮使能
syntax on                       "語法高亮開啟
set hlsearch                    "開啟高亮搜尋
set incsearch                   "輸出字串的同時進行搜尋
set ignorecase                  "搜尋時忽略大小寫
set ruler                       "右下角的狀態列下顯示游標的座標
set showcmd                     "顯示normal模式下的命令
set number                      "顯示行號
set relativenumber              "相對行號
set cmdheight=1                 "命令列高度為1行"
set noshowmode                  "不顯示'-- insert --' 等
set autoindent                  "自動縮排
set smartindent                 "智慧縮排
set cindent                     "c語言縮排
set pastetoggle=<F4>            "系統paste
set mouse=i                     "僅在insert mode 下可使用mouse

set autoread                    "當檔案在外部被改變時, vim自動載入
set showmatch                   "顯示匹配的括號
set matchtime=0                 "顯示匹配的括號的時間,單位:十分之一秒
set t_Co=256                    "vim配色為256色
set cursorline                  "高亮當前游標行
set cursorcolumn                "高亮當前游標列
autocmd InsertEnter * se cul
set shortmess=atI
set scrolloff=3                 "游標移動到buffer的頂部和底部時保持3行距離
set laststatus=2                "指定什麼時候對最後一個視窗顯示狀態條, 2表示永遠有
set cinoptions=g0,:0,N-s,(0     "設定C/C++語言的具體縮排方式, unkown
set tabstop=4                   "讀取到檔案的\t時,解釋的空白長度
set softtabstop=4               "在編輯動作(按tab或backspace鍵)時,所輸入或刪除的空白長度
set shiftwidth=4                "自動縮排時的空白長度
set expandtab                   "將tab轉換成space,檔案中儲存的將會是space
set smarttab
" set list                      "顯示tab鍵為^I, 行為顯示$
set listchars=tab:>-,trail:-    "tab顯示為">---" 行尾多餘的空白字元顯示為"-"
set history=1000                "命令歷史個數
set langmenu=en_US.UTF-8        "選單語系
set helplang=en                 "使用中文文件cn,英文則為en
set autowrite                   "自動儲存, 否則切換buffer,檔案後會會提示沒有儲存
set magic                       "匹配正規表示式時(\m):除了$.*^之外其他正規表示式的元字元都要加反斜槓\
set confirm                     "總是出現確認選項,如執行:qa等命令時
set nobackup                    "vim當覆蓋一個檔案時不保留一個備份
set noswapfile                  "不使用交換空間
set wildmenu                    "補全相關,unkown
set completeopt=longest,menu    "顯示補全列表
set backspace=indent,eol,start  "indent將4個空格縮排當縮排刪除,eol刪除到上一行
set report=0                    "當使用:commands命令時,總是報告檔案的那一行被改變過
set fillchars=vert:\ ,stl:\ ,stlnc:\  "設定多視窗時的視窗間分割線
" set iskeyword+=.                "追加.為判斷一個word
set termencoding=utf-8          "終端使用的字元編碼
set encoding=utf8               "vim內部buffer使用的字元編碼
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030 "依次判斷檔案字元編碼
" set foldmethod=indent         "基於縮排的摺疊
set foldmethod=syntax           "基於語法的摺疊
set nofoldenable                "啟動 vim 時關閉摺疊程式碼
" set nowrap                      "禁止折行
set viminfo+=n~/.cache/vim/.viminfo

let $BASH_ENV="~/.bash_aliases" "增加外部命令的alias
let mapleader = ","             "修改<leader>鍵為','
vnoremap <leader>y "+y

filetype plugin on              "根據檔案型別讀取外掛
filetype indent on              "使用縮排檔案

" 標籤跳轉快捷鍵,在gnome-terminal中無效
" normal no recursive map
" insert no recursive map
nnoremap <C-c> :tabclose<cr>
nnoremap <C-x> :tabonly<cr>
nnoremap <C-k> :tabs<cr>
nnoremap <C-n> :tabnew<cr>
nnoremap <C-h> :tabprevious<cr>
nnoremap <C-l> :tabnext<cr>

" 游標閃爍,在插入模式下為‘|’,在norrmal 模式下為方塊
" 若要不閃爍,則將改為後面的數字
let &t_SI = "\<Esc>[5 q"                     " 6
let &t_SR = "\<Esc>[3 q"                     " 4
let &t_EI = "\<Esc>[1 q"                     " 2
外掛 **
  • 在 linux 平臺下操作

  • 注意採用外掛時,需要對所使用的外掛要有所瞭解,防止一般設定外掛設定衝突

    • imap <C-h> <LEFT>Plugin 'jiangmiao/auto-pairs'
      • imap <C-h> <LEFT>
        • 是在編輯模式時,ctrl+h 為左方向鍵
      • Plugin 'jiangmiao/auto-pairs'
        • 在編輯模式時,會把 ctrl+h 對映為刪除鍵,使得最終效果會為刪除
        • 解決方法,註釋掉就可以了
  • 採用 Vundle 管理外掛

    • 安裝 Vundle
      • 執行命令 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 即可
    • 外掛型別及運用
      1. Github上的外掛
        • 使用格式:Plugin 'vim-scripts/外掛倉庫名'
        • 例子:Plugin 'tpope/vim-fugitive'
      2. Github上 vim-scripts 倉庫的外掛
        • 使用格式:Plugin '外掛名稱'
          • 實際上是 Plugin 'vim-scripts/外掛倉庫名' 只是此處的使用者名稱可以省略
        • 例子:Plugin 'L9'
      3. 由Git支援但不再github上的外掛倉庫
        • 使用格式:Plugin 'git clone 後面的地址''
        • 例子:`Plugin 'git://git.wincent.com/command-t.git'
      4. 本地的Git倉庫(例如自己的外掛)
        • 使用格式:Plugin 'file:///+本地外掛倉庫絕對路徑''
        • 例子:Plugin 'file:///home/gmarik/path/to/plugin'
      5. 外掛在倉庫的子目錄中.
        • 使用格式:正確指定路徑用以設定runtimepath.
        • 例子:外掛在sparkup/vim目錄下 : Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
      6. 如果已經安裝過這個外掛,可利用以下格式避免命名衝突
        • 例子:L9:Plugin 'ascenator/L9', {'name': 'newL9'}
  • 外掛管理原始碼

"==============================================================================
" Vundle start  外掛管理
"==============================================================================
"filetype off                    " 必須的

" 設定包括vundle和初始化相關的runtime path

" 例子+格式開始==================================================
" 外掛的命令放在vundle#begin和vundle#end之間.
" 1.Github上的外掛
" 格式為 Plugin '使用者名稱/外掛倉庫名'
"Plugin 'tpope/vim-fugitive'
" 2.來自 http://vim-scripts.org/vim/scripts.html 的外掛
" Plugin '外掛名稱' 實際上是 Plugin 'vim-scripts/外掛倉庫名' 只是此處的使用者名稱可以省略
"Plugin 'L9'
" 3.由Git支援但不再github上的外掛倉庫 Plugin 'git clone 後面的地址'
"Plugin 'git://git.wincent.com/command-t.git'
" 4.本地的Git倉庫(例如自己的外掛) Plugin 'file:///+本地外掛倉庫絕對路徑'
"Plugin 'file:///home/gmarik/path/to/plugin'
" 5.外掛在倉庫的子目錄中.
" 正確指定路徑用以設定runtimepath. 以下範例外掛在sparkup/vim目錄下
"Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" 6.安裝L9,如果已經安裝過這個外掛,可利用以下格式避免命名衝突
"Plugin 'ascenator/L9', {'name': 'newL9'}
" 例子+格式END ==================================================


set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()                             " 必須 外掛開始==================================================

Plugin 'VundleVim/Vundle.vim'                   " 必須 讓vundle管理外掛版本
Plugin 'Yggdroot/indentLine'                    "縮排指示線
"Plugin 'suan/vim-instant-markdown'             " markdown實時瀏覽
Plugin 'vim-airline/vim-airline'                "美觀介面,powerline
"Plugin 'fatih/vim-go'
" 由Git支援但不再github上的外掛倉庫 Plugin 'git clone 後面的地址'
Plugin 'L9'
Plugin 'terryma/vim-multiple-cursors'   " 多游標輸入
Plugin 'jiangmiao/auto-pairs'                   "自動補全括號對。輸入`[`, 會自動輸入']' "<c-h> 會被對映為 <DELETE>,如需用到,可以註釋掉
"Plugin 'tpope/vim-commentary'                   "註釋外掛:gcc
Plugin 'scrooloose/nerdtree'                    "目錄樹
Plugin 'Valloric/YouCompleteMe'
"Plugin 'rdnetto/YCM-Generator'                  "YouCompleteMe 配置生成器
"Plugin 'vim-scripts/SQLComplete.vim'
"Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}      "html 快捷鍵
Plugin 'Valloric/MatchTagAlways'                "html, xml顯示匹配標籤:<leader>%
Plugin 'docunext/closetag.vim'                  "html, xml閉合標籤,<C-_> 不起作用
Plugin 'godlygeek/tabular'                      "文字對齊::Tab /=  、 :Tab /|
"Plugin 'tpope/vim-fugitive'                     "在vim中可以執行簡單git命令
Plugin 'tpope/vim-surround'                     "方便修改增加括號對
Plugin 'tpope/vim-repeat'
Plugin 'tpope/vim-endwise'                      "在c中補全#if中的#endif等
Plugin 'ctrlpvim/ctrlp.vim'                     "搜尋檔案<C-f>
Plugin 'majutsushi/tagbar'                      "顯示ctags
Plugin 'octol/vim-cpp-enhanced-highlight'       "C++增強高亮
"Plugin 'vim-airline/vim-airline-themes'         "美觀介面,powerline
"Plugin 'ryanoasis/vim-devicons'                 "美化介面
"Plugin 'gorodinskiy/vim-coloresque'             "顏色,如 blue #00f
"Plugin 'will133/vim-dirdiff'                    "可以比較目錄
Plugin 'haya14busa/incsearch.vim'               "同時高亮匹配所有的字元
Plugin 'mhinz/vim-startify'                     "終端執行直接執行vim時顯示的選單介面
Plugin 'mileszs/ack.vim'                        "ag命令

Plugin 'davidhalter/jedi-vim'                   "python
"Plugin 'Shougo/echodoc.vim'                     "顯示命令引數

filetype plugin indent on                       " 必須 載入vim自帶和外掛相應的語法和檔案型別相關指令碼
call vundle#end()                               " 必須 外掛END ==================================================


"filetype plugin on                     " 忽視外掛改變縮排
對映
  • 熱鍵對映
"==============================================================================
" nerdtree
"==============================================================================
map <F2> :NERDTreeToggle<CR>
imap <F2> <ESC> :NERDTreeToggle<CR>

"autocmd vimenter * if !argc() | NERDTree | endif
"autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
"ctrl+h 為左方向鍵
imap <C-h> <LEFT>
"ctrl+l 為右方向鍵
imap <C-l> <RIGHT>
"ctrl+k 為上方向鍵
imap <C-k> <UP>
"ctrl+j為下方向鍵
imap <C-j> <DOWN>
"ctrl+d為刪除鍵
imap <C-d> <DELETE>
YouCompleteMe 外掛
  • YouCompleteMe 外掛配置
"==============================================================================
" YouCompleteMe
"==============================================================================
let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py' "全域性配置檔案
let g:ycm_confirm_extra_conf = 0                        "載入配置檔案時不需要手動確認
let g:ycm_error_symbol = '✗'                            "error 符號
let g:ycm_warning_symbol = '⚠'                          "warning符號
let g:ycm_seed_identifiers_with_syntax = 1              "關鍵字補全
let g:ycm_complete_in_comments = 1                      "在註釋輸入中可以補全
let g:ycm_complete_in_strings = 1                       "在字串輸入中可以補全
let g:ycm_key_invoke_completion = '<C-n>'               "更改手動觸發補全按鍵,預設<C-space>
let g:ycm_collect_identifiers_from_tags_files = 1       "開啟基於tag的補全
let g:ycm_key_list_select_completion = ['<Down>']       "取消'<Tab>'
" let g:ycm_auto_trigger = 0                              "不會自動補全, 需要按下<C-n>
" let g:ycm_semantic_triggers = {}
" let g:ycm_semantic_triggers.c = ['->', '.', ' ', '(', '[', '&',']']

nnoremap <leader>u :YcmCompleter GoToDeclaration<CR>    "跳到宣告處
nnoremap <leader>o :YcmCompleter GoToDefinition<CR>     "跳到定義處
nnoremap <leader>i :YcmCompleter GoToInclude<CR>        "跳到標頭檔案
"nmap <F5> :YcmDiags<CR>                                 "自定義快捷鍵<F5>顯示警告和錯誤的資訊

"let g:ycm_add_preview_to_completeopt = 1                "關閉開啟一個視窗顯示預覽
"let g:ycm_autoclose_preview_window_after_completion = 0 "即自動關閉預覽視窗
"let g:ycm_autoclose_preview_window_after_insertion = 1  "自動關閉預覽視窗在回到normal模式後
"let g:ycm_cache_omnifunc = 0                            "每次重新生成匹配項,禁止快取匹配項

" tagbar
let g:tagbar_ctags_bin = '/usr/bin/ctags'
let g:tagbar_width = 30
map <F3> :TagbarToggle<CR>
imap <F3> <ESC> :TagbarToggle<CR>

" cpp_class_scope_highlight
let g:cpp_class_scope_highlight = 1
let g:cpp_experimental_template_highlight = 1
let c_no_curly_error = 1

" colorscheme
"colorscheme default
" colorscheme monokai
"let g:solarized_termcolors=256
"set background=light                "設定深色的背景色, 該命令需要在systax enable後呼叫
"colorscheme solarized               "設定色彩方案為solarized
其它配置
  • 其它配置
"==============================================================================
" Other
"==============================================================================
let g:airline#extensions#tabline#enabled = 1
if !exists('g:airline_symbols')
    let g:airline_symbols = {}
endif

相關文章