欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VIM 自动代码补全以及函数定义跳转功能 环境ubuntu 16.04,使用YouCompleteMe

程序员文章站 2024-03-21 17:36:28
...

标题@[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:

  1. cd 到YouCompleteMe(SourceDir)文件夹
  2. 源码编译:
// An highlighted block
	./install.py --clang-completer

Step 3:配置.vimrc文件:

  1. cd 到~目录
  2. 编辑.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

相关标签: vim ubuntu linux

上一篇: sqlserver问题

下一篇: