Làm thế nào để có được tự động hoàn thành thông minh trong C ++?


43

Emacs không thể cạnh tranh với một IDE khác nếu nó không có chức năng tự động hoàn thành. Tự động hoàn thành đơn giản làm cho tôi trở thành một lập trình viên hiệu quả hơn. Tôi biết phần mở rộng Chế độ hoàn thành tự động , nhưng nó không hoạt động với C ++.

tự động hoàn thành

Làm cách nào tôi có thể đạt được tự động hoàn thành thông minh và hiệu quả cho C ++?


Câu hỏi này ban đầu được Malabarba hỏi về đề xuất Khu vực 51: Làm thế nào để có được tự động hoàn thành thông minh trong C ++?


1
Nó sẽ là tốt đẹp để mở rộng một chút về câu hỏi này. Nó có rất nhiều giá trị tiềm năng, nhưng ngay bây giờ câu hỏi chỉ là tiêu đề.
Malabarba

Chế độ trớ trêu dường như là con đường để đi vào lúc này.
Sevki

Câu trả lời:


45

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của chế độ trớ trêu

ảnh chụp màn hình công ty

Nếu bạn chỉ muốn tự động hoàn thành thông minh, tôi có thể đề xuất chế độ trớ trêu với sự mỉa mai của công ty .

  • chế độ trớ trêu rất dễ cài đặt nhờ MELPA
  • các hoàn thành là rất chính xáchiệu suất khá tốt nhờ vào libclang
  • với sự mỉa mai của công ty, bạn có một phụ trợ hoàn thành không đồng bộ sẽ không cản trở bạn nếu việc hoàn thành mất một thời gian
  • công ty trớ trêu hỗ trợ các chức năng quá tải và nếu bạn đã cài đặt Yasnippet, các đối số chức năng được chèn dưới dạng giữ chỗ để điền vào
  • nếu dự án của bạn sử dụng Doxygen, tài liệu ngắn gọn về ứng cử viên hoàn thành sẽ được hiển thị trong bộ thu nhỏ (xem ảnh chụp màn hình)
  • việc cài đặt máy chủ chế độ trớ trêu trên một hệ thống giống Unix (Linux, OS X) sẽ dễ dàng. Mặt khác, Windows đòi hỏi một chút tinh chỉnh nhưng nó được ghi lại trong wiki

Một công cụ khác chưa được trích dẫn là emacs-ycmd .


2
Cảm ơn bạn rất nhiều! Ước gì tôi phát hiện ra sớm hơnirony-mode
Luke

@GuillaumePapin Cảm ơn bạn đã viết trớ trêu! Bạn sẽ có bất kỳ điểm chuẩn thời gian có sẵn? Tôi đã nhận thấy rằng các cuộc gọi đến clang_codeCompleteAtvới một TU được phân tích cú pháp (nhưng các thay đổi chưa được lưu) mất 3-5 giây. Là irony-modenhanh hơn thế này?
Pradhan

1
Trớ trêu sử dụng libclang / clang_codeCompleteAt, vì vậy bạn sẽ không có được thời gian tốt hơn thế. 3-5 giây có thể là quá nhiều tùy thuộc vào ngữ cảnh (ví dụ: hoàn thành ở phạm vi toàn cầu mất nhiều thời gian hơn so với các phạm vi khác). Bạn có thể xem một số thời gian mà tôi đã làm gần đây: github.com/Sarcasm/irony-mode/issues/131#issuecomment-60008804
Guillaume Papin

Liên quan, dành cho độc giả tương lai: github.com/Sarcasm/irony-mode/issues/140
Sean Allred

Làm thế nào để vai trò của chế độ trớ trêu và emacs-ycmd so sánh? Có phải họ thay thế cho nhau? Nó sẽ bao giờ có ý nghĩa để sử dụng cả hai?
Praxeolitic

23

Kiểm tra hướng dẫn của tôi . Nó liệt kê một số phương thức để tự động hoàn thành trong C / C ++.

Những lựa chọn đó là:

  • Sử dụng trớ trêu . Rất khuyến khích, vì nó sử dụng Clang và dễ cài đặt so với các giải pháp khác.

  • Sử dụng trình phân tích cú pháp tích hợp từ Emacs. Đây là tính năng tự động hoàn thành tốt nhất bạn có thể nhận được từ bên trong trình phân tích cú pháp Emacs, Semantic, nhưng nó sẽ chậm trên dự án lớn như nhân Linux.

  • Sử dụng company-modegói với company-clang. Cung cấp hoàn thành mã tốt cho hệ thống bao gồm các đường dẫn vì nó có thể tự động lấy các đường dẫn từ Clang, nhưng phải thực hiện một số cấu hình cho dự án cục bộ

  • Sử dụng company-modevới company-gtags. Nó sử dụng cơ sở dữ liệu thẻ được tạo từ GNU Global khi hoàn thành. Bạn có thể sử dụng điều này để cung cấp mã hoàn chỉnh cục bộ cho dự án của bạn. Nó không thực sự thông minh vì nó ném mọi thứ bên trong cơ sở dữ liệu được tạo ra cho bạn.

  • rtagsđi xa hơn bằng cách cung cấp một máy chủ để phân tích trực tiếp. Nhưng thật khó để thiết lập so sánh với giải pháp Elisp thuần túy.


Tôi sẽ không đồng ý rằng việc thiết lập rtags phức tạp hơn một giải pháp lisp thuần túy. Giải pháp lisp tinh khiết của emacs thường không xem xét các tệp cmake / build và hầu như không thể tìm thấy bất kỳ tiêu đề nào . Rtags là khá dễ dàng để thiết lập so sánh. Nó vẫn còn hơi trẻ như một dự án, với độ bao phủ thử nghiệm không tốt lắm.
baol

Một bổ sung tuyệt vời cho hướng dẫn của Tuhdo
Victor

9

Tôi đã thành công lớn với RTags + Company .

RTags cần một trình nền riêng biệt rdmchạy sử dụng tiếng kêu để hoàn thành mã, điều hướng mã và tái cấu trúc. rdmcũng có chức năng như một cơ sở dữ liệu của các ký hiệu, có nghĩa là tự động hoàn thành nhanh hơn nhiều so với bất kỳ giải pháp nào chỉ cần gọi trực tiếp clang_codeCompleteAt.

RDM cần thông tin của cờ biên soạn cho các dự án của bạn mà có thể là một rắc rối, nhưng nếu bạn làm theo những lời khuyên từ RTags trang và symlink gcc-rtags-wrapper.shđến gcc, g++, ccc++RDM sẽ tự động được cập nhật với cờ biên soạn mới trên biên dịch lại.


Tôi vừa chuyển từ chế độ trớ trêu sang rtags. Chế độ trớ trêu liên tục xuất hiện và ngừng hoạt động sau khoảng 15 phút hoặc lâu hơn. Rtags có vẻ khá tốt cho đến nay và có tích hợp sạch hơn với yasnippet.
nenchev

6

Giải pháp 1: chế độ công ty + tiếng kêu

Vấn đề duy nhất là bạn cần cho chế độ công ty biết nơi tìm kiếm tệp tiêu đề c / c ++ của dự án của bạn.

Nếu bạn sử dụng cmake, bạn có thể để https://github.com/redguardtoo/cpputils-cmake thực hiện cài đặt cho bạn (GỢI Ý: Tôi là tác giả của cpputils-cmake).

HOẶC LÀ

Giải pháp 2: chế độ công ty + gnu toàn cầu

Không có gì hơn để nói, bạn cần xây dựng các thẻ với công cụ cli toàn cầu gnu, như những người khác đã đề cập.


1

Tôi đã sử dụng cmake-ide để định cấu hình rtags, flycheck, trớ trêu và clang công ty.

Bây giờ bạn có thể định cấu hình hệ thống xây dựng các plugin phân tích tĩnh yêu thích của mình cùng một lúc!

EDIT: Lưu ý rằng clang công ty cung cấp tự động hoàn thành, đó là tính năng bạn đang tìm kiếm. cmake-ide cũng có thể định cấu hình flycheck và rtags, bổ sung thêm một số tính năng giống IDE.


1
Vui lòng giải thích làm thế nào điều này trả lời câu hỏi làm thế nào để có được tự động hoàn thành C ++.
vẽ

@Drew company-clang cung cấp hoàn thành
AnimatedRNG

Vui lòng đặt nó trong câu trả lời của bạn. Cám ơn.
vẽ

0

Chế độ ngữ nghĩa Mx

www.gnu.org/software/emacs/manual/html_node/semantic/Using-Semantic.html#Using-Semantic

&&

Thẻ Bàn

tìm thấy . -name "*. [chCH]" -print | etags -

www.gnu.org/software/emacs/manual/html_node/emacs/Tags.html

etags , ctags - tạo tập tin thẻ cho Emacs, vi

manpages.debian.org/cgi-bin/man.cgi?query=etags&apropos=0&sektion=0&manpath=Debian+8+jessie&format=html&locale=en

CMi (hoặc M-TAB) hoàn thành tại điểm. Nếu chế độ Semantic được bật, hãy thử sử dụng dữ liệu trình phân tích ngữ nghĩa. Nếu chế độ Semantic bị vô hiệu hóa hoặc thất bại, hãy cố gắng hoàn thành bằng cách sử dụng bảng thẻ đã chọn (xem Thẻ)

http://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html#index-C_002dM_002di

M-. (find-tag) nhắc tên thẻ && nhảy đến định nghĩa

http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html#index-M_002d_002e

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.