YouCompleteMe


需要配套的.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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM