需要配套的.vimrc
;sw:.h與.cpp切換
Issue:YouCompleteMe unavailable no module named future
cd .vim/Vundle/YouCompleteMe
git submodule update --init --recursive
Issue:youcompleteme unavailable: no module named future
sudo apt-get install python-future
Issue:linux 解決找不到python庫無法找到的問題Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
sudo apt-get install python-dev python3-dev
下載libclang
sudo apt-get install llvm-3.9 clang-3.9 libclang-3.9-dev libboost-all-dev
編譯構建ycm_core庫
cd ~/downloads/
mkdir ycm_build
cd ycm_build
cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DPATH_TO_LLVM_ROOT=~/downloads/clang+llvm/ .\
~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
cmake --build . --target ycm_core
編譯YouCompleteMe
$ cd ~/.vim/bundle/YouCompleteMe/
$ ./install.sh --clang-completer
cd ~.vim/plugged/YouCompleteMe (vim) cd ~/.local/share/nvim/site/plugged/YouCompleteMe (neovim) :) ./install.py
配置.vimrc
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
import os import ycm_core flags = [ '-std=c++11', '-O0', '-Werror', '-Weverything', '-Wno-documentation', '-Wno-deprecated-declarations', '-Wno-disabled-macro-expansion', '-Wno-float-equal', '-Wno-c++98-compat', '-Wno-c++98-compat-pedantic', '-Wno-global-constructors', '-Wno-exit-time-destructors', '-Wno-missing-prototypes', '-Wno-padded', '-Wno-old-style-cast', '-Wno-weak-vtables', '-x', 'c++', '-I', '.', '-isystem', '/usr/include/', ] compilation_database_folder = '' if compilation_database_folder: database = ycm_core.CompilationDatabase( compilation_database_folder ) else: database = None SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ] def DirectoryOfThisScript(): return os.path.dirname( os.path.abspath( __file__ ) ) def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): if not working_directory: return list( flags ) new_flags = [] make_next_absolute = False path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] for flag in flags: new_flag = flag if make_next_absolute: make_next_absolute = False if not flag.startswith( '/' ): new_flag = os.path.join( working_directory, flag ) for path_flag in path_flags: if flag == path_flag: make_next_absolute = True break if flag.startswith( path_flag ): path = flag[ len( path_flag ): ] new_flag = path_flag + os.path.join( working_directory, path ) break if new_flag: new_flags.append( new_flag ) return new_flags def IsHeaderFile( filename ): extension = os.path.splitext( filename )[ 1 ] return extension in [ '.h', '.hxx', '.hpp', '.hh' ] def GetCompilationInfoForFile( filename ): if IsHeaderFile( filename ): basename = os.path.splitext( filename )[ 0 ] for extension in SOURCE_EXTENSIONS: replacement_file = basename + extension if os.path.exists( replacement_file ): compilation_info = database.GetCompilationInfoForFile( replacement_file ) if compilation_info.compiler_flags_: return compilation_info return None return database.GetCompilationInfoForFile( filename ) def FlagsForFile( filename, \*\*kwargs ): if database: compilation_info = GetCompilationInfoForFile( filename ) if not compilation_info: return None final_flags = MakeRelativePathsInFlagsAbsolute( compilation_info.compiler_flags_, compilation_info.compiler_working_dir_ ) else: relative_to = DirectoryOfThisScript() final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) return { 'flags': final_flags, 'do_cache': True }
.vimrc
" 更新時間:2016-03-30 12:15:21
" 定義快捷鍵的前綴,即 <Leader>
let mapleader=";"
" >>
" 文件類型偵測
" 開啟文件類型偵測
filetype on
" 根據偵測到的不同類型加載對應的插件
filetype plugin on
" <<
" >>
" vim 自身(非插件)快捷鍵
" 定義快捷鍵到行首和行尾
nmap LB 0
nmap LE $
" 設置快捷鍵將選中文本塊復制至系統剪貼板
vnoremap <Leader>y "+y
" 設置快捷鍵將系統剪貼板內容粘貼至vim
nmap <Leader>p "+p
" 定義快捷鍵關閉當前分割窗口
nmap <Leader>q :q<CR>
" 定義快捷鍵保存當前窗口內容
nmap <Leader>w :w<CR>
" 定義快捷鍵保存所有窗口內容並退出 vim
nmap <Leader>WQ :wa<CR>:q<CR>
" 不做任何保存,直接退出 vim
nmap <Leader>Q :qa!<CR>
" 設置快捷鍵遍歷子窗口
" 依次遍歷
nnoremap nw <C-W><C-W>
" 跳轉至右方的窗口
nnoremap <Leader>lw <C-W>l
" 跳轉至方的窗口
nnoremap <Leader>hw <C-W>h
" 跳轉至上方的子窗口
nnoremap <Leader>kw <C-W>k
" 跳轉至下方的子窗口
nnoremap <Leader>jw <C-W>j
" 定義快捷鍵在結對符之間跳轉
nmap <Leader>M %
" <<
" 讓配置變更立即生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC
" >>
" 其他
" 開啟實時搜索功能
set incsearch
" 搜索時大小寫不敏感
set ignorecase
" 關閉兼容模式
set nocompatible
" vim 自身命令行模式智能補全
set wildmenu
" <<
" >>>>
" 插件安裝
" vundle 環境設置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必須位於 vundle#begin() 和 vundle#end() 之間
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tomasr/molokai'
Plugin 'vim-scripts/phd'
Plugin 'Lokaltog/vim-powerline'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'derekwyatt/vim-fswitch'
Plugin 'kshenoy/vim-signature'
Plugin 'vim-scripts/BOOKMARKS--Mark-and-Highlight-Full-Lines'
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/indexer.tar.gz'
Plugin 'vim-scripts/DfrankUtil'
Plugin 'vim-scripts/vimprj'
Plugin 'dyng/ctrlsf.vim'
Plugin 'terryma/vim-multiple-cursors'
Plugin 'scrooloose/nerdcommenter'
Plugin 'vim-scripts/DrawIt'
Plugin 'SirVer/ultisnips'
Plugin 'Valloric/YouCompleteMe'
Plugin 'derekwyatt/vim-protodef'
Plugin 'scrooloose/nerdtree'
Plugin 'fholgado/minibufexpl.vim'
Plugin 'gcmt/wildfire.vim'
Plugin 'sjl/gundo.vim'
Plugin 'Lokaltog/vim-easymotion'
Plugin 'suan/vim-instant-markdown'
Plugin 'lilydjwg/fcitx.vim'
" 插件列表結束
call vundle#end()
filetype plugin indent on
" <<<<
" 配色方案
set background=dark
colorscheme solarized
"colorscheme molokai
"colorscheme phd
" >>
" 營造專注氣氛
" 禁止光標閃爍
set gcr=a:block-blinkon0
" 禁止顯示滾動條
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止顯示菜單和工具條
set guioptions-=m
set guioptions-=T
" 將外部命令 wmctrl 控制窗口最大化的命令行參數封裝成一個 vim 的函數
fun! ToggleFullscreen()
call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
" 全屏開/關快捷鍵
map <silent> <F11> :call ToggleFullscreen()<CR>
"" 啟動 vim 時自動全屏
"autocmd VimEnter * call ToggleFullscreen()
" <<
" >>
" 輔助信息
" 總是顯示狀態欄
set laststatus=2
" 顯示光標當前位置
set ruler
" 開啟行號顯示
set number
" 高亮顯示當前行/列
set cursorline
set cursorcolumn
" 高亮顯示搜索結果
set hlsearch
" <<
" >>
" 其他美化
" 設置 gvim 顯示字體
set guifont=YaHei\ Consolas\ Hybrid\ 10.5
" 禁止折行
set nowrap
" 設置狀態欄主題風格
let g:Powerline_colorscheme='solarized256'
" <<
" >>
" 語法分析
" 開啟語法高亮功能
syntax enable
" 允許用指定語法高亮配色方案替換默認方案
syntax on
" <<
" >>
" 縮進
" 自適應不同語言的智能縮進
filetype indent on
" 將制表符擴展為空格
set expandtab
" 設置編輯時制表符占用空格數
set tabstop=4
" 設置格式化時制表符占用空格數
set shiftwidth=4
" 讓 vim 把連續數量的空格視為一個制表符
set softtabstop=4
" 縮進可視化插件 Indent Guides
" 隨 vim 自啟動
let g:indent_guides_enable_on_vim_startup=1
" 從第二層開始可視化顯示縮進
let g:indent_guides_start_level=2
" 色塊寬度
let g:indent_guides_guide_size=1
" 快捷鍵 i 開/關縮進可視化
nmap <silent> <Leader>i <Plug>IndentGuidesToggle
" <<
" >>
" 代碼折疊
" 基於縮進或語法進行代碼折疊
"set foldmethod=indent
set foldmethod=syntax
" 啟動 vim 時關閉折疊代碼
set nofoldenable
" <<
" >>
" 接口與實現快速切換
" *.cpp 和 *.h 間切換
nmap <silent> <Leader>sw :FSHere<cr>
" <<
" >>
" 代碼收藏
" 自定義 vim-signature 快捷鍵
let g:SignatureMap = {
\ 'Leader' : "m",
\ 'PlaceNextMark' : "m,",
\ 'ToggleMarkAtLine' : "m.",
\ 'PurgeMarksAtLine' : "m-",
\ 'DeleteMark' : "dm",
\ 'PurgeMarks' : "mda",
\ 'PurgeMarkers' : "m<BS>",
\ 'GotoNextLineAlpha' : "']",
\ 'GotoPrevLineAlpha' : "'[",
\ 'GotoNextSpotAlpha' : "`]",
\ 'GotoPrevSpotAlpha' : "`[",
\ 'GotoNextLineByPos' : "]'",
\ 'GotoPrevLineByPos' : "['",
\ 'GotoNextSpotByPos' : "mn",
\ 'GotoPrevSpotByPos' : "mp",
\ 'GotoNextMarker' : "[+",
\ 'GotoPrevMarker' : "[-",
\ 'GotoNextMarkerAny' : "]=",
\ 'GotoPrevMarkerAny' : "[=",
\ 'ListLocalMarks' : "ms",
\ 'ListLocalMarkers' : "m?"
\ }
" <<
" >>
" 標簽列表
" 設置 tagbar 子窗口的位置出現在主編輯區的左邊
let tagbar_left=1
" 設置顯示/隱藏標簽列表子窗口的快捷鍵。速記:identifier list by tag
nnoremap <Leader>ilt :TagbarToggle<CR>
" 設置標簽子窗口的寬度
let tagbar_width=32
" tagbar 子窗口中不顯示冗余幫助信息
let g:tagbar_compact=1
" 設置 ctags 對哪些代碼標識符生成標簽
let g:tagbar_type_cpp = {
\ 'ctagstype' : 'c++',
\ 'kinds' : [
\ 'c:classes:0:1',
\ 'd:macros:0:1',
\ 'e:enumerators:0:0',
\ 'f:functions:0:1',
\ 'g:enumeration:0:1',
\ 'l:local:0:1',
\ 'm:members:0:1',
\ 'n:namespaces:0:1',
\ 'p:functions_prototypes:0:1',
\ 's:structs:0:1',
\ 't:typedefs:0:1',
\ 'u:unions:0:1',
\ 'v:global:0:1',
\ 'x:external:0:1'
\ ],
\ 'sro' : '::',
\ 'kind2scope' : {
\ 'g' : 'enum',
\ 'n' : 'namespace',
\ 'c' : 'class',
\ 's' : 'struct',
\ 'u' : 'union'
\ },
\ 'scope2kind' : {
\ 'enum' : 'g',
\ 'namespace' : 'n',
\ 'class' : 'c',
\ 'struct' : 's',
\ 'union' : 'u'
\ }
\ }
" <<
" >>
" 代碼導航
" 基於標簽的代碼導航
" 設置插件 indexer 調用 ctags 的參數
" 默認 --c++-kinds=+p+l,重新設置為 --c++-kinds=+l+p+x+c+d+e+f+g+m+n+s+t+u+v
" 默認 --fields=+iaS 不滿足 YCM 要求,需改為 --fields=+iaSl
let g:indexer_ctagsCommandLineOptions="--c++-kinds=+l+p+x+c+d+e+f+g+m+n+s+t+u+v --fields=+iaSl --extra=+q"
" 正向遍歷同名標簽
nmap <Leader>tn :tnext<CR>
" 反向遍歷同名標簽
nmap <Leader>tp :tprevious<CR>
" 基於語義的代碼導航
nnoremap <leader>jc :YcmCompleter GoToDeclaration<CR>
" 只能是 #include 或已打開的文件
nnoremap <leader>jd :YcmCompleter GoToDefinition<CR>
" <<
" >>
" 查找
" 使用 ctrlsf.vim 插件在工程內全局查找光標所在關鍵字,設置快捷鍵。快捷鍵速記法:search in project
nnoremap <Leader>sp :CtrlSF<CR>
" <<
" >>
" 內容替換
" 快捷替換
let g:multi_cursor_next_key='<S-n>'
let g:multi_cursor_skip_key='<S-k>'
" 精准替換
" 替換函數。參數說明:
" confirm:是否替換前逐一確認
" wholeword:是否整詞匹配
" replace:被替換字符串
function! Replace(confirm, wholeword, replace)
wa
let flag = ''
if a:confirm
let flag .= 'gec'
else
let flag .= 'ge'
endif
let search = ''
if a:wholeword
let search .= '\<' . escape(expand('<cword>'), '/\.*$^~[') . '\>'
else
let search .= expand('<cword>')
endif
let replace = escape(a:replace, '/\&~')
execute 'argdo %s/' . search . '/' . replace . '/' . flag . '| update'
endfunction
" 不確認、非整詞
nnoremap <Leader>R :call Replace(0, 0, input('Replace '.expand('<cword>').' with: '))<CR>
" 不確認、整詞
nnoremap <Leader>rw :call Replace(0, 1, input('Replace '.expand('<cword>').' with: '))<CR>
" 確認、非整詞
nnoremap <Leader>rc :call Replace(1, 0, input('Replace '.expand('<cword>').' with: '))<CR>
" 確認、整詞
nnoremap <Leader>rcw :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
nnoremap <Leader>rwc :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
" <<
" 模板補全
" UltiSnips 的 tab 鍵與 YCM 沖突,重新設定
let g:UltiSnipsSnippetDirectories=["mysnippets"]
let g:UltiSnipsExpandTrigger="<leader><tab>"
let g:UltiSnipsJumpForwardTrigger="<leader><tab>"
let g:UltiSnipsJumpBackwardTrigger="<leader><s-tab>"
" >>
" YCM 補全
" YCM 補全菜單配色
" 菜單
highlight Pmenu ctermfg=2 ctermbg=3 guifg=#005f87 guibg=#EEE8D5
" 選中項
highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#AFD700 guibg=#106900
" 補全功能在注釋中同樣有效
let g:ycm_complete_in_comments=1
" 允許 vim 加載 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
" 開啟 YCM 標簽補全引擎
let g:ycm_collect_identifiers_from_tags_files=0
"" 引入 C++ 標准庫 tags
"set tags+=/data/misc/software/app/vim/stdcpp.tags
"set tags+=/data/misc/software/app/vim/sys.tags
" YCM 集成 OmniCppComplete 補全引擎,設置其快捷鍵
inoremap <leader>; <C-x><C-o>
" 補全內容不以分割子窗口形式出現,只顯示補全列表
set completeopt-=preview
" 從第一個鍵入字符就開始羅列匹配項
let g:ycm_min_num_of_chars_for_completion=1
" 禁止緩存匹配項,每次都重新生成匹配項
let g:ycm_cache_omnifunc=0
" 語法關鍵字補全
let g:ycm_seed_identifiers_with_syntax=1
" <<
" >>
" 由接口快速生成實現框架
" 成員函數的實現順序與聲明順序一致
let g:disable_protodef_sorting=1
" <<
" >>
" 庫信息參考
" 啟用:Man命令查看各類man信息
source $VIMRUNTIME/ftplugin/man.vim
" 定義:Man命令查看各類man信息的快捷鍵
nmap <Leader>man :Man 3 <cword><CR>
" <<
" >>
" 工程文件瀏覽
" 使用 NERDTree 插件查看工程文件。設置快捷鍵,速記:file list
nmap <Leader>fl :NERDTreeToggle<CR>
" 設置 NERDTree 子窗口寬度
let NERDTreeWinSize=22
" 設置 NERDTree 子窗口位置
let NERDTreeWinPos="right"
" 顯示隱藏文件
let NERDTreeShowHidden=1
" NERDTree 子窗口中不顯示冗余幫助信息
let NERDTreeMinimalUI=1
" 刪除文件時自動刪除文件對應 buffer
let NERDTreeAutoDeleteBuffer=1
" <<
" >>
" 多文檔編輯
" 顯示/隱藏 MiniBufExplorer 窗口
map <Leader>bl :MBEToggle<cr>
" buffer 切換快捷鍵
map <C-Tab> :MBEbn<cr>
map <C-S-Tab> :MBEbp<cr>
" <<
" >>
" 環境恢復
" 設置環境保存項
set sessionoptions="blank,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"
" 保存 undo 歷史。必須先行創建 .undo_history/
set undodir=~/.undo_history/
set undofile
" 保存快捷鍵
"map <leader>ss :mksession! my.vim<cr> :wviminfo! my.viminfo<cr>
map <leader>ss :mksession! my.vim<cr>
" 恢復快捷鍵
"map <leader>rs :source my.vim<cr> :rviminfo my.viminfo<cr>
map <leader>rs :source my.vim<cr>
" <<
" 設置快捷鍵實現一鍵編譯及運行
nmap <Leader>m :wa<CR> :cd build/<CR> :!rm -rf main<CR> :!cmake CMakeLists.txt<CR>:make<CR><CR> :cw<CR> :cd ..<CR>
nmap <Leader>g :wa<CR>:cd build/<CR>:!rm -rf main<CR>:!cmake CMakeLists.txt<CR>:make<CR><CR>:cw<CR>:cd ..<CR>:!build/main<CR>
" >>
" 快速選中結對符內的文本
" 快捷鍵
map <SPACE> <Plug>(wildfire-fuel)
vmap <S-SPACE> <Plug>(wildfire-water)
" 適用於哪些結對符
let g:wildfire_objects = ["i'", 'i"', "i)", "i]", "i}", "i>", "ip"]
" <<
" 調用 gundo 樹
nnoremap <Leader>ud :GundoToggle<CR>
" vundle 環境設置
8 filetype off
9 set rtp+=~/.vim/bundle/Vundle.vim
10 call vundle#begin()
11 Plugin 'VundleVIm/Vundle.vim'
12 Plugin 'Valloric/YouCompleteMe'
13 call vundle#end()
14 filetype plugin indent on
