2013-08-03 17 views
10

Tôi cảm thấy rằng tôi có một thiết lập tuyệt vời cho lập trình C++ bằng cách sử dụng Vim nhưng tôi không thể tìm cách để nói Vim, YCM và Syntastic nơi tìm kiếm tiêu đề. Nó sẽ thực sự khó chịu khi phải tự thiết lập các biến đường dẫn bao gồm cho Vim, YCM và Syntastic mỗi khi tôi muốn làm việc trên một dự án khi thông tin này tồn tại trong Makefile. Có bất kỳ giải pháp tự động nào để thiết lập đường dẫn bao gồm toàn cầu không?Vim, C++, YCM, và Syntastic bao gồm các vấn đề đường dẫn

Chỉnh sửa: Nó thậm chí sẽ không tìm thấy tiêu đề nếu tôi đặt đường dẫn như sau: "set path =".,/Usr/include, include, ../include,/home/steven/ovgl/include, , ""

+0

Tôi tưởng tượng bạn có thể tạo một mục tiêu makefile để tạo cấu hình YCM từ các biến makefile ... không bao giờ thử nghiệm điều này, nhưng một tập lệnh đơn giản có thể thực hiện thủ thuật. Sau đó, đối với mỗi dự án mới, bạn sẽ bao gồm mục tiêu đó trong makefile, chạy 'make ycm_setup' và bạn sẽ sẵn sàng để mã hóa. –

+2

Sẽ thật tuyệt nếu bạn đăng liên kết tới các plugin, hoặc ít nhất là tên đầy đủ của nó ([YouCompleteMe thay vì YCM] (https://github.com/Valloric/YouCompleteMe)). – mMontu

Trả lời

3

Tiêu đề của bạn sẽ xuất hiện trong tệp thẻ của bạn (xem :h tags nếu bạn không biết về nó).

Sau đó YouCompleteMe có khả năng đọc các thông tin về tiêu đề của bạn từ các tập tin thẻ, như được giải thích trong plugin faq:

YCM không đọc định danh từ thẻ My Files

Đầu tiên , đặt let g:ycm_collect_identifiers_from_tags_files = 1 vào vimrc của bạn.

Đảm bảo bạn đang sử dụng Ctash Exuberant để tạo các tệp thẻ của mình từ định dạng thẻ được hỗ trợ duy nhất là định dạng Ctags Exuberant. Định dạng từ các chữ "đồng bằng" không được hỗ trợ. Đầu ra của ctags --version phải danh sách "Ctash Exuberant".

Ctags cần được gọi với tùy chọn --fields=+l (đó là chữ thường L, không phải là một) vì YCM cần trường language:<lang> trong thẻ đầu ra.

LƯU Ý: Mac OS X đi kèm với các thẻ "đồng bằng" được cài đặt theo mặc định. brew install ctags sẽ giúp bạn có được phiên bản Ctags Exuberant.

Cũng đảm bảo rằng tùy chọn thẻ Vim của bạn được đặt chính xác. Xem :h 'tags' để biết chi tiết. Nếu bạn muốn xem tệp thẻ nào YCM sẽ đọc cho bộ đệm nhất định, hãy chạy :echo tagfiles() với bộ đệm có liên quan đang hoạt động. Lưu ý rằng chức năng đó sẽ chỉ liệt kê các tệp thẻ đã tồn tại.

+0

Tôi đã thêm biến vào vimrc của mình, sau đó tôi đã thử cả hai "ctags -R * --fields = + l" và "etags -R * --fields = + l" nhưng YCM dường như không làm bất cứ điều gì với các thẻ. – SteveDeFacto

+0

Đảm bảo bạn đang sử dụng Ctash Exuberant. Bạn cũng có thể kiểm tra cài đặt của tùy chọn 'thẻ' của bạn, như đã lưu ý trong đoạn cuối của câu trả lời. YCM nên xem xét nội dung của ''thẻ'', vì nó được ghi trên FAQ của nó; nếu bạn tin rằng nó không phải là, bạn nên [mở một vấn đề trên các plugin] (https://github.com/Valloric/YouCompleteMe/issues) – mMontu

+1

Tôi không thực sự hiểu tại sao nó không hoạt động và vì vậy tôi sẽ không có thể giải thích vấn đề nếu tôi mở một vấn đề. Tôi đã cố gắng nhiều tuần để YCM làm việc đúng nên tôi quay trở lại clang_complete và supertab. thở dài ... – SteveDeFacto

1

Tôi đã gặp phải sự cố tương tự. Tôi cần điều này để sử dụng với phát triển bằng cách sử dụng llvm. Tôi đã giải quyết bằng cách làm theo các bước sau:

  1. Ctags -R --fields=+l * trong cơ sở dự án/mã của bạn.
  2. Trong tập tin vimrc người dùng của bạn, thêm let g:ycm_collect_identifiers_from_tags_files = 1
  3. cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py ~/
  4. Thêm dòng khác trong thiết bị đầu cuối vimrc let g:ycm_global_ycm_extra_conf = '/home/<user>/ycm_extra_conf.py'
  5. reset hoặc nhấn bash

Lưu ý: Bạn nên bắt đầu vim trong thư mục với các thẻ có trong đó. Hoặc bạn có thể cần chỉ định rõ thư mục chứa thẻ.

+1

Hướng dẫn sử dụng YCM cho biết bạn nên thay đổi tệp cấu hình và không chỉ sử dụng ví dụ được cung cấp. –

0

Bạn phải tìm kiếm YCM-Generator. Nó là một kịch bản tạo ra ycm_extra_conf.py bằng cách chạy make và tìm kiếm tất cả các cờ được sử dụng. Bạn chạy nó một lần cho dự án, và chạy lại chỉ khi thực hiện thay đổi tập tin.