1. 移除vim
sudo?apt-get remove vim vim-runtime gvim
sudo?apt-get remove vim-tiny vim-common vim-gui-common vim-nox
2.安裝vim
sudo apt-get update
sudo apt-get install vim
sudo?apt-get?install?build-essential cmake?python3-dev
3.配置.vimrc
cd ~
vim .vimrc
拷貝一下內容到.vimrc內
"---------------------------------------------------
"? ? ? ? ? ? ? ? Vundle插件管理
"---------------------------------------------------
set nocompatible? ? ? ? ? ? ? " be iMproved, required
filetype off? ? ? ? ? ? ? ? ? " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
Plugin 'Valloric/YouCompleteMe'
" All of your Plugins must be added before the following line
call vundle#end()? ? ? ? ? ? " required
filetype plugin indent on? ? " required
"--------------------------------------------------
"? ? ? ? ? ? ? ? ? ? YCM
"--------------------------------------------------
set runtimepath+=~/.vim/bundle/YouCompleteMe
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
? " YCM 查找定義
let mapleader=','
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
let g:ycm_collect_identifiers_from_tags_files = 1
set completeopt=menu,menuone
let g:ycm_add_preview_to_completeopt = 0? " 關閉函數(shù)原型提示
let g:ycm_show_diagnostics_ui = 0 " 關閉診斷信息
let g:ycm_server_log_level = 'info'
let g:ycm_min_num_identifier_candidate_chars = 2? " 兩個字符觸發(fā) 補全
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 收集
let g:ycm_complete_in_strings=1
noremap <c-z> <NOP>
let g:ycm_key_invoke_completion = '<c-z>'? " YCM 里觸發(fā)語義補全有一個快捷鍵
let g:ycm_max_num_candidates = 15? " 候選數(shù)量
let g:ycm_semantic_triggers =? {
? ? ? ? ? ? ? ? ? ? ? ? \ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
? ? ? ? ? ? ? ? ? ? ? ? \ 'cs,lua,javascript': ['re!\w{2}'],
? ? ? ? ? ? ? ? ? ? ? ? \ }
"----------------------------------------
"? ? ? ? ? ? ? ctags: ctags -R
"----------------------------------------
if filereadable("tags")
? ? ? ? set tags=tags
endif
4. 下載YouCompleteMe
在用戶家目錄下執(zhí)行命令:git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
git clone https://github.com/Valloric/YouCompleteMe.git ~/.vim/bundle/YouCompleteMe
5.1 安裝Youcomplete
cd? ~/.vim/bundle/YouCompleteMe
git submodule update --init --recursive
./install.py --clang-completer
5.2如果遇到libclang-10.0.0-x86_64-unknown-linux-gnu.tar.bz2 下載失敗解決如下:
????進入/etc/resolv.conf。
????修改內容為下
????nameserver 8.8.8.8 #google域名服務器
????nameserver 8.8.4.4 #google域名服務器
????cd? ~/.vim/bundle/YouCompleteMe/third_party/ycmd/clang_archives
????mv libclang-7.0.0-x86_64-unknown-linux-gnu.tar.bz2? libclang-7.0.0-x86_64-unknown-linux-gnu.tar.bz2.old
????wget? https://dl.bintray.com/micbou/libclang/libclang-7.0.0-x86_64-unknown-linux-gnu.tar.bz2
6. 配置ycm_extra_conf.py
路徑與.vimrc中相同 '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'?
添加如下:
# Copyright (C) 2014 Google Inc.
#
# This file is part of ycmd.
#
# ycmd is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ycmd is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.? See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ycmd.? If not, see <http://www.gnu.org/licenses/>.
import os
import ycm_core
# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-Wall',
'-Wextra',
'-Werror',
'-fexceptions',
'-DNDEBUG',
# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
# language to use when compiling headers. So it will guess. Badly. So C++
# headers will be compiled as C headers. You don't want that so ALWAYS specify
# a "-std=<something>".
# For a C project, you would set this to something like 'c99' instead of
# 'c++11'.
'-std=c++11',
# ...and the same thing goes for the magic -x option which specifies the
# language that the files to be compiled are written in. This is mostly
# relevant for c++ headers.
# For a C project, you would set this to 'c' instead of 'c++'.
'-x',
'c++',
'-isystem',
'/usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0',
'-isystem',
'/usr/local/Cellar/gcc/8.2.0/include/c++/8.2.0/x86_64-apple-darwin17.7.0',
'-isystem',
'/usr/include',
'-isystem',
'/usr/local/include',
'/usr/local/lib',
'-isystem',
'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1',
'-isystem',
'/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include'
]
# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags.
compilation_database_folder = ''
if os.path.exists( 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 IsHeaderFile( filename ):
? extension = os.path.splitext( filename )[ 1 ]
? return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
def GetCompilationInfoForFile( filename ):
? # The compilation_commands.json file generated by CMake does not have entries
? # for header files. So we do our best by asking the db for flags for a
? # corresponding source file, if any. If one exists, the flags for that file
? # should be good enough.
? 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 )
# This is the entry point; this function is called by ycmd to produce flags for
# a file.
def FlagsForFile( filename, **kwargs ):
? if not database:
? ? return {
? ? ? 'flags': flags,
? ? ? 'include_paths_relative_to_dir': DirectoryOfThisScript()
? ? }
? compilation_info = GetCompilationInfoForFile( filename )
? if not compilation_info:
? ? return None
? # Bear in mind that compilation_info.compiler_flags_ does NOT return a
? # python list, but a "list-like" StringVec object.
? return {
? ? 'flags': list( compilation_info.compiler_flags_ ),
? ? 'include_paths_relative_to_dir': compilation_info.compiler_working_dir_
? }