Emacs için Etiketler: etags, ebrowse, cscope, GNU Global ve coşkulu ctag'ler arasındaki ilişki


102

C ++ projeleri üzerinde çalışıyorum ve Alex Ott'un CEDET kılavuzunu ve StackOverflow'daki etiketlerle ilgili diğer konuları inceledim , ancak Emacs'in otomatik tamamlamayı kolaylaştırmak için bu farklı etiket sistemleriyle nasıl arayüz oluşturduğu, tanımların aranması, kaynakta gezinme konusunda hala kafam karıştı. kod tabanı veya doc dizelerinin önizlemesi.

  1. Arasında (örneğin özellikleri açısından) fark nedir etags, ebrowse, exuberant ctags, cscope, GNU Globalve GTags? Bunları Emacs'ta kullanmak için ne yapmam gerekiyor ?

  2. Sembollerde gezinmek / otomatik tamamlama için etiketleri kullanmak istersem semantik / senatör (CEDET) gerekir mi?

  3. Anlambilim, bu farklı etiket araçlarının üstündeki tabloya ne getiriyor? Bu araçlarla nasıl arayüz oluşturuyor?


2
Bakılırsa gövde , GTagssen bağlantılı proje oldukça öldü. Birisi hakkında konuşuyorsa gtags, muhtemelen GNU Global'den bahsediyordur.
Gordon Gustafson

Exuberant Ctag'lerin sürdürülen çatalı Universal Ctag'leri karışıma ekleyin :) ggtags bunun için Emacs paketidir.
legends2k

Yanıtlar:


71

Bu, yakın zamanda burada okuduğum gibi iyi bir soru, bu yüzden farkı daha ayrıntılı olarak açıklamaya çalışacağım:

1. Nokta:

etagsve ctagsher ikisi de kaynak dosyalarda bulunan ve bu öğelerin bir metin düzenleyici veya başka bir yardımcı program tarafından hızlı ve kolay bir şekilde bulunmasına izin veren dil nesnelerinin bir dizin (aka tag / TAGS) dosyası oluşturur. Bir etiket, kendisi için bir dizin girişinin mevcut olduğu bir dil nesnesini (veya alternatif olarak, o nesne için oluşturulan dizin girişini) belirtir. Ctag'ler tarafından oluşturulan etiketler, meta veriler açısından daha zengindir, ancak Emacs ek verileri yine de yorumlayamaz, bu nedenle onları aşağı yukarı aynı şekilde değerlendirmelisiniz (ana avantajı, ctagsdaha fazla dili desteklemesidir). Etiket dosyalarının birincil kullanımı, sınıf / yöntem / işlev / sabit / vb bildirimi / tanımları aramaktır.

cscopeçok daha güçlü bir canavar (en azından C / C ++ ve Java söz konusu olduğunda). Aşağı yukarı aynı ilkeyle çalışırken (yararlı meta verilerden oluşan bir dosya oluşturmak), bir sembole yönelik tüm referansları bulma, bir işlevin nerede çağrıldığını görme vb. Gibi daha ilginç şeyler yapmanıza olanak tanır (tanımları da bulabilirsiniz) .

Özetlersek:

ctagsbiri sembol bildirimine / tanımlarına gitmenize izin verir (bazıları tek yönlü arama olarak adlandırır ). ctagsbirçok dil için yararlı olan genel amaçlı bir araçtır.

Öte yandan (projenin sayfasında belirtildiği gibi) cscopeşunları yapmanıza izin verir:

  • Bir sembolün beyanına git
  • Bir sembole yönelik tüm referansların seçilebilir bir listesini göster
  • Herhangi bir genel tanım arayın
  • Bir işlev tarafından çağrılan işlevler
  • Bir işlevi çağıran işlevler
  • Bir metin dizesi arayın
  • Normal bir ifade kalıbı arayın
  • Bir dosya bul
  • Bir dosya dahil tüm dosyaları bul

Bu noktada hiç kimseyi şaşırtmamalı, C / C ++ projeleri ile uğraşırken yoğun bir şekilde kullanıyorum cscopeve çok az önemsiyorum ctags. Diğer dillerle uğraşırken durum açıkça tersine dönecektir.

2. Nokta.

Akıllı otomatik tamamlamaya sahip olmak için gerçek bir kaynak kodu ayrıştırıcısına (semantik gibi) ihtiyacınız vardır, aksi takdirde uygulamalarınızdaki nesnelerin türlerini (örneğin) ve bunlarda çağrılabilecek yöntemleri bilemezsiniz. Pek çok farklı kaynağa dayalı bir otomatik tamamlamaya sahip olabilirsiniz, ancak en iyi sonuçları elde etmek için nihayetinde bir ayrıştırıcıya ihtiyacınız olacak. Aynısı sözdizimi vurgulama için de geçerli - şu anda Emacs ana modlarında sözdizimi vurgulama sadece normal ifadelere dayanıyor ve bu çok kırılgan ve hataya açık. Umarım Emacs 23.2'ye semantik dahil edildiğinde (ondan önce harici bir paketti) bunun için daha fazla kullanım görmeye başlayacağız (uygun şekilde vurgulamak için bir arabellek kaynak kodunu analiz etmek gibi)

Emacs 24.1 semantik, Emacs tamamlama çerçevesinden kullanılabilir. Bunu test etmenin en kolay yolu, bir C kaynak kodu dosyası açıp yazmak M-TABveya C-M-isizin için anlamsal olarak otomatik olarak tamamlandığını izlemektir. Anlambilimin varsayılan olarak etkinleştirilmediği diller için, ana mod kancanıza aşağıdaki satırı ekleyebilirsiniz:

(add-to-list 'completion-at-point-functions 'semantic-completion-at-point-function)

3. Nokta.

anlambilim, gerçek kod farkındalığını getirir (şu anda desteklediği birkaç dil için) ve IDE'ler ile Emacs arasındaki boşluğu kapatır. Gerçekten etagsve gibi araçlarla arayüz oluşturmaz cscope, ancak bunları birlikte kullanamayacağınız anlamına gelmez.

Umarım açıklamalarım mantıklıdır ve sizin için yararlı olacaktır.

PS I ile oldukça aşina değilim globalve ebrowseancak bellek beni yanıltmıyorsa onlar ETAG'ları kullanımı yaptı.


1
Bu harika. Teşekkürler! cscopeEmacs'ta nasıl kullanabileceğimi biliyor musunuz ? Buradaxcscope.el EmacsWiki'yi okudum ama dosyaya bir bağlantı bulamadım. Ayrıca, Emacs ile almak için hangi dosyayı kullanıyorsunuz ? .elcscope
Amelio Vazquez-Reina

1
xcscope.eliçinde bulunur cscope/contrib/xcscope/(bu dağıtım paketinde bulunur). Ben öyle kullanıyorum.
Bojidar Batsov

Bir soru daha: Nasıl semantickarşılaştırılır cscope? Kaynak kodda gezinme açısından anlambilim, sağlamayan herhangi bir işlevsellik sağlıyor cscopemu? İkisini de kullanıyor musunuz?
Amelio Vazquez-Reina

4
GNU Global'in etag kullandığına inanmıyorum, btw. IIRC, hem sorgulama hem de (özellikle) etiketleri güncellemek için sayısız performans avantajına sahip olan (düz bir metin dosyasını taramak yerine) 'uygun' bir veritabanı tutar ve sorgular.
phils

@BozhidarBatsov dediğinde For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>. Bu kod parçacığı tam olarak ne yapıyor?
Amelio Vazquez-Reina

45

1'e bazı açıklamalar eklemeye çalışacağım.

Bu ne?

  • Etags, Emacs için etiket dosyası olan 'TAGS' dosyasını oluşturma komutudur. Dosyayı emacs paketinin bir parçası olan etags.el ile kullanabilirsiniz.
  • Ctags, vi için etiket dosyası olan 'etiketler' dosyası oluşturmak için bir komuttur. Exuberant Ctags'in halefi olan Universal Ctags, 41'den fazla programlama dilini destekleyen -e seçeneği ile 'TAGS' dosyası oluşturabilir.
  • Cscope, C dili için hepsi bir arada kaynak kodu tarama aracıdır. Kendi ince CUI (karakter kullanıcı arayüzü) ve etiket veri tabanlarına (cscope.in.out, cscope.out, cscope.po.out) sahiptir. Emacs'ın cscope paketini cscope paketinin bir parçası olan xcscope.el kullanarak kullanabilirsiniz.
  • GNU GLOBAL bir kaynak kodu etiketleme sistemidir. Yukarıdaki araçlara benzer olmasına rağmen, herhangi bir düzenleyiciye bağımlı olması ve komut satırı dışında kullanıcı arayüzü olmaması bakımından onlardan farklıdır. Gtags, GLOBAL (GTAGS, GRTAGS, GPATH) için etiket dosyaları oluşturma komutudur. GLOBAL paketinin bir parçası olan gtags.el kullanarak emacs'den GLOBAL'ı kullanabilirsiniz. Buna ek olarak, onun için birçok elisp kitaplığı vardır (xgtags.el, ggtags.el, herşey-gtags.el, helm-gtags.el, vb.).

Karşılaştırma

  • Ctags ve etags yalnızca tanımları ele alır. Cscope ve GNU GLOBAL sadece tanımları değil aynı zamanda referansları da ele alır.
  • Ctag'ler ve etag'ler düz bir metin etiketi dosyası kullanır. Cscope ve GNU GLOBAL, anahtar-değer etiketi veritabanlarını kullanır.
  • Cscope ve GNU GLOBAL, grep benzeri bir arama motoruna ve etiket dosyalarının artımlı güncelleme özelliğine sahiptir.

Kombinasyon

Ctag'leri GLOBAL eklenti ayrıştırıcısı olarak kullanarak Universal Ctags'in zengin dil desteğini ve GNU GLOBAL'ın veritabanı imkanını birleştirebilirsiniz.

Aşağıdakileri deneyin: (sırasıyla GLOBAL-6.5.3 + ve Evrensel Ctag'ler gerektirir)

GNU GLOBAL Oluşturma:

$ ./configure --with-universal-ctags=/usr/local/bin/ctags
$ sudo make install

Kullanım:

$ export GTAGSCONF=/usr/local/share/gtags/gtags.conf
$ export GTAGSLABEL=new-ctags
$ gtags                     # invokes Universal Ctags internally
$ emacs -f gtags-mode       # load gtags.el

(Bununla birlikte, referansları bu yöntemle ele alamazsınız çünkü ctag'ler referansları işlemez.)

Cscope'u GNU GLOBAL istemcisi olarak da kullanabilirsiniz. GLOBAL paketi, bir cscope portu olan 'gtags-cscope' adında bir komut içerir, yani cscope yerine GLOBAL'ı arama motoru olarak kullanması dışında cscope'un kendisidir.

$ gtags-cscope          # this is GLOBAL version of cscope

Kombinasyonlar ile 41 dil için cscope kullanabilirsiniz.

İyi şanslar!


1
Debian ve Ubuntu gibi türevleri kullanan kullanıcılar için: GNU GLOBAL web sayfası, bu Linux dağıtımlarıyla birlikte gelen .deb paketlerinin tarihli olduğu ve kullanılmaması gerektiği konusunda uyarır. Benim durumumda GLOBAL 5.7.1 sürümündeydi ve gtags.el, ggtags.el veya helm-gtags.el'i Emacs 24 üzerinde düzgün bir şekilde çalıştıramadım. GNU GLOBAL 6.5'i Exuberant Ctags ( 5.8 kullandım) bir muamele yaptım. (Mükemmel işaretçiler için teşekkürler @shigio).
Rob

9

TAGS dosyaları tanımları içerir

Bir TAGSdosya, işlevlerin ve sınıfların tanımlandığı yerlerin listesini içerir. Genellikle bir projenin köküne yerleştirilir ve şuna benzer:

^L
configure,3945
as_fn_success () { as_fn_return 0; }^?as_fn_success^A180,5465
as_fn_failure () { as_fn_return 1; }^?as_fn_failure^A181,5502
as_fn_ret_success () { return 0; }^?as_fn_ret_success^A182,5539
as_fn_ret_failure () { return 1; }^?as_fn_ret_failure^A183,5574

Bu, Emacs'ın tanımları bulmasını sağlar. Temel gezinme yerleşiktir find-tag, ancaketags-select birden fazla eşleşme olduğunda daha güzel bir kullanıcı arayüzü sağlar.

Kod tamamlama için TAGS dosyalarını da kullanabilirsiniz. Örneğin, şirketin etags arka ucu TAGS dosyalarını kullanır .

TAGS dosyaları farklı araçlarla oluşturulabilir

ctags(önceden 'evrensel ctag'ler' veya 'coşkulu ctag'ler' olarak biliniyordu) TAGS dosyaları oluşturabilir ve en geniş dil yelpazesini destekler. Aktif olarak github'da tutulur.

Emacs, TAGS dosyalarını oluşturan etagsve adı verilen iki programla birlikte gelir ctags. Emacs ctagsadildir etagsevrensel ctags aynı CLI arayüzü ile. Karışıklığı önlemek için, birçok dağıtım bu programları yeniden adlandırır (örn.ctags.emacs24 Debian'da).

TAGS dosyalarını oluşturmak için dile özgü araçlar da vardır, örneğin jsctagsvehasktags .

Diğer dosya formatları

ebrowseEmacs ile birlikte gelen bir C programıdır. C / C ++ kodunu indeksler ve bir BROWSEdosya oluşturur . ebrowse.el olağan bulma tanımını ve tamamlanmasını sağlar. BROWSEKod tabanı tanımlı sınıflara / fonksiyona genel bir bakış için dosyayı doğrudan Emacs'ta da açabilirsiniz .

GNU Genel bir oluşmaktadır kendi veritabanı biçimi vardır GTAGS, GRTAGSve GPATHdosyanın. Bu dosyaları gtags, C / C ++ kodunu ayrıştıran komutla oluşturabilirsiniz. Diğer diller için, GNU Global evrensel ctag'ler tarafından oluşturulan dosyaları okuyabilir.

GNU Global ayrıca, 'bu sembolden nerede bahsediliyor?' Gibi daha karmaşık sorular sormak için bir CLI arayüzü sağlar. Emacs paketi gtags.el ile birlikte gelir, ancak ggtags.el aynı zamanda GNU Global veritabanlarına erişim için de popülerdir.

Cscope özü itibariyle GNU Global'e benzer: C / C ++ 'yı kendi veritabanı biçimine ayrıştırır. Ayrıca 'bu işleve ait tüm arayanları / arayanları bul' gibi soruları da yanıtlayabilir.

Global ve cscope'u karşılaştıran bu HN tartışmasına da bakın .

İstemci / Sunucu projeleri

rtags , kalıcı bir sunucu kullanarak C / C ++ ' ayrıştırır ve dizine ekler . Clang ayrıştırıcısını kullanır, dolayısıyla C ++ 'yı gerçekten iyi kullanır. Sunucuyu sorgulamak için bir Emacs paketi ile birlikte gelir.

google-gtags , büyük bir TAGS dosyasının bir sunucuda depolanacağı bir projeydi. Sunucuyu sorguladığınızda, aramanızla alakalı TAGS dosyasının bir alt kümesini sağlar.

Anlamsal (CEDET)

Anlamsal, C / C ++ için bir ayrıştırıcı içeren yerleşik bir Emacs paketidir, böylece tanımları da bulabilir. Ayrıca TAGS dosyalarından, csope veritabanlarından ve diğer kaynaklardan verileri içe aktarabilir. CEDET ayrıca bu verileri kullanan, örneğin sınıf hiyerarşilerinin UML diyagramlarını oluşturan IDE stili işlevselliğini de içerir.


7

[cevap shigio'dan güncellendi ]

Sorunun 1. bölümüne bazı açıklamalar eklemeye çalışacağım.

Bu ne?

  1. Etags , EmacsTAGS için etiket dosya formatı olan bir dosya oluşturur . Emacs'ın etags.elparçası olan bir Etags dosyası kullanabilirsiniz .
  2. CtagstagsVi için yerel etiket dosyası formatı olan bir dosya oluşturabilen her şey için genel bir terimdir . Universal Ctag'ler ( UCtagseski adıyla Exuberant Ctags) da bu -eseçenekle Etag'ler oluşturabilir .
  3. Cscope kendi etiket veritabanları (ile (C ++ ve Java için daha az desteği ile) C için bir all-in-one kaynak kod tarama aracıdır cscope.in.out, cscope.out, cscope.po.out) ve TUI . Cscope desteği, Vim'de yerleşiktir; xcscope.el paketini kullanarak Emacs'ın Cscope'u kullanabilirsiniz . De vardır cscope tabanlı GUI .
  4. GNU GLOBAL (aka Gtags) yine başka bir kaynak kod etiketleme sistemidir (önemli farklılıklar vardır - sonraki bölüme bakın), çünkü aynı zamanda etiket dosyaları da üretir.

Karşılaştırma

  • Ctags ve Etags yalnızca tanımları (örneğin, değişkenler ve işlevlerin) ele alır. Cscope ve Gtags ayrıca referansları da ele alır.
  • Ctags ve Etags etiket dosyaları düzdür . Cscope ve Gtags etiket dosyaları, (örneğin) artımlı güncellemeye izin veren daha güçlü anahtar-değer veritabanlarıdır .
  • Cscope ve Gtags benzer bir greparama motoruna sahiptir.
  • Ctags, daha fazla dil ve veri formatı için yerleşik desteğe sahiptir: Universal Ctags ayrıştırıcılarının mevcut depodaki listesine bakın . UCtags ayrıca kendi ayrıştırıcınızı nasıl geliştireceğinizi de belgeledi .
  • Cscope ve Gtag'ler düzenleyiciden bağımsızdır.
  • Gtags kendi kullanıcı arayüzünü sağlamaz, ancak şu anda (Ekim 2016) komut satırı (CLI), Emacs ve akrabaları, Vi ve akrabaları, less(çağrı cihazı), Doxygen ve herhangi bir web tarayıcısından kullanılabilir.
  • Gtags gtags.el, GLOBAL paketi aracılığıyla sağlar , ancak xgtags.el, ggtags.el, any-gtags.el, helm-gtags.el dahil olmak üzere başka pek çok elisp uzantısı da vardır.

Kombinasyon

Universal Ctags'in zengin dil desteğini, GLOBAL eklenti ayrıştırıcısı olarak Ctag'leri kullanarak Gtags veritabanı tesisi ve çeşitli uzantılarla birleştirebilirsiniz :

# build GNU GLOBAL
./configure --with-exuberant-ctags=/usr/local/bin/ctags
sudo make install

# use it
export GTAGSCONF=/usr/local/share/gtags/gtags.conf
export GTAGSLABEL=ctags
gtags                     # invokes Universal Ctags internally
emacs -f gtags-mode       # load gtags.el

Gtag'lerinizin ayrıştırıcısı olarak Ctag'leri kullanırsanız, aksi takdirde Gtag'lerin sağlayacağı referansları (örn. Değişken kullanımı, işlev çağrıları) işleme yeteneğinizi kaybedeceğinizi tekrar unutmayın. Esasen, Ctag'lerin daha fazla yerleşik dil desteği için Gtag'lerin referans takibinden vazgeçersiniz.

Ayrıca Gtags bir istemci olarak cscope kullanabilirsiniz: gtags-cscope.

İyi şanslar!


Okuyorum: "Gtag'leriniz için ayrıştırıcı olarak Ctag'leri kullanırsanız, aksi takdirde Gtag'lerin sağlayacağı referansları (ör. Değişken kullanım, işlev çağrıları) işleme yeteneğinizi kaybedeceğinizi tekrar unutmayın. Esasen, Gtags'ın referans takibini Ctag'lerin daha büyük yerleşik dil desteği. " Bu, Emacs ile gönderilen eski ctag'ler için mi yoksa Universal Ctag'ler için de geçerli mi? Ayrıca, "Universal Ctag'in zengin dilini birleştir" okudum, ancak --with-exuberant-ctags=...şu anda 2019 itibariyle kullandığı kabuk snippet'inde bir --with-universal-ctagsseçenek var. İkincisiyle değiştirilmeli mi?
bgoodr

3

Aslında kontrol etmedim, ancak CEDET kılavuzuna göre ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):

anlambilim, CScope'u veritabanı aramaları için arka uç olarak kullanabilir. Etkinleştirmek için şunu kullanın:

 (semanticdb-enable-cscope-databases)

Bu, tüm C ve C ++ tamponları için cscope kullanımını sağlayacaktır.

Daha sonra CScope, önceden var olan anlamsal veritabanı aramaları tüm dosyalarınızı ayrıştırmamış olabilir.


1
Bu, Emacs 24.3.1'de, onunla birlikte gelen vanilya CEDET 2.0 kullanıldığında çalışmıyor gibi görünüyor (semanticdb-enable-cscope-databases yöntemi yok).
Rob
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.