VIM 自动代码补全以及函数定义跳转功能 环境ubuntu 16.04,使用YouCompleteMe
标题@[TOC](VIM 自动代码补全以及函数定义跳转功能 环境ubuntu 16.04,使用YouCompleteMe)
Step 0:
Check the installation of ycmd and vim
// An highlighted block
sudo apt-get install ycmd
sudo apt-get install vim
Step 1:
下载YouCompleteMe源码:
// An highlighted block
git clone --recursive git://github.com/Valloric/YouCompleteMe +{SourceDir}
其中 SourceDir = ~/.vim/bundle/YouCompleteMe
Step 2:
- cd 到YouCompleteMe(SourceDir)文件夹
- 源码编译:
// An highlighted block
./install.py --clang-completer
Step 3:配置.vimrc文件:
- cd 到~目录
- 编辑.vimrc文件(.vimrc文件一开始未必存在)
// An highlighted block
vim .vimrc
.vimrc当中的内容编辑为:
" YouCompleteMe
set runtimepath+=~/.vim/bundle/YouCompleteMe
let g:ycm_collect_identifiers_from_tags_files = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 1
let g:syntastic_ignore_files=[".*\.py$"]
let g:ycm_seed_identifiers_with_syntax = 1
let g:ycm_complete_in_comments = 1
let g:ycm_confirm_extra_conf = 0
"let g:ycm_key_list_select_completion = ['<c-n>', '<Down>']
"let g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
let g:ycm_complete_in_comments = 1
let g:ycm_complete_in_strings = 1
let g:ycm_collect_identifiers_from_comments_and_strings = 1
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_show_diagnostics_ui = 0
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" |
nnoremap <c-e> :YcmCompleter GoToDefinitionElseDeclaration<CR>|
let g:ycm_min_num_of_chars_for_completion=1
(Tip:某一行开头为引号的话表示该行注释)
step 4:配置.ycm_extra_conf.py文件:
.ycm_extra_conf.py路径为(配置之前文件未必存在, .ycm_extra_conf.py文件路径跟.vimrc当中 ycm_global_ycm_extra_conf的路径一致):
// An highlighted block
~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py
cd 到该目录:
通过vim编辑:
// An highlighted block
vim .ycm_extra_conf.py
.ycm_extra_conf.py文件当中的内容编辑为:
// An highlighted block
# 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',
'-isystem',
'/usr/include',
'-isystem',
'/usr/local/include',
'-isystem',
'usr/include/c++/5',
"-isystem",
'/usr/include/c++/5.4.0',
'-isystem',
'/usr/local/include/Eigen',
'-isystem',
'/usr/local/include/eigen3'
]
#
# 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_
}
# 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
Tip: 文件包可以根据自己所需添加
Note: 少数vim命令备忘:
函数Definition跳转: Ctrl+e(与配置的.vimrc当中一致)
跳转之后返回: Ctrl+o
vim开子窗口: :new
vim关闭当前子窗口: :close
vim关闭其他子窗口: Ctrl+w+o
vim子窗口之间光标跳转 :Ctrl+w+方向键
vim打开某个文件: :e + 文件路径+文件名
(开多个子窗口方便Coding)
References:
[1]https://blog.csdn.net/xsw164711368/article/details/53719506
[2]https://blog.csdn.net/sinat_25143623/article/details/85721282
上一篇: sqlserver问题