Menggunakan Emacs sebagai IDE C / C ++ berfitur lengkap

50

Saya telah mencoba dan terus selama lebih dari setahun sekarang untuk menggunakan Emacs sebagai C / C ++ IDE. Saya hanya sedikit berhasil sejauh ini, tetapi telah mengalami beberapa dinding bata di sepanjang jalan. Saat ini saya mencoba menggunakan CEDET, tetapi saya kesulitan memahami bagaimana menggunakannya secara efektif.

Fitur yang saya cari dalam IDE adalah sebagai berikut:

  1. Manajemen "proyek" perangkat lunak. Saya ingin IDE saya memahami semua file yang membentuk proyek saya saat ini sehingga saya dapat melakukan fungsi seperti mencari dan mengganti dalam proyek saya. (Alangkah baiknya jika saya juga dapat mencapai ini tanpa mengotori pohon sumber saya dengan banyak file dukungan. Mengapa saya perlu lebih dari satu file proyek terpusat per proyek?)
  2. Kemampuan untuk membangun proyek saat ini dari dalam IDE, terlepas dari buffer yang saya kunjungi saat ini. Saya harus dapat mengikat kunci yang akan membangun proyek saat ini.
  3. Pelaporan kesalahan. Saya tidak ingin harus membaca lebih dari 500 baris output untuk menemukan kesalahan yang dilaporkan oleh alat build. Lebih disukai, kesalahan muncul di buffer mereka sendiri dengan satu baris per kesalahan.
  4. Kesadaran akan simbol-simbol di dalam proyek, dan di mana mereka didefinisikan. Saya ingin melompat ke definisi simbol apakah itu tinggal di file proyek saya atau di sistem termasuk file.
  5. Debugging visual. Saya ingin memiliki daftar pantauan variabel lokal yang diperbarui secara otomatis saat saya menelusuri kode. Saya ingin dapat mengatur breakpoint dalam kode untuk melihat baris kode mana yang akan dieksekusi selanjutnya.

Saya tahu bahwa masing-masing fitur ini ada karena saya memiliki masing-masing dari mereka bekerja pada satu waktu atau yang lain menggunakan EDE, Semantic, GDB, dll. Masalahnya adalah bahwa saya tidak pernah dapat memiliki semua fitur ini bekerja pada saat yang sama , karena setiap bagian biasanya harus dikonfigurasikan dengan sendirinya, dan biasanya terlalu banyak pekerjaan untuk mengetahui cara mengkonfigurasi semuanya sekaligus dan membuatnya bekerja bersama.

Solusi apa yang ada untuk mengubah Emacs menjadi IDE C / C ++ berfitur lengkap? Apakah Anda selalu harus mengkonfigurasi semuanya sedikit demi sedikit, atau adakah cara untuk mengatur semua fitur sekaligus?

EDIT: Jawaban yang bagus untuk pertanyaan ini tidak harus memenuhi kelima kriteria yang diberikan secara tepat. Saya hanya menyediakan daftar untuk memberikan ide yang lebih konkret tentang jenis fitur yang ingin saya lihat sebelum saya menganggap IDE sebagai "fitur lengkap." Sangat mungkin bahwa CEDET bisa sesuai dengan tagihan, tapi saya belum menemukan tutorial langkah demi langkah tentang cara mengaturnya dari awal.

nispio
sumber
6
Pertanyaan ini mungkin lebih baik dibagi menjadi beberapa. Anda mungkin memiliki banyak jawaban parsial, di mana tidak ada item yang mendapat perhatian yang layak.
Malabarba
2
Selain itu, item 1 mungkin merupakan duplikat dari emacs.stackexchange.com/questions/448/…
Malabarba
6
@Malabarba: Jika saya mengajukan lima pertanyaan terpisah itu mungkin duplikat. Inti dari pertanyaan ini adalah bahwa mungkin ada lima paket berbeda yang mencapai lima gol berbeda, tetapi mengonfigurasi kelima untuk bermain dengan baik satu sama lain tampaknya hampir mustahil. Jika jawabannya muncul sebagai "Emacs tidak dapat berfungsi sebagai IDE berfitur lengkap karena membutuhkan waktu yang tidak sebentar untuk mengkonfigurasi." maka jadilah itu.
nispio
4
Masing-masing poin dapat berupa pertanyaan itu sendiri (berpotensi digandakan), menempatkan semuanya dalam satu pertanyaan terkadang dapat menghasilkan jawaban yang berbeda karena interaksi paket.
Jonathan Leech-Pepin

Jawaban:

27

Level "IDE-ness" yang berbeda ada untuk bahasa yang berbeda, dan sayangnya Anda tidak akan pernah mendapatkan fitur IDE penuh tanpa konfigurasi (jika Anda tidak suka mengonfigurasi hal-hal, Anda mungkin tidak boleh menggunakan Emacs). CEDET bertujuan untuk menjadi solusi lengkap yang mencakup semua kebutuhan Anda untuk bahasa yang didukung, tetapi secara pribadi saya tidak pernah membuatnya berfungsi dengan baik; sebagai gantinya, saya menggunakan beberapa paket secara bersamaan untuk menutupi basis IDE saya. Saya akan membahas poin Anda secara berurutan, dengan beberapa solusi untuk berbagai bahasa yang saya tahu:

  1. proyektil adalah paket terdekat untuk memberikan pengalaman seperti IDE yang nyata. Ini memberikan banyak fungsionalitas yang berguna berdasarkan per proyek. Anda mungkin juga menginginkan semacam manajemen jendela / ruang kerja; Saya menggunakan solusi saya sendiri yang disebut wacspace , tetapi solusi bagus lainnya termasuk perspektif , workgroups , dan elscreen .
  2. Bahasa yang berbeda memiliki ide yang berbeda tentang apa itu "build", tetapi M-x compiledapat mengakomodasi hampir semua hal dan membuat paging melalui kesalahan mudah (gunakan saja next-error). Anda dapat dengan mudah menyesuaikan berdasarkan per proyek menggunakan variabel direktori untuk mengatur compile-command. Anda dapat menjalankan compiledengan proyektil menggunakan projectile-compile-project( C-c p c).
  3. M-x compilejuga telah Anda bahas di sini - kesalahan biasanya berakhir satu per baris di *compilation*buffer, dengan paging mudah next-error.
  4. Melompat ke simbol melibatkan "memahami kode Anda", dan di sinilah dukungan sangat bervariasi antar bahasa. Untuk Elisp, Anda dapat menggunakan elisp-slime-nav yang sangat baik , dan kemudian M-.melompat ke definisi. Berikut adalah beberapa paket yang memberikan dukungan serupa untuk bahasa lain: CIDER (untuk Clojure); SLIME (untuk Common Lisp); jubah (untuk Ruby); semantic atau clang-tag untuk C / C ++ (disclaimer: Saya juga tidak pernah menggunakan, jadi saya tidak tahu apakah mereka bekerja dengan baik). Jika semuanya gagal, Anda juga dapat menggunakan fasilitas TAGS bawaan Emacs menggunakan sesuatu seperti ctag yang meriah , tetapi saya belum pernah mendekati hasil yang dapat diterima dengan TAGS.
  5. Emacs memiliki dukungan yang sangat tersebar untuk para penentang. GDB dengan GUD adalah pilihan terbaik Anda untuk bahasa sejenis C; jika tidak, itu cukup banyak berdasarkan per bahasa. (Saya tidak berpikir debugging lintas bahasa benar-benar tujuan yang realistis.)
shosti
sumber
4
Sebagai node-sisi projectiledapat diintegrasikan secara langsung dengan perspectivemembuat perspective-per-projectswitch proyek secara otomatis.
Jonathan Leech-Pepin
Saya akan menambahkan catatan tentang semanticke # 4, semantik adalah paket yang hebat, mengerti kode Anda dan dapat melakukan banyak hal berguna dengan informasi itu.
Jordon Biondo
Saya tidak pernah benar-benar menggunakannya semantic, dan saya pikir saya ingat bahwa ia memiliki dukungan C ++ yang tidak lengkap, tetapi saya telah menambahkannya ke jawabannya.
shosti
15

Saya menggunakan panduan ini untuk mulai menggunakan Emacs sebagai C ++ IDE. Ini memperkenalkan Helm dan Proyektil yang membantu menjawab sejumlah pertanyaan Anda. Yakni,

  1. Proyektil mengelola proyek. Itu mencari pohon direktori untuk Makefile, SConstruct, Git repo, SVN repo, dan mungkin beberapa sistem membangun atau file kontrol versi lainnya untuk secara otomatis mempelajari file apa yang terkait dengan proyek saat ini. Sebagai contoh, C-c p hmenjalankan helm-projectileyang menggunakan Helm untuk menemukan file di proyek saat ini.

  2. Proyektil dapat membangun proyek Anda. C-c p cmenjalankan projectile-compile-projectyang mencoba menjalankan Make / SCons / CMake berdasarkan file yang tersedia. Saya tidak pernah harus mengkonfigurasi ini; selalu tahu apa yang harus dilakukan.

  3. Kesalahan muncul di buffer mereka sendiri ketika Anda menjalankan projectile-compile-projecttetapi saya tidak yakin itu secantik yang Anda inginkan.

  4. Anda dapat menggunakan paket helm-gtagsyang antarmuka dengan gtagsprogram (yang seharusnya tersedia di sistem Anda). Perhatikan bahwa gtag adalah proyek GNU dan karenanya tidak mungkin bekerja segera di Windows.

    Setelah dikonfigurasi, Helm menjadi sadar akan simbol dalam proyek dan dapat menavigasi ke definisi dan menggunakan lokasi. Misalnya helm-gtags-dwimdapat melompat ke segala penggunaan variabel atau fungsi, dan ketika dijalankan pada file header membuka file header itu.

  5. Saya belum mencoba ini.

Panduan yang tercantum memberikan informasi konfigurasi yang sangat eksplisit tentang cara memulai.

Patrick Steele
sumber
Saya telah menemukan panduan itu juga, dan menerapkannya. IMHO itu entah bagaimana kelas berat dan mengubah banyak interaksi emacs dasar terlalu banyak. Saya telah menonaktifkan sejumlah konfigurasi terkait helm karena mengganggu cara pintas biasa (seperti dengan mudah membuka direktori saat ini dalam buffer, atau membuka file dalam sub-dir dengan beberapa penekanan tombol). Menarik untuk dilihat, tetapi mungkin harus dicoba langkah demi langkah, tidak secara keseluruhan.
Stéphane Gourichon
9

Karena Anda meminta IDE C / C ++ berfitur lengkap sekarang, saya mungkin memenuhi syarat.

Saya menggunakan semua MS IDEs dari vc4 ke Visual Studio 2010, jadi saya sepenuhnya mengerti apa yang Anda inginkan.

Berita baiknya adalah bahwa Emacs bisa 95% sebagus Visual Studio, dan bisa melakukan lebih banyak lagi. tetapi Anda mungkin tidak tertarik pada bagian "lebih". Jadi saya akan fokus pada pertanyaan Anda saja.

Sekarang titik kuncinya, Anda HARUS MENGGUNAKAN CMake , bahkan aplikasi C ++ Anda hanya untuk windows! Akhir dari cerita. Tidak ada pilihan lain, saya tahu apa yang saya bicarakan. Jika Anda tidak menggunakan CMake, maka percuma untuk melanjutkan.

Jawaban untuk pertanyaan 1 : Anda tidak perlu mengatur apa pun, instal cpputils-cmake ( https://github.com/redguardtoo/cpputils-cmake ) yang mengatur plugin lain. Ini bahkan lebih nyaman daripada Visual Studio. Jadi per proyek setup tidak diperlukan. Untuk pencarian ganti benda, saya menggabungkan kekuatan bash / perl / git dan percol ( https://github.com/mooz/percol ), yang jauh lebih baik daripada IDE mana pun. periksa blog saya ( http://blog.binchen.org/categories/emacs.html ) dan my ~ / .bashrc ( https://gist.github.com/redguardtoo/01868d7a13817c9845e8#file-bashrc ). Misalnya, saya dapat mencari mengganti file di komit tertentu.

Jawaban untuk pertanyaan 2 : Ini sudah diatur oleh cpputils-cmake, Anda hanya perlu M-x compileseperti biasa.

Jawaban untuk pertanyaan 3 : sama dengan pertanyaan 2. Saya tidak tahu mengapa ini menjadi masalah. itu persis perilaku yang sama seperti VS, dengan binding kunci yang lebih baik.

Jawaban untuk pertanyaan 4 : Sekarang kebanyakan orang hanya menggunakan Gnu Global yang dapat dikombinasikan dengan cpputils-cmake. Saya mengerti masalah sebenarnya adalah mendeteksi direktori yang berisi semua header C ++ yang disertakan secara otomatis . Itu bisa dilakukan dengan cpputils-cmake, yang lainnya mudah. Silakan man globaldi shell dan baca manual tentang variabel lingkungan GTAGSLIBPATH. Ada banyak plugin untuk menyediakan UX yang bagus berdasarkan Global untuk navigasi kode, saya sarankan ggtags.el

Jawaban untuk pertanyaan 5 : Debugging Visual, Banyak orang merekomendasikan M-x gdb-many-window, saya mencobanya tetapi tidak berhasil. Itu hanya karena versi gdb saya sudah usang (Petunjuk, saya menggunakan OSX 10.7.3) dan saya terlalu malas untuk meningkatkan OS saya. Tapi GUD baik-baik saja. Saya membuat beberapa tombol pendek untuk mencetak variabel untuk saya di jendela editor. semua hal debug dapat digunakan. Itu tidak memiliki tata letak tabel UX sebagai VS. tapi jujur ​​denganmu. Microsoft debugger UX juga bukan yang terbaik di dunia. Debugger ramah pengguna terbaik adalah DDD ( http://www.gnu.org/software/ddd/). Gud dan VS keduanya menyedot masalah ini. Hari ini saya hanya memasukkan kode logging dengan yasnippet yang merupakan plugin Emacs lainnya. Untuk memperjelas, saya tahu semua trik canggih tentang breakpoints, itu hanya karena saya terlalu malas untuk menerapkan trik ini. Memasukkan kode logging di Emacs jauh lebih mudah.

Ada banyak hal lain tentang IDE: penyelesaian kode? gunakan mode perusahaan, tidak perlu pengaturan. sintaks waktu nyata periksa? gunakan cpputils-cmake, lalu(flymake-mode 1)

Yang terbaik adalah, Anda perlu melakukan lebih sedikit pengaturan daripada VS jika Anda menggunakan pengaturan saya di ( https://github.com/redguardtoo/emacs.d ) Pengaturan itu memiliki judul "konfigurasi emacs purcell ditambah dukungan C / C ++" .

Sekarang ada sesuatu yang perlu saya tekankan, Emacs memberi Anda kebebasan penuh . Anda dapat memilih cara untuk memulai. cara sulit atau cara mudah.

Cara mudah adalah salin setup saya (atau setup siapa pun di github, hitung bintang pada awalnya), dalam 5 menit Anda akan memiliki C ++ IDE yang berfungsi penuh. VS belum selesai memulai dalam 5 menit itu.

Cara yang sulit adalah men-tweak pengaturan dari awal. Jika Anda memilih cara yang sulit, maka jangan mengeluh Emacs . Itu pilihanmu.

BTW, dalam jangka panjang, sedikit pengetahuan Emacs Lisp mungkin bisa membantu. Saya pikir ini sepele untuk pengembang C ++ profesional dibandingkan waktu yang saya buang di MS sh * t. Beberapa tahun yang lalu MS secara diam-diam meningkatkan runtime VC mereka di beberapa pembaruan windows. Itu membuat produk saya berjalan baik di komputer perusahaan tetapi jatuh di komputer pelanggan .

Setelah kejadian itu, saya mulai mengerti Richard Stallman.

chen bin
sumber
1
Menarik. "Anda HARUS MENGGUNAKAN CMake" -> Jadi, Anda mengatakan bahwa ketika mengerjakan paket perangkat lunak bebas acak yang menggunakan autoconf atau skrip pribadi, Anda harus menulis pembungkus CMakeLists.txt?
Stéphane Gourichon
1
Anda dapat menggunakan GNU Global sebagai gantinya, tidak sesempurna solusi cmake. Tetapi lebih fleksibel, lihat blog.binchen.org/posts/emacs-as-c-ide-easy-way.html
chen bin
5

Untuk # 4, saya sangat merekomendasikan ctag riang dan dukungan tag bawaan, yang telah saya gunakan selama bertahun-tahun. Atau, saya baru saja beralih menggunakan GNU Global dan paket ggtags dan menemukan mereka sedikit lebih unggul; meskipun, mereka berfungsi hampir identik. Keduanya bekerja dengan hampir tanpa konfigurasi. Untuk fitur IDE lainnya, saya juga suka paket lengkapi-otomatis. Demikian juga, saya menggunakan M-x compilesecara luas dan mengikat kunci global untuk kesalahan berikutnya dan sebelumnya. Untuk mencari di dalam "proyek", saya biasanya hanya menggunakan M-x find-grep. Perhatikan bahwa ia akan menggunakan binding kunci yang sama untuk kesalahan berikutnya dan sebelumnya.

B4 tangan
sumber
4

Manajemen perangkat lunak "proyek." Saya ingin IDE saya memahami semua file yang membentuk proyek saya saat ini sehingga saya dapat melakukan fungsi seperti mencari dan mengganti dalam proyek saya. (Alangkah baiknya jika saya juga dapat mencapai ini tanpa mengotori pohon sumber saya dengan banyak file dukungan. Mengapa saya perlu lebih dari satu file proyek terpusat per proyek?)

Proyektil tampaknya merupakan pilihan terbaik untuk manajemen proyek di emacs. Ini sangat ringan, Anda tidak perlu menambahkan file tambahan ke proyek Anda. Ini akan mencoba mendeteksi proyek secara otomatis untuk Anda berdasarkan keberadaan file khusus tertentu. Misalnya - jika Anda bekerja dalam git repo, proyektil akan memperlakukannya sebagai proyek (file apa pun yang dilacak oleh git akan diperlakukan sebagai bagian dari proyek), maka Anda akan dapat menggunakan perintah seperti projectile-find-filemembuka file apa pun proyek. Ini memiliki banyak perintah lain yang beroperasi berdasarkan proyek.

Pelaporan kesalahan. Saya tidak ingin harus membaca lebih dari 500 baris output untuk menemukan kesalahan yang dilaporkan oleh alat build. Lebih disukai, kesalahan muncul di buffer mereka sendiri dengan satu baris per kesalahan.

Flycheck memiliki dukungan untuk memeriksa sintaks menggunakan clang / gcc.

Kesadaran akan simbol-simbol di dalam proyek, dan di mana mereka didefinisikan. Saya ingin melompat ke definisi simbol apakah itu tinggal di file proyek saya atau di sistem termasuk file

Saya akan merekomendasikan Anda untuk melihat rtags . Ini menggunakan dentang sebagai backend dan pekerjaan yang sangat bagus untuk melompat ke definisi dan penyelesaian. Ini juga dapat membantu Anda dengan # 3 karena juga terintegrasi dengan flymake untuk menampilkan kesalahan dan peringatan menggunakan dentang. Selain itu memiliki beberapa dukungan terbatas untuk refactoring. Pilihan lain untuk penyelesaian otomatis yang cerdas adalah mode ironi

Iqbal Ansari
sumber
2

Versi CEDET yang saat ini dikirimkan bersama Emacs sulit untuk dipasang, tetapi versi yang bisa Anda dapatkan di situs resmi lebih mudah dibuat, dan dapat menjawab kebutuhan # 2 dan # 4 Anda.

EDE CEDET memungkinkan Anda untuk mengelola misalnya proyek makefile dan automake, menambahkan target padanya, dan mengaitkan file dengan target. Anda kemudian dapat mengkompilasi proyek Anda menggunakan perintah EDE. Karena menggunakan mode kompilasi bawaan Emacs, kebutuhan Anda # 3 juga terpenuhi.

Semantic CEDET memiliki parser untuk beberapa bahasa, termasuk C ++. Itu dapat mengambil tag yang didefinisikan dalam file, seperti ctag bersemangat dan GNU Global, tetapi juga memiliki fitur pelengkapan otomatis dan melompat yang akurat. Jika Anda memiliki dua metode yang disebut "foo", lompatan Semantic cukup pintar untuk membawa Anda pada yang benar.

Untuk # 1, saya pribadi menggunakan proyektil , dan saya berhasil menggunakan GDB untuk # 5 beberapa waktu lalu.

Petunjuk # 3: Jika EDE berlebihan bagi Anda, Emacs memiliki perintah M-x recompileuntuk meluncurkan perintah kompilasi terakhir Anda, sehingga Anda dapat menjalankan kompilasi Anda pertama kali, dan kemudian menggunakan recompilebuffer apa pun.

Steven Rémot
sumber
1

Untuk # 4, tampaknya menjadi proyek baru yang disebut YouCompleteme , dan klien Emacs yang sesuai yang tampaknya menjadi hal keren berikutnya. Karena menggunakan dentang, ia memiliki tampilan kode yang lebih baik daripada tag atau global.

rlazo
sumber
1
Terima kasih atas sarannya, tetapi karena saya mencari hal-hal yang terintegrasi dengan baik bersama-sama, saya tidak yakin bahwa mencoba untuk mendapatkan salah satu fitur dengan menggunakan plugin Vim dengan prototipe klien Emacs adalah titik awal terbaik.
nispio
3
Cobalah github.com/abingham/emacs-ycmd sebagai gantinya untuk klien emacs (perhatikan bahwa ia menggunakan github.com/Valloric/ycmd , bukan github.com/Valloric/YouCompleteMe ). Ini bekerja dengan mode perusahaan (direkomendasikan oleh jawaban lain di sini) sehingga ia berintegrasi dengan baik dengan seluruh Emacs. Anda dapat menginstal ycmd dan perusahaan-ycmd dari MELPA ( sprunge.us/LXGY adalah konfigurasi saya); dan ikuti instruksi pembuatan untuk ycmd. Satu-satunya tantangan adalah Anda perlu meletakkan flag kompilasi Anda ke file seperti github.com/Valloric/ycmd/blob/master/examples/…
unhammer
1

Saya senang dengan CEDET dari repo sumbernya + ECB + gtags + cscope. Yang mengatakan, ada banyak saran di posting ini yang akan saya coba.

Clay Haapala
sumber
1
Bisakah Anda menjelaskan apa yang harus Anda lakukan untuk membuat semua alat itu bekerja bersama?
nispio
4
Sekarang ini hampir seperti komentar yang salah tempat. :-) Jika Anda akan berbuat baik, tolong jelaskan sedikit.
Malabarba
Maaf karena singkat. Aplikasi StackExchange membutuhkan kubah untuk terbiasa. Solusi ini menjawab # 4, berurusan dengan navigasi simbol dan analisis sumber. CEDET, tentu saja, mengandung semantik. ECB adalah Browser Kode Emacs, dan menggunakan CEDET untuk mendaftar metode dan melaporkan info simbol. Gtags dan Cscope sama-sama membuat tabel informasi simbol dari pangkalan sumber (helm juga melakukan ini), dan terintegrasi dengan Emacs untuk memungkinkan navigasi dengan tag atau simbol.
Clay Haapala
1

Seperti yang telah disebutkan dalam bagian-bagian di atas, proyektil (opsional dengan helm) adalah solusi cemerlang untuk manajemen proyek.

Ycmd sangat bagus untuk penyelesaian kode dan beberapa navigasi, dan klien terbaik untuk itu adalah emacs-ycmd (pengungkapan penuh: Saya menulis klien emacs.)

Untuk "tag" dan pengindeksan, solusi keseluruhan terbaik yang saya temukan adalah pencarian kode (lebih banyak pengungkapan: Saya menulis yang ini juga.) Cukup bodoh karena benar-benar hanya melakukan pencarian regex, tetapi sangat cepat dan umumnya yang Anda butuhkan , dan berfungsi dengan baik di berbagai bahasa.

abingham
sumber