Cara mendapatkan penyelesaian otomatis C ++ yang cerdas

32

Beberapa editor (seperti studio visual di windows) melakukan pelengkapan otomatis C ++ yang memahami C ++. Misalnya, diberikan:

#include <vector>

int main(void) {
  std::vector<int> v;
  v.i

Dalam visual studio penyelesaian otomatis tahu satu-satunya metode std::vector<int>yang dimulai dengan i adalah insert.

Apakah mungkin mendapatkan pelengkapan otomatis semacam ini di vim?

Chris Jefferson
sumber
3
The YouCompleteMe Plugin dapat belajar istilah untuk melengkapi otomatis, dan dapat memahami bahasa keluarga C.
alxndr
Dokumentasi @alxndr cukup membingungkan untuk saya-dalam kasus untuk instalasi dengan vundle. Dan begitu saya mulai dengan itu, server YCM crash!
Abhinav Gauniyal
YCM bekerja untuk saya dengan relatif baik, kecuali saya memiliki template yang berat (boost.geo) hal-hal di mana ia menambahkan looooots laod ke sistem. Setup saya berantakan sementara itu, sulit untuk mengekstrak bagian YCM ...
johannes
@yo 'Pertanyaan ini cukup spesifik untuk menggunakan vim dengan C ++. Solusi untuk itu mungkin tidak akan berlaku untuk seseorang yang menggunakan Vim untuk menulis Perl (dan sebaliknya). Jadi c ++ tampaknya baik untuk saya; tapi tentu saja Vi dan Vim Meta adalah tempat yang tepat untuk mendiskusikan itu.
derobert
2
@AbhinavGauniyal Kedengarannya mirip dengan masalah yang pernah saya lihat sebelumnya dengan menggunakan YCM. Sistem apa yang Anda pakai? Untuk OSX lihat di sini . Saya tidak menggunakan MacVim, tapi saya menginstal CMake dengan Homebrew. Kemudian saya cdmengedit direktori plugin YCM ( ~/.vim/bundleuntuk saya), dan berlari ./install --clang-completer.
bsmith89

Jawaban:

28

Saya sangat suka clang_complete untuk ini. Itu memang membutuhkan dentang, dan Anda harus mengatakan di mana libclang berada di sistem Anda. Setelah itu, ia bekerja dengan sangat baik.

Orang mungkin menyarankan YouCompleteMe, tetapi jujur, plugin itu sangat membengkak untuk apa yang dikatakannya, dan itu membutuhkan terlalu banyak langkah untuk menginstal. Saya juga memilikinya segfault Vim pada beberapa kesempatan. Saya tidak bisa lebih bahagia dengan clang_complete.

Ini yang saya dapatkan ketika saya mengetik v.:dentang-lengkap

akshay
sumber
4
Sepakat. Saya punya banyak masalah dengan YCM (termasuk segfault yang disebutkan). Dan bahkan setelah berjam-jam konfigurasi, saya tidak pernah bekerja sepenuhnya.
CharlesL
1
Server YCM saya mengalami crash berkali-kali, menantikan clang_complete, berikut adalah informasi yang relevan untuk pengguna lain: github.com/Rip-Rip/clang_complete/blob/master/doc/…
Abhinav Gauniyal
1
Saya punya yang sebaliknya. YCM bekerja dengan baik (bahkan jika itu adalah PITA untuk diinstal) tetapi dentang-lengkap tidak pernah berhasil ...
Sardathrion - Reinstate Monica
Bisakah Anda menyembunyikan semua itu sehingga Anda dapat melihat kode Anda beberapa baris ke bawah?
Matt C
@ MatthewCliatt, sembunyikan apa? Menu popup? Tidak ada yang spesial dalam kode ini. Hanya di return 0bawah menu popup itu.
akshay
8

Plugin YouCompleteMe ( Link ) telah bekerja sangat baik untuk saya. Ini menggunakan libclang untuk menghasilkan fitur autocomplete, memberikan penyelesaian yang akurat.

Ini memiliki banyak penyesuaian, khususnya ketika bekerja dengan flag-flag kompilasi. Anda dapat mengedit "pembuat bendera" dengan mengedit skrip python per proyek ( Contoh ). Tapi, bagi saya keuntungan utama adalah mendukung Clang Compilation Database ( Link! ). Ini berarti bahwa Anda dapat mengkompilasi kode Anda secara normal dan meminta dentang untuk meludah semua flag yang digunakan untuk kompilasi, dan menggunakan flag tersebut dengan YouCompleteMe. Sangat berguna jika Anda ingin alat pelengkapan otomatis tahu tentang definisi makro Anda atau lokasi semua file header di sistem Anda tanpa usaha mengetik secara manual.

Allan Hasegawa
sumber
3

YouCompleteMe tidak terlalu sulit untuk diinstal, dan sudah cukup stabil untuk saya, saya telah bermigrasi dari clang_complete ke YouCompleteMe tahun yang lalu. Satu hal yang saya setuju, itu memang membengkak dengan sejarah komit yang besar, banyak dependensi internal dan dukungan untuk banyak bahasa yang Anda mungkin tidak peduli tapi masih akan berakhir mengkloning submodul yang terkait. Itu, itu masalah dengan YouComplemeMe, masih .... itu berfungsi.

Saya telah mengerjakan garpu dengan tujuan khusus untuk mendukung C ++ dengan lebih baik, Anda dapat memeriksa gif yang memamerkannya:

https://s3.amazonaws.com/f.cl.ly/items/1e2F0A123h331c1G0L0R/SadBart.gif

Ini memanfaatkan informasi parameter baru yang dapat disediakan oleh Clang, Anda dapat mempelajari lebih lanjut tentang ini dari artikel saya ini: http://nosubstance.me/articles/2015-01-29-better-completion-for-cpp/ .

pepper_chico
sumber
Hari ini saya menggunakan coc.nvim + ccls sebagai gantinya.
pepper_chico