Bagaimana cara mendapatkan penyelesaian kode dalam emacs?

20

Saya tahu bahwa emacs mendukung penyelesaian kode. Tapi sejujurnya saya belum pernah menjadi pembaca FAQ yang baik, setidaknya untuk sesuatu yang saya benar-benar baru. Jadi saya ingin tahu apa yang perlu saya unduh dan bagaimana membuatnya sehingga emacs dapat melakukan beberapa penyelesaian kode cerdas untuk saya di C ++, dan Java. Atau adakah paket yang menyelesaikan kode untuk banyak bahasa utama?

starcorn
sumber

Jawaban:

27

Cara dasar yang akan bekerja di semua jenis buffer di emacs adalah singkatan dinamis yang digunakan dengan menekan M-/(alias alt+ /)

Itu akan memperluas teks untuk menduplikasi string lain yang sudah ada di buffer Anda saat ini atau di buffer lain yang saat ini terbuka.

Untuk penyelesaian kode yang lebih luas yang khusus bahasa untuk C ++ atau Java (atau lainnya), Anda akan ingin melihat kode templating atau paket snippet. Ada beberapa yang dibahas dalam pertanyaan terkait ini di StackOverflow. Salah satu yang umum disebutkan dalam diskusi ini adalah yasnippet - ada demo screencast dalam posting ini di blog emacs .

Doug Harris
sumber
+1. Anda mungkin juga ingin complete.elmencoba perpustakaan standar . Ini sangat tua dan sedikit diketahui, tetapi jenis penyelesaian in-buffer yang disediakannya bisa bermanfaat. M-x find-library complete, lalu baca Komentar dalam file.
Drew
21

@ Doug jawaban agak ketinggalan zaman dan fokusnya adalah pada perluasan kode dengan menggunakan cuplikan yang telah ditentukan.

Saya pikir pertanyaan OP adalah tentang Intellisense (nama metode lengkap otomatis kelas, misalnya).

  1. hippie expand dulu populer, penganalisis sintaks adalah tag emacs . Jadi ia mendukung semua bahasa yang didukung ctag (termasuk C ++, Java). Tetapi hasilnya tidak sempurna karena ctag hanya menggunakan ekspresi reguler untuk menganalisis kode. Lihat init-hippie-expand.el saya untuk detailnya. Anda bisa mulai dengan memeriksa nilaihippie-expand-try-functions-list

  2. pelengkapan otomatis adalah yang modern dengan UI mewah (menu dropdown, bahkan di jendela konsol). Jika Anda menggunakan dentang sebagai backend. Intellisense jauh lebih baik. Untuk membuat dentang berfungsi, Anda perlu menginstal lengkapi-otomatis yang merupakan plugin lengkapi-otomatis. Ini hanya mendukung dukungan dentang bahasa (C / C ++ / Obj-C). Seperti yang ditunjukkan Sylvain Benner , Anda dapat menggunakan emacs-eclim sebagai java parsing back end yang sebenarnya memanggil executable of eclipse. Jadi pelengkapan otomatis dapat mendukung java. Lihat init-auto-complete.el saya untuk detailnya.

  3. semantic menyediakan UI dan mesin parsing ujung belakang. Itu lambat. UI dropdown OK tetapi membutuhkan X window. Hasil intellisense lebih baik daripada ctags. Dan dokumentasinya terlalu culun untukku. Lihat init-semantic.el untuk detailnya.

  4. modus perusahaan mirip dengan pelengkapan otomatis, perbedaannya adalah paket semuanya menjadi satu bundel. Misalnya, pengembang C ++ hanya perlu menginstal mode perusahaan (lengkapi-otomatis memerlukan plugin pihak ketiga). Perbedaan UI lainnya adalah perusahaan akan menunjukkan kandidat secara otomatis . Jadi, Anda menekan lebih sedikit tombol di perusahaan. Dimungkinkan untuk melakukan hal yang sama dalam pelengkapan otomatis setelah penyesuaian.

Singkatnya, pelengkapan otomatis, perusahaan adalah dua pilihan paling populer. Semantik dan hippie-ekspansi juga disambut tetapi kurang digunakan. Lainnya terlalu sepele untuk disebutkan dan fitur mereka sudah dibahas oleh empat besar. Misalnya, lengkapi-otomatis dapat menggunakan yasnippet sebagai sumber input (lengkapi-otomatis berikan UI, tetapi kandidat sebenarnya dihasilkan oleh yasnippet di belakang).

Saya sarankan untuk menggunakan pelengkap otomatis atau perusahaan sebagai plugin penyelesaian kode utama dan semantik atau hippie-expand sebagai plugin pelengkap .

Saya menggunakan mode perusahaan dan memperluas hippie karena,

  • Mode perusahaan sekarang (tahun 2017) lebih aktif dipertahankan daripada pelengkapan otomatis dan memiliki lebih banyak plugin pihak ketiga (misalnya, plugin lateks)

  • hippie-expand tidak terlalu aktif tetapi tidak menempati TABkunci yang menggunakan mode perusahaan / semantik / pelengkap otomatis

Jika Anda menggunakan mode perusahaan untuk C ++ / Java, Anda mungkin ingin memodifikasi company-backends.

Beberapa tips tentang mode perusahaan,

Anda mungkin perlu mengubah nilai company-backends. Sebagai contoh, anggaplah nilainya (company-eclim company-semantic company-clang (company-dabbrev-code company-gtags company-etags company-keywords)). Maka jika company-eclimbisa mendapatkan kandidat yang tidak nol, companyanggap Anda sedang menulis java, jadi TIDAK akan menjalankan backends setelahnya company-eclim.

Sekarang mari kita lihat (company-dabbrev-code company-gtags company-etags company-keywords). Keempat backend ini akan digunakan bersama. Misalnya, bahkan setelah company-dabbrev-codeberhasil menjemput kandidat yang tidak nol, tiga backend lainnya masih dieksekusi.

Di dunia nyata, seringkali perlu menyesuaikan kembali urutan backend atau menambahkan backend baru ( company-rtags, misalnya).

chen bin
sumber
manakah paket pelengkapan otomatis terbaik di Emacs 24 untuk lateks?
gelar doktor
@doctorate Saya pikir Anda perlu menggunakan lengkapi-otomatis dan sumbernya emacswiki.org/emacs/AutoCompleteSources , tapi saya seorang programmer alih-alih pengguna lateks, jadi sebaiknya Anda periksa dua kali di komunitas Google plus Emacs, banyak orang akademis di sana .
chen bin
harap dicatat mode perusahaan juga mendukung lateks. Jadi saya sarankan perusahaan daripada melengkapi-otomatis
chen bin
2

Jawaban singkat: Saya tidak tahu untuk emacs yang berguna untuk java. Perluasan dinamis tidak peduli dengan pustaka di jalur kelas Anda, itu tidak tahu apa-apa tentang kode yang Anda ketikkan itu hanya dapat diperluas ke teks yang sudah ada di salah satu buffer. JDE dan emacs-eclim mencoba menyediakan fungsionalitas ini tetapi secara pribadi saya tidak terkesan.

email hilang
sumber
0

Jawaban singkat: M-/

Jawaban panjang: RTFM :-)

Gyom
sumber
6
+1, Tuhan saya harap pertanyaan berikutnya yang saya lihat adalah "butuh bantuan menggunakan perintah RTFM"
rownage
@rownage: oh, thats `` info-emacs-manual'` ( C-h r)
SamB
1
Bagaimana dengan C-h k M-/?
Doug Harris