LoginSignup
26
21

More than 5 years have passed since last update.

vim-clang でC/C++のコードを補完する(入力時に自動表示).

Last updated at Posted at 2016-04-23

はじめに

素人です.Vim でC/C++のコードを補完する手順をメモしておきます.C/C++の補完プラグインをclang_completeからvim-clangに乗り換えたの記事を主に参考にさせていただきました.

構文解釈には高速と言われるC++コンパイラclang派生のclang-formatを利用し,Vim側からvim-clangを経由させて使用するようです.

clangのインストール

当たり前ですが,これが入っていないとモジュールがないって怒られます.

sudo apt-get clang-3.5
sudo apt-get clang-format-3.5

プラグインのインストール

vim-clangを経由して候補を検索します.自動補完はneocompleteを使います.
neocompleteを使って非同期で表示させるので,vimprocを使います.念の為,書いておきます.

NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'Shougo/vimproc.vim', {
            \ 'build' : {
            \ 'windows' : 'make -f make_mingw32.mak',
            \ 'cygwin' : 'make -f make_cygwin.mak',
            \ 'mac' : 'make -f make_mac.mak',
            \ 'unix' : 'make -f make_unix.mak',
            \ },
            \ }
NeoBundle 'justmao945/vim-clang'
NeoBundle 'Shougo/neoinclude.vim'

.vimrcの設定

C/C++の補完プラグインをclang_completeからvim-clangに乗り換えたを盛大に真似させて頂いております.感謝です.

" 'Shougo/neocomplete.vim' {{{
let g:neocomplete#enable_at_startup = 1
if !exists('g:neocomplete#force_omni_input_patterns')
        let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_overwrite_completefunc = 1
let g:neocomplete#force_omni_input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
let g:neocomplete#force_omni_input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'
"""}}}

" 'justmao945/vim-clang' {{{

" disable auto completion for vim-clanG
let g:clang_auto = 0
let g:clang_complete_auto = 0
let g:clang_auto_select = 0
let g:clang_use_library = 1

" default 'longest' can not work with neocomplete
let g:clang_c_completeopt   = 'menuone'
let g:clang_cpp_completeopt = 'menuone'

if executable('clang-3.6')
    let g:clang_exec = 'clang-3.6'
elseif executable('clang-3.5')
    let g:clang_exec = 'clang-3.5'
elseif executable('clang-3.4')
    let g:clang_exec = 'clang-3.4'
else
    let g:clang_exec = 'clang'
endif

if executable('clang-format-3.6')
    let g:clang_format_exec = 'clang-format-3.6'
elseif executable('clang-format-3.5')
    let g:clang_format_exec = 'clang-format-3.5'
elseif executable('clang-format-3.4')
    let g:clang_format_exec = 'clang-format-3.4'
else
    let g:clang_exec = 'clang-format'
endif

let g:clang_c_options = '-std=c11'
let g:clang_cpp_options = '-std=c++11 -stdlib=libc++'

" }}}

おわりに

force_omni_input_patterns の規約を理解していませんが,とりあえずこれでそれっぽく補完されているので,良しとしておきます..

参考文献

26
21
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21