Penyelesaian otomatis di Vim


257

Singkatnya, saya mencari kerja fitur autocompletion untuk editor Vim. Saya telah berpendapat sebelumnya bahwa Vim sepenuhnya menggantikan IDE di Linux dan walaupun itu benar, ia tidak memiliki satu fitur penting: pelengkapan otomatis.

Aku tahu tentang Ctrl+ N, integrasi riang Ctags , Taglist , cppcomplete dan OmniCppComplete . Sayangnya, tidak ada yang sesuai dengan deskripsi saya tentang "pelengkapan otomatis yang bekerja:"

  • Ctrl+N berfungsi dengan baik (hanya) jika Anda lupa cara mengeja class, atau while. Baiklah.
  • Ctags memberi Anda dasar tetapi memiliki banyak kelemahan.
  • Taglist hanyalah pembungkus Ctag dan karenanya, mewarisi sebagian besar kekurangannya (meskipun berfungsi dengan baik untuk daftar deklarasi).
  • cppcomplete tidak berfungsi seperti yang dijanjikan, dan saya tidak dapat menemukan kesalahan saya, atau apakah itu "berfungsi" dengan benar dan batasannya sesuai dengan desain.
  • OmniCppComplete tampaknya memiliki masalah yang sama dengan cppcomplete, yaitu pelengkapan otomatis tidak berfungsi dengan baik. Selain itu, tagsfile sekali lagi perlu diperbarui secara manual.

Saya menyadari fakta bahwa bahkan tidak modern, full-blown IDEs menawarkan penyelesaian kode C ++ yang baik. Itu sebabnya saya menerima kekurangan Vim di bidang ini sampai sekarang. Tapi saya pikir tingkat dasar penyelesaian kode tidak terlalu banyak untuk ditanyakan, dan pada kenyataannya diperlukan untuk penggunaan yang produktif. Jadi saya mencari sesuatu yang bisa menyelesaikan setidaknya hal-hal berikut.

  • Kesadaran sintaksis . cppcomplete menjanjikan (tetapi tidak memenuhi untuk saya), yang benar, pelengkapan otomatis yang menyadari cakupan hal berikut:

    variableName.abc
    variableName->abc
    typeName::abc

    Dan sungguh, yang lainnya sama sekali tidak berguna.

  • Konfigurasi . Saya perlu menentukan (dengan mudah) di mana file sumbernya, dan karenanya dari mana skrip mendapatkan informasi penyelesaian otomatisnya. Bahkan, saya punya Makefile di direktori saya yang menentukan jalur sertakan yang diperlukan. Eclipse dapat menafsirkan informasi yang ditemukan di dalamnya, mengapa bukan skrip Vim juga?

  • Up-to-dateness . Segera setelah saya mengubah sesuatu di file saya, saya ingin penyelesaian otomatis mencerminkan hal ini. Saya tidak ingin memicu secara manual ctags(atau sesuatu yang sebanding). Juga, perubahan harus bertahap , yaitu ketika saya telah mengubah hanya satu file itu benar-benar tidak dapat diterima untuk ctagsmem-parsing ulang seluruh pohon direktori (yang mungkin sangat besar).

Apakah saya lupa sesuatu? Jangan ragu untuk memperbarui.

Saya nyaman dengan cukup banyak konfigurasi dan / atau bermain-main tapi saya tidak ingin memprogram solusi dari awal, dan saya tidak pandai debugging skrip Vim.

Catatan terakhir, saya benar-benar ingin sesuatu yang serupa untuk Java dan C # tapi saya rasa itu terlalu banyak untuk diharapkan: ctagshanya mem-parsing file kode dan Java dan C # memiliki kerangka kerja besar yang telah dikompilasi yang perlu diindeks. Sayangnya, pengembangan .NET tanpa IDE bahkan lebih merupakan PITA daripada C ++.


4
Sudah lama sejak Anda mengajukan pertanyaan ini, apakah Anda akhirnya menemukan yang bagus? Saya bertanya karena saya tidak melihat jawaban yang diterima. Meskipun secara pribadi saya harus mengakui bahwa saya menggunakan awalan variabel / fungsi saya. Sebagai contoh, semuanya dimulai dengan sh(artinya ada di perpustakaan saya) dan diikuti oleh singkatan dari kelas saya. Misalnya shPuntuk Parserkelas. Maka yang perlu Anda lakukan adalah menulis shPdan tekan CTRL + p (atau CTRL + n jika Anda mau) dan dapatkan anggota kelas dari penggunaan terakhir menjadi yang pertama (atau pertama hingga terakhir jika CTRL + n)
Shahbaz

4
@ Shahbaz Bahkan, saya yakin bahwa tidak ada solusi yang cukup bagus saat ini. clang_completesecara teknis paling baik tetapi sangat lambat karena kurangnya caching hasil dan kompilasi parsial. Saya harus mengakui bahwa saya belum mencoba semua jawaban karena beberapa memerlukan pengaturan yang berbelit-belit dan memakan waktu. Saya akan menahan napas untuk plugin yang dapat digunakan sekarang setelah dentang akhirnya memungkinkan pengembang untuk membangun AST dari sumber C ++ (sampai sekarang, tidak ada parser gratis yang bagus untuk C ++ tersedia).
Konrad Rudolph

2
Sudahkah Anda mencoba clang_completebaru-baru ini? Itu bisa digunakan libclangdengan caching sekarang dan karenanya harus lebih cepat.
Jan Larres

@ Jan Terima kasih atas informasinya. Ketika saya terakhir mencobanya, dukungan libclang masih samar. Saya mungkin harus mencoba lagi setelah saya mendapatkan waktu.
Konrad Rudolph

(Alasan untuk edit kembalikan: nama produk bukan kode, bukan miliknya formatted like this.)
Konrad Rudolph

Jawaban:


171

Coba YouCompleteMe . Ini menggunakan Dentang melalui antarmuka libclang, menawarkan semantik C / C ++ / Objective-C. Ini mirip clang_complete, tetapi secara substansial lebih cepat dan dengan fuzzy-matching.

Selain yang di atas, YCM juga menyediakan penyelesaian semantik untuk C #, Python, Go, TypeScript dll. Ini juga menyediakan penyelesaian non-semantik, berbasis pengidentifikasi untuk bahasa yang tidak memiliki dukungan semantik.


69
Sebenarnya, saya akan menerima solusi ini. Akhirnya sebuah plugin yang memberikan. Saya sudah menggunakannya selama beberapa hari sekarang. Hanya butuh empat tahun untuk menjawab pertanyaan ini. ;-)
Konrad Rudolph

5
pekerjaan yang luar biasa dengan YouCompletMe valloric! selamat
statquant

5
Sayang sekali YouCompleteMe adalah PITA lengkap untuk diinstal pada Windows :(
xx

2
@DrTwox Dari readme: "YCM tidak memiliki dukungan resmi untuk Windows , tetapi itu tidak berarti Anda tidak dapat membuatnya berfungsi di sana. Lihat halaman wiki Panduan Instalasi Windows. Jangan ragu untuk menambahkannya."
user456584

7
Posting ini harus menyebutkan bahwa Anda adalah penulisnya, karena ini adalah promosi diri sendiri (meskipun saya tidak akan membantahnya menjawab pertanyaan, namun Anda harus menyertakan penafian).
EntangledLoops

36

Ada juga clang_complete yang menggunakan clangkompiler untuk memberikan penyelesaian kode untuk proyek C ++. Ada pertanyaan lain dengan petunjuk pemecahan masalah untuk plugin ini.

Pengaya tampaknya berfungsi cukup baik selama proyek dikompilasi, tetapi sangat lambat untuk proyek besar (karena ia mencoba kompilasi penuh untuk menghasilkan daftar tag).


The clang_completePlugin bekerja dengan baik pada Cygwin dan Windows. Tidak dapat mengatakan apa-apa tentang proyek besar karena saya tidak punya. :)
Lumi

Tampaknya clang_complete menggunakan libclang memiliki caching sekarang. Ini harus menjadi jawaban yang diterima. Sudahkah Anda mencoba clang_complete pada kernel Linux? pengindeksan terbaik yang saya lihat untuk kernel menggunakan Eclipse CDT, jika clang_complete dapat menangani kernel itu harus bisa menyelesaikan apa saja.
dashesy

clang_complete adalah plugin Vim terbaik yang saya gunakan.
Cromulent

1
@Cromulent Ah, periksa YouCompleteMe, jauh lebih baik.
Konrad Rudolph

@KonradRudolph Terima kasih. Saya akan mengeceknya.
Cromulent


6

Saya baru saja menemukan proyek Eclim ditautkan dalam pertanyaan lain . Ini terlihat cukup menjanjikan, setidaknya untuk integrasi Java.


Sudahkah Anda mengujinya? Terlihat menarik.
Pacane

@ Pacane: tidak. Saya belum pernah menggunakan Java dalam beberapa bulan dan tidak punya waktu luang untuk bereksperimen.
Konrad Rudolph

1
Eclim tampaknya menjadi solusi hebat untuk Jawa, meskipun Eclipse masih tetap menjadi binatang buas untuk dimuat bahkan dalam pengaturan tanpa kepala
Drupad Panchal

2
Untuk Java, Anda bisa menggunakan Vrapper . Saya menemukan bahwa biasanya OK dengan penyelesaian otomatis yang luar biasa. Untuk pengeditan teks yang sesekali berat, saya dapat meluncurkan Vim nyata sebagai alat eksternal.
kizzx2


2

adalah apa yang Anda cari seperti intellisense?

insevim tampaknya mengatasi masalah ini.

tautan ke tangkapan layar di sini


2
Ini yang akan saya cari, ya. Sayangnya, ini hanya berjalan di Windows (Saya menggunakan OS X). Juga, pembaruan terakhir tampaknya telah dibuat sekitar 2003. :-(
Konrad Rudolph

baik Anda bisa mendapatkan kode sumber :) jika tidak, satu-satunya hal yang dapat saya pikirkan adalah omnicompletion .. atau lihat ini: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop untuk hal-hal .net setidaknya ..
Ric Tokyo

Ric, tolong berikan komentar Anda sebagai dua jawaban terpisah, mereka sangat berharga, dan saya ingin menghargainya dengan benar! Yang mengatakan, MonoDevelop tidak dapat digunakan di bawah OS X seperti yang sekarang, dan saya sedang mencari ke OmniCppComplete.
Konrad Rudolph

Lol ini hanya windows! :( Mengapa Anda ingin ini di windows di mana Anda memiliki VS .. Saya mencari solusi di Linux.
Nils

Nils: Tidak semua orang memiliki akses ke Visual Studio, juga banyak orang memiliki keterampilan vi yang ingin mereka terapkan di lingkungan Windows. Ada port ke Linux, tetapi saat ini sedang down. Bagaimanapun, apa yang ingin Anda capai? Anda yakin tidak hanya memerlukan fungsi pelengkapan otomatis default? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.