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:
- 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?)
- 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.
- 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.
- 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.
- 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.
Jawaban:
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:
M-x compile
dapat mengakomodasi hampir semua hal dan membuat paging melalui kesalahan mudah (gunakan sajanext-error
). Anda dapat dengan mudah menyesuaikan berdasarkan per proyek menggunakan variabel direktori untuk mengaturcompile-command
. Anda dapat menjalankancompile
dengan proyektil menggunakanprojectile-compile-project
(C-c p c
).M-x compile
juga telah Anda bahas di sini - kesalahan biasanya berakhir satu per baris di*compilation*
buffer, dengan paging mudahnext-error
.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.sumber
projectile
dapat diintegrasikan secara langsung denganperspective
membuatperspective-per-project
switch proyek secara otomatis.semantic
ke # 4, semantik adalah paket yang hebat, mengerti kode Anda dan dapat melakukan banyak hal berguna dengan informasi itu.semantic
, dan saya pikir saya ingat bahwa ia memiliki dukungan C ++ yang tidak lengkap, tetapi saya telah menambahkannya ke jawabannya.Saya menggunakan panduan ini untuk mulai menggunakan Emacs sebagai C ++ IDE. Ini memperkenalkan Helm dan Proyektil yang membantu menjawab sejumlah pertanyaan Anda. Yakni,
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 h
menjalankanhelm-projectile
yang menggunakan Helm untuk menemukan file di proyek saat ini.Proyektil dapat membangun proyek Anda.
C-c p c
menjalankanprojectile-compile-project
yang mencoba menjalankan Make / SCons / CMake berdasarkan file yang tersedia. Saya tidak pernah harus mengkonfigurasi ini; selalu tahu apa yang harus dilakukan.Kesalahan muncul di buffer mereka sendiri ketika Anda menjalankan
projectile-compile-project
tetapi saya tidak yakin itu secantik yang Anda inginkan.Anda dapat menggunakan paket
helm-gtags
yang antarmuka dengangtags
program (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-dwim
dapat melompat ke segala penggunaan variabel atau fungsi, dan ketika dijalankan pada file header membuka file header itu.Saya belum mencoba ini.
Panduan yang tercantum memberikan informasi konfigurasi yang sangat eksplisit tentang cara memulai.
sumber
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 compile
seperti 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 global
di shell dan baca manual tentang variabel lingkungan GTAGSLIBPATH. Ada banyak plugin untuk menyediakan UX yang bagus berdasarkan Global untuk navigasi kode, saya sarankan ggtags.elJawaban 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.
sumber
CMakeLists.txt
?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 compile
secara luas dan mengikat kunci global untuk kesalahan berikutnya dan sebelumnya. Untuk mencari di dalam "proyek", saya biasanya hanya menggunakanM-x find-grep
. Perhatikan bahwa ia akan menggunakan binding kunci yang sama untuk kesalahan berikutnya dan sebelumnya.sumber
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-file
membuka file apa pun proyek. Ini memiliki banyak perintah lain yang beroperasi berdasarkan proyek.Flycheck memiliki dukungan untuk memeriksa sintaks menggunakan clang / gcc.
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
sumber
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 recompile
untuk meluncurkan perintah kompilasi terakhir Anda, sehingga Anda dapat menjalankan kompilasi Anda pertama kali, dan kemudian menggunakanrecompile
buffer apa pun.sumber
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.
sumber
Saya senang dengan CEDET dari repo sumbernya + ECB + gtags + cscope. Yang mengatakan, ada banyak saran di posting ini yang akan saya coba.
sumber
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.
sumber