Vim'de otomatik tamamlama


257

Özetle, Vim editörü için çalışan bir otomatik tamamlama özelliği arıyorum . Ben ettik önce savundu olduğunu Vim tamamen Linux altında bir IDE değiştirir ve bu kesinlikle doğru iken, bu önemli bir özelliğe sahip değil: otomatik tamamlama.

Bilmem Ctrl+ N, Coşkulu Ctags entegrasyonu , Taglist , cppcomplete ve OmniCppComplete . Ne yazık ki, bunların hiçbiri "çalışan otomatik tamamlama:"

  • Ctrl+N nasıl hecelendiğini unutursan iyi çalışır ( classya da) while. Oh iyi.
  • Ctags size ilkeleri sunuyor ama birçok dezavantajı var.
  • Taglist sadece bir Ctags paketleyicisidir ve bu nedenle dezavantajlarının çoğunu devralır ( bildirimleri listelemek için iyi çalışır ).
  • cppcomplete vaat ettiğiniz gibi çalışmıyor ve neyi yanlış yaptığımı ya da doğru bir şekilde “çalışıyor” ve sınırlamalar tasarım gereği olup olmadığını anlayamıyorum .
  • OmniCppComplete , cppcomplete ile aynı sorunlara sahip gibi görünüyor, yani otomatik tamamlama düzgün çalışmıyor. Ayrıca, tagsdosyanın bir kez daha manuel olarak güncellenmesi gerekir.

Modern, tam gelişmiş IDE'lerin bile iyi C ++ kodu tamamlama sunduğunun farkındayım. Bu yüzden şimdiye kadar Vim'in bu alandaki eksikliğini kabul ettim. Ancak, kod tamamlamanın temel bir düzeyinin sormak için çok fazla olmadığını ve aslında verimli kullanım için gerekli olduğunu düşünüyorum. Bu yüzden en azından aşağıdaki şeyleri başarabilecek bir şey arıyorum.

  • Sözdizimi farkındalığı . cppcomplete vaat ediyor (ama benim için teslim etmiyor), aşağıdakilerin doğru, kapsam farkında otomatik tamamlanması:

    variableName.abc
    variableName->abc
    typeName::abc

    Ve gerçekten, başka bir şey tamamen işe yaramaz.

  • Yapılandırılabilirlik . (Kolay) kaynak dosyaları nerede ve bu nedenle komut dosyası otomatik tamamlama bilgilerini alır nerede belirtmeniz gerekir. Aslında, benim dizininde gerekli dahil yollarını belirten bir Makefile var. Eclipse orada bulunan bilgileri yorumlayabilir, neden bir Vim betiği olmasın?

  • Güncellik . Dosyamdaki bir şeyi değiştirir değiştirmez otomatik tamamlamanın bunu yansıtmasını istiyorum. Ben do not manuel tetik istiyorum ctags(ya da bir şey karşılaştırılabilir). Ayrıca, değişiklikler olmalıdır artırımlı Ben tamamen bu sadece bir dosya değiştirdik zaman yani kabul edilemez için ctagstüm dizin ağacını (büyük olabilir) yeniden ayrıştırmak için.

Bir şey unuttum mu? Güncellemek için çekinmeyin.

Oldukça fazla yapılandırma ve / veya tinkering ile rahatım, ancak sıfırdan bir çözüm programlamak istemiyorum ve Vim komut dosyalarında hata ayıklama konusunda iyi değilim.

Son bir not, gerçekten Java ve C # için benzer bir şey istiyorum ama bunun için umut çok şey var: ctagssadece kod dosyalarını ayrıştırır ve hem Java hem de C # endekslenmesi gereken büyük, önceden derlenmiş çerçeveler var. Ne yazık ki, IDE olmadan .NET geliştirmek C ++ 'dan daha fazla bir PITA.


4
Bu soruyu sorduğunuzdan bu yana uzun zaman geçti, sonunda iyi bir soru buldunuz mu? Soruyorum çünkü kabul edilen cevap görmüyorum. Şahsen itiraf etmeliyim ki değişkenlerimin / fonksiyonların ön ekine başvurdum. Örneğin, hepsi ile başlar sh(yani benim kütüphanemde) ve ardından sınıfımın kısaltmasıyla başlar. Örneğin shPiçin Parsersınıf. Daha sonra tek yapmanız gereken shPCTRL + p (veya isterseniz CTRL + n) yazmak ve vurmak ve sınıf üyelerini son kullanımdan önce (veya CTRL + n ise ilk önce sondan) almak
Shahbaz

4
@Shahbaz Aslında, şu anda yeterince iyi bir çözüm olmadığına inanıyorum. clang_completesonuçların önbelleğe alınamaması ve kısmi derleme nedeniyle teknik olarak en sağlam ancak son derece yavaştır. Tüm cevapları denemediğimi itiraf etmeliyim çünkü bazıları kıvrık, zaman alıcı bir kurulum gerektiriyor. Kullanılabilir bir eklenti için nefesimi tutacağım, çünkü clang sonunda geliştiricilerin C ++ kaynaklarından AST oluşturmalarına izin veriyor (şimdiye kadar C ++ için iyi ücretsiz ayrıştırıcılar yoktu).
Konrad Rudolph

2
clang_completeSon zamanlarda denedin mi? libclangŞimdi önbellekleme ile kullanılabilir ve bu nedenle daha hızlı olmalıdır.
Jan Larres

@Jan Bilgi için teşekkürler. En son denediğimde, libclang desteği hala kabataslaktı. Zamanı aldığımda muhtemelen tekrar denemeliyim.
Konrad Rudolph

(Geri alma nedeniniz: ürün adları kod değil, ait değil formatted like this.)
Konrad Rudolph

Yanıtlar:


171

YouCompleteMe'yi deneyin . Semantik C / C ++ / Objective-C tamamlama sunan libclang arayüzü üzerinden Clang kullanır. Clang_complete'a çok benzer, ancak oldukça hızlı ve bulanık eşleme ile.

Yukarıdakilere ek olarak, YCM ayrıca C #, Python, Go, TypeScript vb. İçin semantik tamamlama sağlar. Ayrıca semantik desteği olmayan diller için semantik olmayan, tanımlayıcı tabanlı tamamlama sağlar.


69
Aslında, bu çözümü kabul edeceğim. Sonunda teslim eden bir eklenti. Birkaç gündür kullanıyorum. Bu soruyu cevaplamak sadece dört yıl sürdü. ;-)
Konrad Rudolph

5
YouCompletMe valloric ile harika bir iş! tebrikler
statquant

5
Çok kötü YouCompleteMe, Windows'a yüklemek için eksiksiz bir PITA :(
xx

2
@DrTwox Benioku dosyasından: "YCM'nin Windows için resmi bir desteği yoktur , ancak bu, orada çalışamayacağınız anlamına gelmez. Windows Kurulum Kılavuzu wiki sayfasına bakın. Eklemek için çekinmeyin."
user456584

7
Bu yazı yazar olduğunuzu belirtmelidir, çünkü bu sınırda kendi kendini tanıtmaktır (soruyu cevapladığını iddia etmememe rağmen yine de bir feragatname eklemelisiniz).
EntangledLoops

36

Ayrıca C ++ projeleri için kod tamamlama sağlamak için derleyiciyi kullanan clang_complete vardır . Bu eklenti için sorun giderme ipuçlarıyla ilgili başka bir soru var .clang

Eklenti, proje derlendiği sürece oldukça iyi çalışıyor gibi görünüyor, ancak büyük projeler için engelleyici derecede yavaş (etiket listesini oluşturmak için tam bir derleme girişiminde bulunduğundan).


clang_completeEklenti Cygwin ve Windows üzerinde güzel çalışıyor. Büyük projeler hakkında bir şey söyleyemem çünkü hiçim yok. :)
Lumi

Görünüşe göre libclang kullanarak clang_complete şimdi önbelleğe alıyor. Bu, kabul edilen cevap olmalıdır. Linux çekirdeğinde clang_complete denediniz mi? çekirdek için gördüğüm en iyi indeksleme Eclipse CDT kullanmaktır, eğer clang_complete çekirdeği işleyebilirse, sadece her şeyi tamamlayabilmelidir.
dashesy

clang_complete, kullandığım en iyi Vim eklentisidir.
Cromulent

1
@Cromulent Ah, YouCompleteMe'yi kontrol et, çok daha iyi.
Konrad Rudolph

@KonradRudolph Teşekkürler. Kontrol edeceğim.
Cromulent


6

Eclim'in başka bir soruyla bağlantılı projesini yeni buldum . Bu, en azından Java entegrasyonu için oldukça umut verici görünüyor.


Test ettin mi? İlginç görünüyor.
Pacane

@ Pacac: hayır. Java'yı aylarca kullanmak zorunda kalmadım ve denemek için boş zamanım olmadı.
Konrad Rudolph

1
Eclim Eclipse bile hala başsız kurulumunda yüke canavarlaştırabilirler kalmasına rağmen, Java için harika bir çözüm gibi görünüyor
Drupad Panchal

2
Java için Vrapper'ı kullanabilirsiniz . Mükemmel otomatik tamamlama ile genellikle iyi olduğunu düşünüyorum. Ara sıra metin ağırlıklı düzenleme için, gerçek bir Vim'i harici bir araç olarak başlatabilirim.
kizzx2


2

intellisense gibi bir şey aradığın şey nedir?

insevim bu konuyu ele alıyor gibi görünüyor.

burada ekran görüntülerine bağlantı


2
Aradığım şey bu olurdu, evet. Ne yazık ki, sadece Windows üzerinde çalışıyor (OS X kullanıyorum). Ayrıca, son güncelleme 2003 civarında yapılmış gibi görünüyor. :-(
Konrad Rudolph

iyi kaynak kodu alabilirsiniz :) değilse, aklıma gelen tek şey omnicompletion .. ya da bir göz atın: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop .net şeyler için en azından ..
Ric Tokyo

Ric, lütfen yorumunuzu iki ayrı cevap olarak sağlayın, paha biçilmezler ve ben de onları onurlandırmak istiyorum! Bununla birlikte, MonoDevelop şu an OS X altında kullanılamıyor ve şu anda OmniCppComplete'i arıyorum.
Konrad Rudolph

Lol bu sadece pencereler! :( Bunu neden VS'ye sahip olduğunuz pencerelerde istemelisiniz .. Linux'ta bir çözüm arıyorum.
Nils

Nils: Herkesin Visual Studio'ya erişimi yok, ayrıca bir çok insan Windows ortamında uygulamak istedikleri vi becerilerine sahip. Linux için bir liman vardı, ama şu anda kapalı. Her durumda, ne elde etmeye çalışıyorsunuz? varsayılan otomatik tamamlama işlevlerine ihtiyacınız olmadığından emin misiniz? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.