vim-配置教程+源碼
- 2020 年 11 月 8 日
- 筆記
- /label/code, /label/lzm, /label/vim, 教程集合, 源碼集合
概念
前言
- 放棄鼠標,提高效率,這只是 vim 的標配目標
- 定製自己的編輯器,提高效率 + 花里胡哨的入門時本文目標
- IDE相對於編輯器
- 最大的優勢在於其集成了編譯、調試、智能補全、語法高亮、工程管理等軟件開發工具和環境
- 而這些Vim都可以通過其強大豐富的插件擴展來完成
- 不建議直接拷貝本文源碼,除非真的忍不住
參考鏈接
vim 優點
- 模式編輯器
- 高度可擴展
- 高度可定製
vim 配置
- 這裡提一下 neovim 有興趣的可以了解下。
- 原理:最終還是根據 .vimrc 來配置 vim
vim 配置方法一
- 參考Github:vimrc
- 簡略步驟:(linux)
- 在 home 目錄創建 .vim_runtime 文件夾
- 運行命令
git clone --depth=1 //github.com/amix/vimrc.git ~/.vim_runtime
- 運行命令
sh ~/.vim_runtime/install_awesome_vimrc.sh
- 在 .vimrc 文件和 .vim_runtime 目錄配置 vim。
- 簡略步驟:(linux)
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 //github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
即可
- 運行命令
- 插件類型及運用
- Github上的插件
- 使用格式:
Plugin 'vim-scripts/插件倉庫名'
- 例子:
Plugin 'tpope/vim-fugitive'
- 使用格式:
- Github上 vim-scripts 倉庫的插件
- 使用格式:
Plugin '插件名稱'
- 實際上是
Plugin 'vim-scripts/插件倉庫名'
只是此處的用戶名可以省略
- 實際上是
- 例子:
Plugin 'L9'
- 使用格式:
- 由Git支持但不再github上的插件倉庫
- 使用格式:
Plugin 'git clone 後面的地址''
- 例子:`Plugin ‘git://git.wincent.com/command-t.git’
- 使用格式:
- 本地的Git倉庫(例如自己的插件)
- 使用格式:
Plugin 'file:///+本地插件倉庫絕對路徑''
- 例子:
Plugin 'file:///home/gmarik/path/to/plugin'
- 使用格式:
- 插件在倉庫的子目錄中.
- 使用格式:正確指定路徑用以設置runtimepath.
- 例子:插件在sparkup/vim目錄下 :
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
- 如果已經安裝過這個插件,可利用以下格式避免命名衝突
- 例子:L9:
Plugin 'ascenator/L9', {'name': 'newL9'}
- 例子:L9:
- Github上的插件
- 安裝 Vundle
-
插件管理源碼
"==============================================================================
" Vundle start 插件管理
"==============================================================================
"filetype off " 必須的
" 設置包括vundle和初始化相關的runtime path
" 例子+格式開始==================================================
" 插件的命令放在vundle#begin和vundle#end之間.
" 1.Github上的插件
" 格式為 Plugin '用戶名/插件倉庫名'
"Plugin 'tpope/vim-fugitive'
" 2.來自 //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