Emacs'i tam özellikli bir C / C ++ IDE olarak kullanmak


50

Emacs'ı C / C ++ IDE olarak kullanmak için bir yıldan fazladır deniyorum. Şimdiye kadar sadece marjinal başarı elde ettim, ancak yol boyunca birkaç tuğla duvara rastladım. Şu anda CEDET kullanmaya çalışıyorum, ancak etkili bir şekilde nasıl kullanılacağını anlamakta zorlanıyorum.

Bir IDE'de aradığım özellikler şunlardır:

  1. Yazılımın "projeler" yönetimi. IDE'min mevcut projemi oluşturan tüm dosyaları bilmesini istiyorum, böylece projemde arama ve değiştirme gibi işlevler gerçekleştirebilirim. (Kaynak ağacımı çok sayıda destek dosyasıyla karıştırmadan da başarabilirsem çok iyi olurdu. Neden proje başına birden fazla merkezi proje dosyasına ihtiyacım var?)
  2. Şu anda ziyaret ettiğim arabelleğe bakılmaksızın, mevcut projeyi IDE içinden inşa etme yeteneği Mevcut projeyi inşa edecek bir anahtarı bağlayabilmem gerekiyor.
  3. Hata bildirimi Yapı araçları tarafından bildirilen hataları bulmak için 500'den fazla çıktı satırını okumak zorunda kalmak istemiyorum. Tercihen, hatalar kendi tamponlarında hata başına bir satır ile ortaya çıkar.
  4. Proje içerisindeki sembollerin ve nerede tanımlandıklarının farkındalığı. Proje dosyalarımda mı yoksa sistem dosyalarında mı bulunduğunu bir simge tanımına atlamak istiyorum.
  5. Görsel hata ayıklama. Kodda ilerlediğimde otomatik olarak güncellenen yerel değişkenlerin bir izleme listesine sahip olmak istiyorum. Koddaki kesme noktalarını ayarlayabilmek istiyorum, sonra hangi kod satırının yürütüleceğini görün.

Bu özelliklerin her birinin, EDE, Semantic, GDB, vb. Kullanarak her birinin bir anda veya başka bir zamanda çalışmasını sağladığımı biliyorum. Çünkü her bir parça genellikle kendi başına yapılandırılmalıdır ve hepsinin bir kerede nasıl yapılandırılacağını bulmak ve birlikte çalışmasını sağlamak için genellikle çok fazla iş gerekir.

Emacs'i tam özellikli bir C / C ++ IDE'ye dönüştürmek için hangi çözümler var? Her zaman parça parça her şeyi yapılandırmanız mı gerekiyor yoksa bir seferde tüm özellikleri ayarlamanın bir yolu var mı?

EDIT: Bu soruya iyi bir cevap verilen kriterlerin beşi de tam olarak yerine getirmek zorunda değildir. Bir IDE'yi "tam özellikli" olarak düşünmeden önce görmek istediğim özelliklerin türü hakkında daha somut bir fikir vermek için listeyi verdim. CEDET'in tasarıya uyması oldukça mümkün, ancak henüz sıfırdan nasıl kurulacağına dair adım adım çalışan bir çalışma rehberi bulamadım.


6
Bu soruya bölünerek daha iyi olabilir. Maddelerin hiçbirine hakettiği önem verilmeyen bir sürü kısmi cevaba sahip olabilirsiniz.
Malabarba


6
@ Malabarba: Beş ayrı soru soruyor olsaydım, bu kopya olabilir. Bu sorunun asıl amacı, beş farklı hedefe ulaşan beş farklı paketin olabileceği, ancak beşinin de birbirleriyle iyi oynayacak şekilde yapılandırılması neredeyse imkansız görünüyor. Cevap, "Emacs tam özellikli bir IDE olarak çalışamaz çünkü yapılandırılması imkansız zaman alır." olsun o zaman.
nispio

4
Her bir nokta kendi soruları olabilir (potansiyel olarak kopyalanabilir), hepsini bir soruda bir araya getirmek bazen paket etkileşimi nedeniyle farklı cevaplara yol açabilir.
Jonathan Leech-Pepin,

Yanıtlar:


27

Farklı diller için farklı seviyeler "IDE-ness" vardır ve ne yazık ki hiçbir konfigürasyon olmadan tam IDE özellikleri elde edemezsiniz (bir şeyleri yapılandırmayı sevmiyorsanız, muhtemelen Emacs kullanmamalısınız). CEDET, desteklenen diller için tüm ihtiyaçlarınızı karşılayan eksiksiz bir çözüm olmayı hedeflemektedir, ancak ben şahsen düzgün çalışamadım; bunun yerine, IDE tabanlarımı kapsayacak şekilde birkaç paket kullanıyorum. Bildiğiniz farklı diller için bazı çözümler ile, puanlarınızı sırayla gözden geçireceğim:

  1. mermi , IDE benzeri bir deneyim sunmak için en yakın pakettir. Proje bazında tonlarca yararlı işlevsellik sağlar. Muhtemelen bir çeşit pencere / çalışma alanı yönetimi isteyeceksiniz; Wacspace adlı kendi çözümümü kullanıyorum , ancak diğer iyi çözümler de perspektif , çalışma grupları ve elscreen .
  2. Farklı diller, bir "derlemenin" ne olduğu konusunda farklı fikirlere sahiptir, ancak M-x compilehemen hemen her şeyi barındırabilir ve hataları taramayı kolaylaştırır (sadece kullanımı next-error). Ayarlanacak dizin değişkenlerini kullanarak proje bazında kolayca özelleştirebilirsiniz compile-command. ( ) compileKullanarak projectile ile koşabilirsiniz .projectile-compile-projectC-c p c
  3. M-x compileAyrıca burada ele aldım - hatalar genellikle *compilation*arabellekte satır başına bir tane olmak üzere , kolay sayfalama ile sonuçlanır next-error.
  4. Bir sembole atlamak, "kodunuzu anlamak" anlamına gelir ve bu, desteğin diller arasında büyük ölçüde değiştiği yerdir. Elisp için, mükemmel elisp-slime-nav komutunu kullanabilir ve ardından M-.tanımlamaya geçebilirsiniz . Diğer diller için benzer destek sağlayan bazı paketler: CIDER (Clojure için); SLIME (Ortak Lisp için); bornoz (Ruby için); C / C ++ için semantik veya clang etiketleri (feragatname: Ben de hiç kullanmadım, bu yüzden iyi çalışıp çalışmadıklarını bilmiyorum). Eğer diğerleri başarısız olursa, Emacs'in yerleşik TAGS olanaklarını , coşkulu etiketler gibi bir şey kullanarak da kullanabilirsiniz , ancak TAGS ile hiçbir zaman kabul edilebilir sonuçlara sahip olmamıştım.
  5. Emacs hata ayıklayıcılara çok dağınık bir destek veriyor. İle GDB GUD C benzeri diller için en iyi bahis olduğu; Aksi takdirde, tamamen tamamen dil bazında. (Çapraz dil görsel hata ayıklamanın gerçekten gerçekçi bir hedef olduğunu sanmıyorum.)

4
Bir yan düğüm olarak projectiledoğrudan proje anahtarı üzerinde perspectivebir perspective-per-projectotomatik oluşturma ile entegre olabilir .
Jonathan Leech-Pepin,

semantic# 4 hakkında notlar eklerdim, anlamsal harika bir pakettir, kodunuzu anlar ve bu bilgilerle birçok faydalı şey yapabilir.
Jordon Biondo,

Hiç kullanmadım semanticve sanırım C ++ desteğinin eksik olduğunu hatırlıyorum ama cevabı da ekledim.
shosti

15

Ben kullanılan bu kılavuzu bir C ++ IDE Emacs kullanarak başlamak için. Bazı sorularınızı cevaplamanıza yardımcı olacak Helm ve Projectile'yi tanıtıyor . Zekâ

  1. Mermi projeleri yönetir. Hangi proje ile ilişkilendirilmiş dosyaları otomatik olarak öğrenmek için Makefile, SConstruct, Git repo, SVN repo ve belki de bazı yapı sistem veya sürüm kontrol dosyaları için dizin ağacını arar. Örnek olarak, mevcut projede bir dosyayı bulmak için Helm kullanan C-c p hçalıştırmalar helm-projectile.

  2. Mermi projelerinizi yapabilir. C-c p cishal projectile-compile-projectçalıştırmayı dener / Scons / CKağıt mevcut dosyaları dayalı olun. Bunu yapılandırmak zorunda kalmamıştım; her zaman ne yapacağını biliyordu.

  3. Koşarken hatalar kendi tamponlarında projectile-compile-projectgörünür, ancak istediğiniz kadar güzel olduğundan emin değilim.

  4. Programla helm-gtagsetkileşime giren gtags(sisteminizde bulunması gereken) paketi kullanabilirsiniz . Gtag'lerin bir GNU projesi olduğunu ve bu nedenle hemen Windows'ta çalışmasının mümkün olmadığını unutmayın.

    Helm yapılandırıldıktan sonra projedeki sembollerin farkına varır ve tanımlara gidebilir ve konumları kullanabilir. Örneğin helm-gtags-dwim, bir değişken veya işlevin herhangi bir kullanımına atlayabilir ve bir başlık dosyasında çalıştırıldığında bu başlık dosyasını açar.

  5. Bunu henüz denemedim.

Listelenen kılavuz, nasıl başlayacağınızla ilgili çok açık yapılandırma bilgileri verir.


Ben de bu rehbere rastladım ve uyguladım. IMHO bir şekilde ağır ve çok fazla sayıda temel emaks etkileşimi var. Çok sayıda dümene bağlı konfigürasyonu devre dışı bıraktım çünkü normal kısayollara müdahale ediyorlar (mevcut dizini bir tamponda kolayca açmak veya dosyayı alt tuşlarda birkaç tuşa basarak açmak gibi). Yine de bir göz atmaya değer, ama muhtemelen bir bütün olarak adım adım denenmeli.
Stéphane Gourichon

9

Şimdi tam özellikli bir C / C ++ IDE istediğiniz için kalifiye olabilirim.

Vc4'ten Visual Studio 2010'a kadar tüm MS IDE'leri kullandım, bu yüzden ne istediğinizi tam olarak anlıyorum.

İyi haber şu ki, Emacs Visual Studio kadar% 95 olabilir ve çok daha fazlasını yapabilir. ancak "daha fazlası" kısmıyla ilgilenmiyor olabilirsiniz. Bu yüzden sadece sorularına odaklanacağım.

Şimdi anahtar nokta, CMake'i KULLANMALIDIR , C ++ uygulamanız bile sadece Windows içindir! Hikayenin sonu. Başka seçenek yok, neden bahsettiğimi biliyorum. CMake kullanmazsanız, devam etmek anlamsızdır.

1. soruya verilen cevap : Hiçbir şey kurmanıza gerek yok, diğer eklentileri ayarlayan cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ) yükleyin . Visual Studio'dan bile daha uygun. Bu yüzden proje başına kurulum gerekli değildir. Arama yerine, bash / perl / git ve percol'ün ( https://github.com/mooz/percol ) gücünü birleştiriyorum , ki bu herhangi bir IDE'den çok daha iyi. blogumu ( http://blog.binchen.org/category/emacs.html ) ve ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ) sayfamı kontrol edin . Örneğin, dosyaları belirli bir şekilde değiştirerek arayabilirim.

2. soruya cevap : cpputils-cmake tarafından zaten ayarlanmış, M-x compileher zamanki gibi ihtiyacınız var .

3. soruya cevap : 2. soru ile aynı. Bunun neden bir sorun olduğunu bilmiyorum. daha iyi anahtar bağlantıları ile, VS ile aynı davranış.

4. soruya cevap : Şimdi çoğu insan sadece cpputils-cmake ile birleştirilebilecek Gnu Global kullanıyor. Asıl mesele, içerilen tüm C ++ başlıklarını otomatik olarak içeren dizinleri tespit etmektir . Bu cpputils-cmake ile yapılabilir, her şey kolaydır. Lütfen man globalkabuktaki ve GTAGSLIBPATH çevre değişkeni hakkında el kitabını okuyun. Kod navigasyon için Global tabanlı güzel UX sağlamak için pek çok eklenti var.

5. soruya cevap verin : Görsel hata ayıklama, Birçok insan önerilir M-x gdb-many-window, denedim ama işe yaramadı. Sadece benim gdb sürümüm eski olduğundan (İpucu, OSX 10.7.3 kullanıyorum) ve işletim sistemimi yükseltmek için çok tembelim. Fakat GUD iyidir. Editör penceresinde benim için değişken yazdırmak için bazı kısa bir anahtar oluşturun. Tüm hata ayıklama şeyler kullanılabilir. VS olarak tablo UX düzenine sahip değil. ama sana karşı dürüst olmak gerekirse. Microsoft'un hata ayıklayıcısı UX de dünyanın en iyisi değil. Kullanıcı dostu en iyi hata ayıklayıcı DDD'dir ( http://www.gnu.org/software/ddd/). Gud ve VS bu konuda hem emiyorlar. Bugünlerde sadece başka bir Emac eklentisi olan yasnippet ile kayıt kodu ekliyorum. Açıklığa kavuşturmak için, kesme noktaları hakkındaki tüm ileri hileleri biliyorum, çünkü bu hileleri uygulamak için çok tembelim. Emacs içine günlük kodu eklemek çok daha kolaydır.

IDE hakkında daha birçok şey var: kod tamamlama? şirket modunu kullanın, kurulum gerekmez. gerçek zamanlı sözdizimi kontrolü? cpputils-cmake kullanın(flymake-mode 1)

En iyisi, kurulumumu kullanırsanız VS'den daha az kurulum yapmanız gerekir ( https://github.com/redguardtoo/emacs.d ) Bu kurulum "purcell'in emacs yapılandırması artı C / C ++ desteği" başlığına sahiptir .

Şimdi vurgulamam gereken bir şey var, Emacs sana tam özgürlük veriyor . Başlamak için herhangi bir yolu seçebilirsiniz. zor yoldan ya da kolay yoldan.

Kolay yol sadece kurulumumu kopyalamak (ya da github'daki herhangi birinin kurulumu, ilk önce yıldızları saymak), 5 dakika içinde tamamen işlevsel bir C ++ IDE'niz olacak. VS 5 dakika içinde çalışmaya başlamadı.

Zor yol, kurulumu sıfırdan düzenlemektir. Zor yolu seçerseniz, Emacs'dan şikayet etmeyin . Seçim senin.

BTW, uzun vadede biraz Emacs Lisp bilgisine yardımcı olabilir. Profesyonel bir C ++ geliştiricisi için MS sh * t ile harcadığım zamanı karşılaştırdığımı düşünüyorum. Yıllar önce MS, bazı Windows güncellemelerinde VC çalışma sürelerini sessizce yükseltti. Ürünümün şirket makinelerinde sorunsuz çalışmasına neden oldu, ancak müşterilerin bilgisayarlarına çarptı .

Bu olaydan sonra Richard Stallman'ı anlamaya başladım.


1
İlginç. "CMake KULLANMALIDIR" -> Yani, autoconf veya kişisel komut dosyası kullanan rastgele bir özgür yazılım paketi üzerinde çalışırken, kişinin bir sarmalayıcı yazması gerektiğini CMakeLists.txtmi söylüyorsunuz ?
Stéphane Gourichon

1
Bunun yerine GNU Global'i kullanabilirsiniz, cmake çözümü kadar mükemmel değildir. Ancak daha esnek, bkz. Blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin

5

# 4 için, çok uzun zamandır kullandığım coşkulu-ctag'leri ve dahili etiket desteğini öneriyorum. Alternatif olarak, yakın zamanda GNU Global ve ggtag paketini kullanmaya başladım ve onları biraz üstün buldum; Bununla birlikte, neredeyse aynı şekilde çalışırlar. Her ikisi de neredeyse hiçbir yapılandırma ile çalışır. Diğer IDE özellikleri için otomatik tamamlama paketini de seviyorum. Aynı şekilde, M-x compilegeniş çapta kullanıyorum ve bir sonraki ve bir önceki hataya genel anahtarları bağladım. "Projeler" içinde arama yapmak için genellikle sadece kullanıyorum M-x find-grep. Bir sonraki ve bir önceki hata için aynı anahtar bağlantıları kullanacağını unutmayın.


4

Yazılımın "projeler" yönetimi. IDE'min mevcut projemi oluşturan tüm dosyaları bilmesini istiyorum, böylece projemde arama ve değiştirme gibi işlevler gerçekleştirebilirim. (Kaynak ağacımı çok sayıda destek dosyasıyla karıştırmadan da başarabilirsem çok iyi olurdu. Neden proje başına birden fazla merkezi proje dosyasına ihtiyacım var?)

Projectile emacs'ta proje yönetimi için en iyi seçenek gibi görünüyor. Son derece hafiftir, projenize fazladan dosya eklemeniz gerekmez. Belirli özel dosyaların varlığına bağlı olarak projeleri sizin için otomatik olarak algılamaya çalışacaktır. Örneğin - bir git deposunda çalışıyorsanız, projectile bunu bir proje olarak ele alacaktır (git tarafından izlenen herhangi bir dosya projenin bir parçası olarak değerlendirilecektir), o zaman projectile-find-fileprojeyi açmak için herhangi bir dosyayı açabilecek komutları kullanabileceksiniz . Proje bazında çalışan bir sürü başka komuta sahiptir.

Hata bildirimi Yapı araçları tarafından bildirilen hataları bulmak için 500'den fazla çıktı satırını okumak zorunda kalmak istemiyorum. Tercihen, hatalar kendi tamponlarında hata başına bir satır ile ortaya çıkar.

Flycheck , clang / gcc kullanarak sözdizimini kontrol etme desteğine sahiptir.

Proje içerisindeki sembollerin ve nerede tanımlandıklarının farkındalığı. Proje dosyalarımda mı yoksa sistem dosyalarında mı bulunduğunu bir simge tanımına atlamak istiyorum

Rtags'a bir göz atmanı tavsiye ederim . Arkaplan olarak clang'ı kullanır ve tanımlanması ve tamamlanması için oldukça iyi bir iştir. Aynı zamanda # 3 konusunda size yardımcı olabilir, çünkü clang kullanarak hata ve uyarıları görüntülemek için flymake ile de bütünleşir. Ayrıca yeniden yapılanma için sınırlı bir desteği var. Akıllı otomatik tamamlama için başka bir seçenek de ironi modudur


2

Şu anda Emacs ile birlikte gelen CEDET sürümünün kurulumu zordur, ancak resmi siteye girebileceğiniz sürümün kurulumu kolaydır ve # 2 ve # 4 ihtiyaçlarınıza cevap verebilir.

CEDET'in EDE'si, örneğin makefile ve automake projeleri yönetmenizi, hedefler eklemenizi ve dosyaları hedeflerle ilişkilendirmenizi sağlar. Ardından EDE komutlarını kullanarak projenizi derleyebilirsiniz. Emacs'in yerleşik derleme modunu kullandığından, # 3 numaralı gereksiniminiz de yerine getirilir.

CEDET'in Semantik'i C ++ dahil birçok dilde ayrıştırıcıya sahiptir. Exuberant-ctags ve GNU Global gibi bir dosyada tanımlanan etiketleri alabilir, ancak aynı zamanda otomatik tamamlama ve atlama özelliklerine de sahiptir. "Foo" olarak adlandırılan iki yönteminiz varsa, Semantic'in atlaması sizi doğru olana getirecek kadar akıllıdır.

# 1 için şahsen mermi kullandım ve GDB'yi birkaç kez önce başarıyla kullandım .

# 3 için ipucu: EDE size karşı üstün gelirse, Emacs M-x recompileson derleme komutunuzu başlatma komutuna sahiptir, böylece derlemenizi ilk kez çalıştırabilir ve ardından recompileherhangi bir tamponda kullanabilirsiniz .


1

# 4 için, YouCompleteme adında yeni bir proje ve bir sonraki harika şey gibi görünen ilgili Emacs müşterisi gibi görünüyor. Clang kullandığından, kodun etiketlerden veya globalden daha iyi bir görüntüsü vardır.


1
Öneriniz için teşekkürler, ancak birlikte iyi entegre olan şeyler aradığım için , bir prototip Emacs istemcisiyle Vim eklentisi kullanarak özelliklerden birini almaya çalışmanın en iyi başlangıç ​​noktası olduğundan emin değilim.
nispio

3
Deneyin github.com/abingham/emacs-ycmd (kullandığı not emacs müşteri için yerine github.com/Valloric/ycmd değil github.com/Valloric/YouCompleteMe ). Şirket modunda çalışır (burada diğer cevaplar tarafından önerilir), bu nedenle Emacs geri kalanıyla iyi bir şekilde bütünleşir. Ycmd ve company-ycmd'yi MELPA'dan yükleyebilirsiniz ( sprunge.us/LXGY benim yapılandırmamdır); ve ycmd için derleme talimatlarını izleyin. Tek sorun sizin gibi bir dosya halinde derleme bayrakları koymak gerekir olduğunu github.com/Valloric/ycmd/blob/master/examples/...
unhammer

1

CEDET'ten kaynak repo + ECB + gtags + cscope'tan memnun oldum. Bununla birlikte, bu yazı hakkında deneyeceğim pek çok öneri var.


1
Tüm bu araçların birlikte çalışmasını sağlamak için ne yapmanız gerektiğini açıklayabilir misiniz?
nispio

4
Şu anda bu neredeyse yanlış bir yorum gibi görünüyor. :-) Nazik davranırsanız, lütfen biraz detaylandırın.
Malabarba

Özürlü olduğum için üzgünüm. StackExchange App alışmak için kubbeyi alır. Bu çözüm, sembol gezinme ve kaynağın analizi ile ilgili # 4 yanıt verir. CEDET, elbette, anlamsal içerir. ECB, Emacs Kod Tarayıcısıdır ve yöntemleri listelemek ve sembol bilgilerini bildirmek için CEDET kullanır. Gtags ve Cscope, kaynak tabanından gelen sembol bilgileri tabloları oluşturur (ayrıca dümen de yapar) ve etiketler veya sembollerle gezinmeye izin vermek için Emacs ile bütünleşir.
Clay Haapala

1

Yukarıdaki parçalarda da belirtildiği gibi, mermi (isteğe bağlı olarak dümen ile) proje yönetimi için mükemmel bir çözümdür.

Ycmd, kod tamamlama ve bir miktar gezinme için mükemmeldir ve bunun için en iyi istemci emacs-ycmd'dir (tam açıklama: emacs istemcisini yazdım.)

"Etiketler" ve indeksleme için, bulduğum en iyi genel çözüm kod araştırmasıdır (daha fazla açıklama: Bunu ben de yazdım.) Gerçekten sadece regex araması yapması oldukça aptalca, ama cayır cayır yanan hızlı ve genellikle ihtiyacınız olan her şey ve birden çok dilde iyi çalışıyor.

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.