Saya mengerjakan proyek C ++, dan saya membaca panduan Alex Ott untuk CEDET dan utas lain tentang tag di StackOverflow, tetapi saya masih bingung tentang bagaimana Emacs berinteraksi dengan sistem tag yang berbeda ini untuk memfasilitasi pelengkapan otomatis, mencari definisi, navigasi sumber basis kode atau pratinjau dokumen-string.
Apa perbedaan (misalnya dalam hal fitur) antara
etags
,ebrowse
,exuberant ctags
,cscope
,GNU Global
danGTags
? Apa yang harus saya lakukan untuk menggunakannya di Emacs ?Apakah saya memerlukan semantik / senator (CEDET) jika saya ingin menggunakan tag untuk menavigasi / simbol pelengkapan otomatis?
Apa yang dibawa semantik ke tabel di atas utilitas tag yang berbeda ini? Bagaimana antarmuka dengan alat-alat ini?
sumber
GTags
proyek yang Anda tautkan cukup mati. Jika seseorang membicarakannyagtags
, mungkin yang mereka maksud adalah GNU Global.Jawaban:
Itu pertanyaan yang bagus seperti yang baru-baru ini saya baca di sini, jadi saya akan mencoba menjelaskan perbedaannya secara lebih rinci:
Butir 1:
etags
danctags
keduanya menghasilkan file indeks (alias tag / TAGS) dari objek bahasa yang ditemukan di file sumber yang memungkinkan item ini ditemukan dengan cepat dan mudah oleh editor teks atau utilitas lain. Tag menandakan objek bahasa yang entri indeksnya tersedia (atau, sebagai alternatif, entri indeks yang dibuat untuk objek itu). Tag yang dihasilkan oleh ctag lebih kaya dalam hal metadata, tetapi Emacs tidak dapat menafsirkan data tambahan, jadi Anda harus mempertimbangkannya kurang lebih sama (keuntungan utamactags
adalah dukungannya untuk lebih banyak bahasa). Penggunaan utama untuk file tag adalah mencari kelas / metode / fungsi / konstanta / dll deklarasi / definisi.cscope
jauh lebih kuat (setidaknya sejauh menyangkut C / C ++ dan Java). Sementara itu beroperasi pada prinsip yang kurang lebih sama (menghasilkan file metadata yang berguna) ini memungkinkan Anda melakukan beberapa hal yang lebih menarik seperti menemukan semua referensi ke simbol, melihat di mana suatu fungsi dipanggil, dll (Anda dapat menemukan definisi juga) .Singkatnya:
ctags
satu memungkinkan Anda untuk menavigasi ke deklarasi / definisi simbol (yang oleh beberapa orang disebut pencarian satu arah ).ctags
adalah alat tujuan umum yang berguna untuk banyak bahasa.Di sisi lain (seperti yang disebutkan di halaman proyek)
cscope
memungkinkan Anda untuk:Seharusnya tidak mengherankan bagi siapa pun pada saat ini, bahwa ketika saya berurusan dengan proyek C / C ++ saya terlalu banyak menggunakan
cscope
dan tidak terlalu pedulictags
. Ketika berurusan dengan bahasa lain, situasinya jelas akan terbalik.Butir 2.
Untuk memiliki pelengkapan otomatis yang cerdas, Anda memerlukan parser kode sumber yang sebenarnya (seperti semantik), jika tidak, Anda tidak akan mengetahui jenis objek (misalnya) dalam aplikasi Anda dan metode yang dapat dipanggil. Anda dapat memiliki pelengkapan otomatis berdasarkan berbagai sumber, tetapi untuk mendapatkan hasil terbaik, Anda memerlukan pengurai. Hal yang sama berlaku untuk penyorotan sintaks - saat ini penyorotan sintaks dalam mode utama Emacs hanya didasarkan pada ekspresi reguler dan itu sangat rapuh dan rawan kesalahan. Mudah-mudahan dengan dimasukkannya semantik di Emacs 23.2 (dulu merupakan paket eksternal sebelum itu) kita akan mulai melihat lebih banyak kegunaan untuknya (seperti menggunakannya untuk menganalisis kode sumber buffer untuk menyorotnya dengan benar)
Karena semantik Emacs 24.1 dapat digunakan dari kerangka penyelesaian Emacs. Cara termudah untuk mengujinya adalah dengan membuka file kode sumber C dan mengetik M-TABatau C-M-imelihat semantik selesai secara otomatis untuk Anda. Untuk bahasa di mana semantik tidak diaktifkan secara default, Anda dapat menambahkannya baris berikut ke hook mode utama pilihan Anda:
Butir 3.
semantic membawa kesadaran kode yang sebenarnya (untuk beberapa bahasa yang saat ini mendukung) dan menutup kesenjangan antara IDE dan Emacs. Ini tidak benar-benar berinteraksi dengan alat seperti
etags
dancscope
, tetapi itu tidak berarti Anda tidak dapat menggunakannya bersama.Semoga penjelasan saya masuk akal dan bermanfaat bagi Anda.
PS Saya tidak begitu akrab dengan
global
danebrowse
, tetapi jika memori melayani saya, mereka menggunakan etag.sumber
cscope
Emacs? Saya membaca tentangxcscope.el
EmacsWiki di sini tetapi saya tidak dapat menemukan tautan ke file tersebut. Selain itu,.el
file apa yang Anda gunakan untuk mendapatkancscope
Emacs?xcscope.el
terletak dicscope/contrib/xcscope/
(berada dalam paket distribusi). Itulah yang saya gunakan.semantic
dibandingkan dengancscope
? Dalam hal menavigasi melalui kode sumber, apakah semantik menyediakan fungsionalitas yangcscope
tidak? Apakah Anda menggunakan keduanya?For languages where semantic is not enabled by default, you can add the following line to your major mode hook of choice ... <code>
. Apa sebenarnya yang dilakukan cuplikan kode itu?Saya akan mencoba menambahkan beberapa penjelasan ke 1.
Apa itu?
Perbandingan
Kombinasi
Anda dapat menggabungkan dukungan bahasa yang kaya dari Exuberant Ctags dan fasilitas database GNU GLOBAL dengan menggunakan ctags sebagai parser plug-in GLOBAL.
Coba yang berikut ini: (masing-masing membutuhkan GLOBAL-6.0, Exuberant Ctags-5.5 atau lebih baru)
Membangun GNU GLOBAL:
Pemakaian:
(Namun, Anda tidak dapat memperlakukan referensi dengan metode ini, karena ctag tidak menangani referensi.)
Anda juga dapat menggunakan cscope sebagai klien GNU GLOBAL. Paket GLOBAL menyertakan perintah bernama 'gtags-cscope' yang merupakan port dari cscope, yaitu cscope itu sendiri kecuali menggunakan GLOBAL sebagai mesin telusur, bukan cscope.
Dengan kombinasi tersebut, Anda dapat menggunakan cscope untuk 41 bahasa.
Semoga berhasil!
sumber
File TAGS berisi definisi
Sebuah
TAGS
file berisi daftar di mana fungsi dan kelas didefinisikan. Ini biasanya ditempatkan di root proyek dan terlihat seperti ini:Ini memungkinkan Emacs menemukan definisi. Navigasi dasar sudah ada di dalamnya
find-tag
, tetapietags-select
memberikan UI yang lebih baik bila ada beberapa kecocokan.Anda juga dapat menggunakan file TAGS untuk pelengkapan kode. Misalnya, backend etag perusahaan menggunakan file TAGS .
File TAGS dapat dibuat dengan alat yang berbeda
ctags
(sebelumnya dikenal sebagai 'universal ctags' atau 'exuberant ctags') dapat menghasilkan file TAGS dan mendukung berbagai bahasa. Itu secara aktif dipertahankan di github.Emacs dikirimkan dengan dua program yang menghasilkan file TAGS, yang disebut
etags
danctags
. Emacs 'ctags
hanyaetags
dengan antarmuka CLI yang sama dengan ctag universal. Untuk menghindari kebingungan, banyak distro yang mengganti nama program ini (misalnyactags.emacs24
di Debian).Ada juga alat khusus bahasa untuk membuat file TAGS, seperti
jsctags
danhasktags
.Format file lainnya
ebrowse
adalah program C yang disertakan dengan Emacs. Ini mengindeks kode C / C ++ dan menghasilkanBROWSE
file. ebrowse.el menyediakan definisi dan penyelesaian find biasa. Anda juga dapat membukaBROWSE
file secara langsung di Emacs untuk mendapatkan gambaran umum tentang kelas / fungsi yang ditentukan basis kode.GNU Global memiliki format database sendiri yang terdiri dari a
GTAGS
,GRTAGS
danGPATH
file. Anda dapat membuat file-file ini dengangtags
perintah, yang mengurai kode C / C ++. Untuk bahasa lain, GNU Global dapat membaca file yang dibuat oleh ctag universal.GNU Global juga menyediakan antarmuka CLI untuk mengajukan pertanyaan yang lebih rumit, seperti 'di mana simbol ini disebutkan?'. Ia dikirimkan dengan paket Emacs gtags.el, tetapi ggtags.el juga populer untuk mengakses basis data GNU Global.
Cscope memiliki semangat yang mirip dengan GNU Global: ia mengurai C / C ++ ke dalam format database-nya sendiri. Itu juga dapat menjawab pertanyaan seperti 'temukan semua penelepon / panggilan dari fungsi ini'.
Lihat juga diskusi HN ini yang membandingkan global dan cscope .
Proyek Klien / Server
rtags mem-parsing dan mengindeks C / C ++ menggunakan server persisten. Ini menggunakan pengurai clang, sehingga menangani C ++ dengan sangat baik. Ini dikirimkan dengan paket Emacs untuk melakukan kueri ke server.
google-gtags adalah proyek tempat file TAGS yang besar akan disimpan di server. Saat Anda menanyakan server, itu akan memberikan subset dari file TAGS yang relevan dengan pencarian Anda.
Semantik (CEDET)
Semantic adalah paket Emacs bawaan yang berisi parser untuk C / C ++, sehingga dapat menemukan definisi juga. Itu juga dapat mengimpor data dari file TAGS, database csope, dan sumber lainnya. CEDET juga menyertakan fungsionalitas gaya IDE yang menggunakan data ini, misalnya membuat diagram UML dari hierarki kelas.
sumber
[jawaban diperbarui dari shigio ]
Saya akan mencoba menambahkan beberapa penjelasan untuk bagian 1 pertanyaan.
Apa itu?
TAGS
file yang merupakan format file tag untuk Emacs . Anda dapat menggunakan file Etagsetags.el
yang merupakan bagian dari Emacs.Ctags
adalah istilah umum untuk apa pun yang dapat menghasilkantags
file, yang merupakan format file tag asli untuk Vi. Universal Ctags (aliasUCtags
, sebelumnya Exuberant Ctags) juga dapat menghasilkan Etags dengan-e
opsi tersebut.cscope.in.out
,cscope.out
,cscope.po.out
) dan TUI . Dukungan Cscope sudah terpasang di Vim; Anda dapat menggunakan Cscope dari Emacs menggunakan paket xcscope.el . Ada juga GUI berbasis Cscope .Gtags
) adalah satu lagi sistem penandaan kode sumber (dengan perbedaan yang signifikan - lihat bagian selanjutnya), di dalamnya ia juga menghasilkan berkas tanda.Perbandingan
grep
mesin pencari yang mirip.less
(pager), Doxygen , dan browser web apa pun.gtags.el
melalui paket GLOBAL, tetapi ada juga banyak ekstensi elisp lainnya, termasuk xgtags.el, ggtags.el, anything-gtags.el, helm-gtags.el.Kombinasi
Anda dapat menggabungkan dukungan bahasa universal Ctags dengan fasilitas database Gtags dan banyak ekstensi dengan menggunakan Ctags sebagai pengurai plug-in GLOBAL :
Perhatikan lagi bahwa jika Anda menggunakan Ctags sebagai parser untuk Gtag Anda, Anda kehilangan kemampuan untuk menangani referensi (misalnya, penggunaan variabel, pemanggilan fungsi) yang seharusnya disediakan oleh Gtag. Pada dasarnya, Anda menukar pelacakan referensi Gtags untuk dukungan bahasa bawaan Ctag yang lebih besar.
Anda juga dapat menggunakan Cscope sebagai klien Gtag:
gtags-cscope
.Semoga berhasil!
sumber
--with-exuberant-ctags=...
saat ini mulai 2019 ada--with-universal-ctags
opsi. Haruskah itu diubah menjadi yang terakhir?Saya belum benar-benar memeriksanya, tetapi menurut manual CEDET ( http://www.randomsample.de/cedetdocs/common/cedet/CScope.html ):
semantik dapat menggunakan CScope sebagai back end untuk pencarian database. Untuk mengaktifkannya, gunakan:
Ini akan mengaktifkan penggunaan cscope untuk semua buffer C dan C ++.
CScope kemudian akan digunakan untuk pencarian di seluruh proyek sebagai cadangan ketika pencarian database semantik yang sudah ada mungkin belum mengurai semua file Anda.
sumber