2013-08-10 17 views
44

Tôi đang sử dụng cú pháp trong dự án C++ 11 của mình. Khi tôi chỉnh sửa trong vim, và lưu (: w) plugin cú pháp cho tôi lỗi trên mọi danh sách khởi tạo {} và cho mỗi vòng lặp rõ ràng là C++ 11 tính năng mà nó thiếu.làm thế nào để thêm hỗ trợ C++ 11 vào plugin cú pháp vim?

Tôi đã cài đặt bằng cách sử dụng tác nhân gây bệnh.

Dưới đây là hai ví dụ về các lỗi Tôi nhận được trên danh sách khởi tạo và cho mỗi vòng (cả C++ 11 mà biên dịch tốt):

error on initializer lists error on for each loop

+1

Đầu ra của lệnh ': echo b: clang_user_options' từ bộ đệm thuộc dự án là gì? Nếu giả định của bạn là chính xác, sẽ không có chuỗi con '-std = C++'. – xaizek

+0

Đầu ra của ': echo b: clang_user_options' là' -I/usr/include -std = C++ 11 -stdlib = libC++ '. Vì vậy, tôi không hiểu tại sao tôi nhận được các lỗi liên quan đến các danh sách khởi tạo và cho mỗi vòng lặp. Tôi sẽ thêm một lỗi ví dụ vào bài đăng chính. – Carneiro

+0

Chỉ ra điều này là ** không ** clang_complete, đây là cú pháp. Tôi sẽ cập nhật bài đăng và câu trả lời. – Carneiro

Trả lời

80

Hóa ra ++ Linter (cú pháp C checker) của cú pháp có nhiều tùy chọn có thể được đặt trên .vimrc của bạn (không may, tôi muốn nó là dự án cụ thể, như giải pháp .clang_complete).

Để kích hoạt C++ 11 tiêu chuẩn và sử dụng ++ thư viện libc với kêu vang (đó là những gì dự án của tôi đang sử dụng) tôi đã thêm các dòng sau vào tôi ~/vimrc

let g:syntastic_cpp_compiler = 'clang++' 
let g:syntastic_cpp_compiler_options = ' -std=c++11 -stdlib=libc++' 

nó hiện đang làm việc đẹp mắt.

+0

Khi tôi kiểm tra clang ++ và g ++ tùy chọn là giống hệt nhau, tôi thay thế "clang ++" bằng "g ++", nhưng nó vẫn không hoạt động – rafee

+0

Tôi không nghĩ bạn có thể chạy g ++ với -stdlib = libC++. – Carneiro

+0

Tôi đã thử mà không có -stdlib = libC++ quá, nhưng điều đó đã không thành công hoặc – rafee

0

Nếu bạn sử dụng YouCompleteMe ngoài Cú pháp, bạn cần thay đổi tệp .ycm_extra_conf.py của mình. Sepcifically thay đổi '-WC++ 98-compat' thành '-WnoC++ 98-compat'.

Tôi không phải tự thay đổi cài đặt Syntastic, mặc dù có thể là do tôi đang sử dụng tệp compile_commands.json.

via here.

4

Tôi đang đối mặt với cùng một vấn đề và Tôi nhấn mạnh để xử lý C++ 98 và C++ 11 riêng biệt. dưới đây là giải pháp của tôi:

tạo các tập tin có tên gcc.vim dưới bó/syntastic/syntax_checkers/cpp11/ và sao chép những với nó:

"============================================================================ 
"File:  cpp11.vim 
"Description: Syntax checking plugin for syntastic.vim 
"Maintainer: Gregor Uhlenheuer <kongo2002 at gmail dot com> 
"License:  This program is free software. It comes without any warranty, 
"    to the extent permitted by applicable law. You can redistribute 
"    it and/or modify it under the terms of the Do What The Fuck You 
"    Want To Public License, Version 2, as published by Sam Hocevar. 
"    See http://sam.zoy.org/wtfpl/COPYING for more details. 
" 
"============================================================================ 

if exists('g:loaded_syntastic_cpp11_gcc_checker') 
    finish 
endif 
let g:loaded_syntastic_cpp11_gcc_checker = 1 

if !exists('g:syntastic_cpp11_compiler') 
    let g:syntastic_cpp11_compiler = executable('g++') ? 'g++' : 'clang++' 
endif 

if !exists('g:syntastic_cpp11_compiler_options') 
    let g:syntastic_cpp11_compiler_options = '-std=c++11' 
endif 

let s:save_cpo = &cpo 
set cpo&vim 

function! SyntaxCheckers_cpp11_gcc_IsAvailable() dict 
    return executable(expand(g:syntastic_cpp11_compiler)) 
endfunction 

function! SyntaxCheckers_cpp11_gcc_GetLocList() dict 
    return syntastic#c#GetLocList('cpp11', 'gcc', { 
     \ 'errorformat': 
     \  '%-G%f:%s:,' . 
     \  '%f:%l:%c: %trror: %m,' . 
     \  '%f:%l:%c: %tarning: %m,' . 
     \  '%f:%l:%c: %m,'. 
     \  '%f:%l: %trror: %m,'. 
     \  '%f:%l: %tarning: %m,'. 
     \  '%f:%l: %m', 
     \ 'main_flags': '-x c++ -fsyntax-only', 
     \ 'header_flags': '-x c++', 
     \ 'header_names': '\m\.\(h\|hpp\|hh\)$' }) 
endfunction 

call g:SyntasticRegistry.CreateAndRegisterChecker({ 
    \ 'filetype': 'cpp11', 
    \ 'name': 'gcc' }) 

let &cpo = s:save_cpo 
unlet s:save_cpo 

" vim: set et sts=4 sw=4: 

mà sẽ làm cho kiểm tra gcc sẵn (muốn khác kiểm tra? bạn có thể làm những điều tương tự tôi đã làm cho chính mình) cho các tập tin với & filetype == 'cpp11' trong vim. làm thế nào để làm cho các tập tin của bạn tự động recongnized như cpp11 filetype trong vim? chỉ cần tạo file có tên ext_detect.vim dưới ~/.vim/ftdetect/ với các nội dung sau đây:

au bufnewfile,bufread *.cpp11 set ft=cpp11 
au bufnewfile,bufread *.cppx set ft=cpp11 

bằng cách này, bạn có thể xử lý các tập tin * .cpp của bạn như C++ 98 tiêu chuẩn và * .cpp11 hoặc * .cppx là tiêu chuẩn C++ 11 riêng biệt, không chỉ kiểm tra cú pháp, mà còn làm nổi bật cú pháp (nếu bạn cần hỗ trợ tô sáng cú pháp cpp11, this vim plugin sẽ hữu ích, mặc dù không hoàn hảo).

4

Nó có tùy chọn cụ thể của dự án, như các giải pháp .clang_complete

Bạn có thể đặt đường dẫn đến file g: syntastic_cpp_config_file và g: syntastic_c_config_file. Mặc định là .syntastic_cpp_config cho C++.Đặt tập tin trong thư mục gốc của các tùy chọn dự án và trình biên dịch bên trong nó (một cho mỗi dòng)

cho details

0

Nếu bạn sử dụng YouCompleteMe, có lẽ bạn nên thay đổi' .ycm_extra_conf.py'.only thay đổi cờ: (file đường dẫn ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py);

flags = [ 
'-std=c++11', 
'-O0', 
'-Werror', 
'-Weverything', 
'-Wno-documentation', 
'-Wno-deprecated-declarations', 
'-Wno-disabled-macro-expansion', 
'-Wno-float-equal', 
'-Wno-c++98-compat', 
'-Wno-c++98-compat-pedantic', 
'-Wno-global-constructors', 
'-Wno-exit-time-destructors', 
'-Wno-missing-prototypes', 
'-Wno-padded', 
'-Wno-old-style-cast', 
'-Wno-weak-vtables', 
'-x', 
'c++', 
'-I', 
'.', 
'-isystem', 
'/usr/include/', 
]