天天看點

打造linux下的source insight--YouCompleteMe安裝

1.安裝前準備

sudo apt-get install build-essential cmake

sudo apt-get install python-dev

sudo apt-get install git

2.Vundle的安裝

git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

3.修改.vimrc檔案,以下是我的修改方案

runtime! debian.vim

"設定編碼

set encoding=utf-8

set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936

set fileencodings=utf-8,ucs-bom,chinese

"語言設定

set langmenu=zh_CN.UTF-8

"顯示行号

set nu!

"設定文法高亮

syntax enable

syntax on

"設定配色方案

"colorscheme torte

"可以在buffer的任何地方使用滑鼠

set mouse=a

set selection=exclusive

set selectmode=mouse,key

"高亮顯示比對的括号

set showmatch

"去掉vi一緻性

set nocompatible

"設定縮進

set tabstop=4

set softtabstop=4

set shiftwidth=4

set autoindent

set cindent

if &term=="xterm"

    set t_Co=8

    set t_Sb=^[[4%dm

    set t_Sf=^[[3%dm

endif

set nocompatible

filetype off

set rtp+=~/.vim/bundle/Vundle.vim

call vundle#rc()

Bundle 'gmarik/vundle'

Bundle 'taglist.vim'

Bundle 'Valloric/YouCompleteMe'

Bundle 'Valloric/ListToggle'

Bundle 'scrooloose/syntastic'

filetype plugin indent on

""""""""""""YCM""""""""""""""""""""

let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py'

let g:ycm_collect_identifiers_from_tags_files = 1

let g:ycm_seed_identifiers_with_syntax = 1

let g:ycm_confirm_extra_conf = 0

"Settings for tagslist

let Tlist_Use_Right_Window = 1 "讓taglist視窗出現在Vim的右邊

let Tlist_File_Fold_Auto_Close = 1

"當同時顯示多個檔案中的tag時,設定為1,可使taglist隻顯示目前檔案tag,其它檔案的tag都被折疊起來。

let Tlist_Show_One_File = 1 "隻顯示一個檔案中的tag,預設為顯示多個

let Tlist_Sort_Type ='name' "Tag的排序規則,以名字排序。預設是以在檔案中出現的順序排序

let Tlist_GainFocus_On_ToggleOpen = 1 "Taglist視窗打開時,立刻切換為有焦點狀态

let Tlist_Exit_OnlyWindow = 1 "如果taglist視窗是最後一個視窗,則退出vim

let Tlist_WinWidth = 32 "設定窗體寬度為32,可以根據自己喜好設定

4.插件安裝

打開vim,并運作:PluginInstall

5.安裝YouCompleteMe插件

cd ~/.vim/bundle/YouCompleteMe/

./install.sh --clang-completer

6.如果~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py找不到檔案

需要自己建立目錄和相關檔案,.ycm_extra_conf.py如下

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',

'-Wc++98-compat',

'-Wno-long-long',

'-Wno-variadic-macros',

'-fexceptions',

'-DNDEBUG',

# You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM

# source code needs it.

'-DUSE_CLANG_COMPLETER',

# 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',

'../BoostParts',

'-isystem',

# This path will only work on OS X, but extra paths that don't exist are not

# harmful

'/System/Library/Frameworks/Python.framework/Headers',

'-isystem',

'../llvm/include',

'-isystem',

'../llvm/tools/clang/include',

'-I',

'.',

'-I',

'./ClangCompleter',

'-isystem',

'./tests/gmock/gtest',

'-isystem',

'./tests/gmock/gtest/include',

'-isystem',

'./tests/gmock',

'-isystem',

'./tests/gmock/include',

'-isystem',

'/usr/include',

'-isystem',

'/usr/local/include',

'-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

#

# You can get CMake to generate this file for you by adding:

#   set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )

# to your CMakeLists.txt file.

#

# Most projects will NOT need to set this to anything; you can just change the

# 'flags' list of compilation flags. Notice that YCM itself uses that approach.

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 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 ):

  # 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 )

def FlagsForFile( filename, **kwargs ):

  if database:

    # Bear in mind that compilation_info.compiler_flags_ does NOT return a

    # python list, but a "list-like" StringVec object

    compilation_info = GetCompilationInfoForFile( filename )

    if not compilation_info:

      return None

    final_flags = MakeRelativePathsInFlagsAbsolute(

      compilation_info.compiler_flags_,

      compilation_info.compiler_working_dir_ )

    # NOTE: This is just for YouCompleteMe; it's highly likely that your project

    # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR

    # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.

    try:

      final_flags.remove( '-stdlib=libc++' )

    except ValueError:

      pass

  else:

    relative_to = DirectoryOfThisScript()

    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )

  return {

    'flags': final_flags,

    'do_cache': True

  }

繼續閱讀