it-swarm-id.com

Menggunakan Emacs sebagai IDE

Saat ini alur kerja saya dengan Emacs ketika saya coding di C atau C++ melibatkan tiga jendela. Yang terbesar di sebelah kanan berisi file yang saya kerjakan. Bagian kiri dibagi menjadi dua, bagian bawah menjadi Shell yang saya gunakan untuk mengetikkan kompilasi atau membuat perintah, dan bagian atas sering berupa semacam dokumentasi atau file README yang ingin saya konsultasikan ketika saya sedang bekerja. Sekarang saya tahu ada beberapa pengguna Emacs yang cukup ahli di luar sana, dan saya ingin tahu apa yang secara fungsional berguna bagi Emacs jika tujuannya adalah menggunakannya sebagai IDE yang lengkap. Secara khusus, sebagian besar IDE biasanya memenuhi fungsi-fungsi ini adalah beberapa bentuk:

  • Editor kode sumber
  • Penyusun
  • Debugging
  • Pencarian Dokumentasi
  • Kontrol Versi
  • Fitur OO seperti pencarian kelas dan inspektur objek 

Untuk beberapa di antaranya, cukup jelas bagaimana Emacs dapat memenuhi fungsi-fungsi ini, tetapi bagaimana dengan sisanya? Juga, jika bahasa tertentu harus difokuskan, saya akan mengatakan itu harus C++. 

Sunting: Seorang pengguna menunjukkan bahwa saya seharusnya lebih spesifik ketika saya mengatakan 'bagaimana dengan yang lain'. Sebagian besar saya ingin tahu tentang kontrol versi yang efisien, serta pencarian dokumentasi. Misalnya, di SLIME cukup mudah untuk melakukan pencarian hyperspec cepat pada fungsi LISP. Apakah ada cara cepat untuk mencari sesuatu dalam dokumentasi C++ STL (jika saya lupa sintaks yang tepat dari hash_map , misalnya)?

163
user7545

Anda harus spesifik tentang apa yang Anda maksud dengan "sisanya". Kecuali untuk pemeriksa objek (yang saya sadari), emacs melakukan semua hal di atas dengan mudah:

  • editor (jelas)
  • kompiler - jalankan M-x compile dan masukkan perintah kompilasi Anda. Dari sana, Anda bisa M-x compile dan menggunakan default. Emacs akan menangkap kesalahan kompiler C/C++ (berfungsi terbaik dengan GCC) dan membantu Anda menavigasi ke baris dengan peringatan atau kesalahan.
  • Debugging - sama, ketika Anda ingin men-debug, ketik M-x gdb dan itu akan membuat buffer gdb dengan binding khusus
  • Pencarian Dokumentasi - emacs memiliki ikatan CScope yang sangat baik untuk navigasi kode. Untuk dokumentasi lain: Emacs juga memiliki pembaca manual, dan untuk semua yang lain, ada web dan buku.
  • kontrol versi - ada banyak ikatan Emacs untuk berbagai backend VCS (CVS, SCCS, RCS, SVN, GIT semuanya terlintas dalam pikiran)

Sunting: Saya menyadari jawaban saya tentang pencarian dokumentasi benar-benar berkaitan dengan navigasi kode. Berikut ini beberapa info penting: 

Pencarian Google tidak diragukan lagi akan mengungkapkan contoh lebih lanjut.

Seperti yang ditunjukkan oleh tautan kedua, mencari fungsi (dan apa pun) dalam dokumentasi lain dapat dilakukan, meskipun tidak didukung di luar kotak.

73
Ben Collins

Saya harus merekomendasikan Emacs Code Browser sebagai lingkungan gaya IDE yang lebih "tradisional" untuk emacs.

SUNTING: Saya juga sekarang merekomendasikan Magit sangat di atas antarmuka VCS standar di emacs.

29
baudtack

Alih-alih menjalankan perintah make di jendela Shell, sudahkah Anda mencoba kompilasi M-x? Ini akan menjalankan perintah make Anda, menampilkan kesalahan, dan dalam banyak kasus membuatnya sangat mudah untuk melompat ke baris kode yang menyebabkan kesalahan jika output menyertakan nama file dan nomor baris.

Jika Anda penggemar IDE, Anda mungkin juga ingin melihat paket speedbar emacs (M-x speedbar). Dan, jika Anda belum melakukannya, pelajari tentang cara menggunakan tabel tag untuk menavigasi kode Anda.

19
Bryan Oakley

Ada sudut-sudut emacs yang pernah ditemukan membuat Anda lebih produktif dengan cara yang tidak pernah Anda pikirkan. Seperti yang disebutkan orang lain, menggunakan tag adalah cara yang fantastis dan cepat untuk memperbesar kode sumber Anda dan menggunakan M-/(dabbrev-expand) sering kali melakukan apa yang Anda harapkan saat mengisi nama variabel. 

Menggunakan terjadi berguna untuk mendapatkan buffer dengan semua kemunculan ekspresi reguler dalam buffer. Itu sangat berguna ketika refactoring kode dan mencari fragmen kode atau penggunaan variabel, atau jika Anda menggunakan penanda TODO dalam file sumber Anda dan Anda ingin mengunjungi semuanya.

fungsi flush-lines, sort-numeric-field, replace-regexp dan rectangle dapat sangat berguna untuk mengambil dump dari beberapa alat dan mengonversinya menjadi data yang berguna seperti program elisp atau spreadsheet yang dibatasi koma. 

Saya menulis halaman tentang IDE seperti hal-hal yang dapat Anda lakukan dengan emacs 

http://justinsboringpage.blogspot.com/2007/09/11-visual-studio-tricks-in-emacs.html

Mempelajari elisp adalah cara hebat lainnya untuk menjawab bagi diri Anda sendiri apa lagi yang dapat dilakukan emacs di luar apa yang dapat dilakukan IDE tipikal. 

Misalnya saya telah membuat blog tentang menulis fungsi pembantu Perforce seperti menyalahkan (menulis sendiri berarti Anda dapat membuatnya berperilaku tepat seperti yang Anda inginkan) ...

http://justinsboringpage.blogspot.com/2009/01/who-changed-line-your-working-on-last.html

Saya juga menulis kode yang secara dinamis membuat komentar untuk suatu fungsi pada titik, yang cocok dengan standar pengkodean yang saya kerjakan. 

Tidak ada kode elisp saya yang sangat bagus, dan sebagian besar sudah ada di perpustakaan, tetapi sangat berguna untuk membuat emacs melakukan hal-hal khusus yang baru saja muncul selama hari kerja. 

15
justinhj

Anda dapat menemukan deskripsi terperinci tentang emacs & integrasi kontrol versi di situs saya . Saya juga sedang mengerjakan artikel tentang penggunaan Emacs sebagai Lingkungan Pengembangan untuk banyak bahasa - C/C++, Java, Perl, LISP/Skema, Erlang, dll ...

10
Alex Ott

Oke, semua orang di sini memberikan petunjuk sempurna untuk menjadikan emacs sebuah IDE yang hebat. 

Tetapi siapa pun harus ingat bahwa, ketika Anda menyesuaikan emacs Anda dengan banyak ekstensi (terutama dengan yang untuk memeriksa jenis dengan cepat, pencarian definisi fungsi dll) emacs Anda akan memuat sangat, sangat lambat untuk editor. 

Untuk mengatasinya, saya sangat merekomendasikan untuk menggunakan emacs di server mode 

Ini cukup mudah digunakan, tidak perlu menyesuaikan file init Anda . Anda hanya perlu memulai emacs dalam mode daemon;

emacs --daemon

Ini akan membuat server emacs, maka Anda dapat menghubungkannya dari terminal, atau dari gui. Saya juga merekomendasikan untuk membuat beberapa alias untuk membuatnya mudah dipanggil. 

alias ec="emacsclient -t"
alias ecc="emacsclient -c &"
# some people also prefer this but no need to fight here;
alias vi="emacsclient -t"

Dengan cara ini, emacs akan menyala lebih cepat daripada gedit, janji.

Satu-satunya masalah di sini, jika Anda menjalankan emacs daemon dari pengguna biasa, Anda mungkin tidak dapat menghubungkan server emacs sebagai root

Jadi, jika Anda perlu membuka file yang memiliki akses root; gunakan tramp sebagai gantinya. Jalankan klien emacs Anda dengan pengguna normal dan buka file seperti ini;

C-x C-f
/Sudo:[email protected]/some/file/that/has/root/access/permissions
# on some linux distro it might be `/su:[email protected]` 

Ini membuat hidup saya lebih mudah, saya bisa membuka python khusus saya yang berat IDE dalam milidetik dengan cara ini. Anda mungkin juga ingin menambahkan emacs --daemon ke startup sistem Anda, atau membuat file desktop untuk emacsclient. Itu terserah kamu. 

Lebih banyak tentang daemon emacs dan klien emacs dapat ditemukan di wiki;

http://www.emacswiki.org/emacs/EmacsAsDaemon

http://www.emacswiki.org/emacs/EmacsClient

8
Muhammet Can

Untuk kontrol versi, ada beberapa hal yang bisa Anda gunakan, tergantung pada sistem kontrol versi apa yang Anda gunakan. Tetapi beberapa fungsi umum untuk mereka semua.

vc.el adalah cara bawaan untuk menangani kontrol versi di tingkat file. Ini memiliki backends untuk sebagian besar sistem kontrol versi. Misalnya, backend Subversion dilengkapi dengan Emacs, dan ada backend git dan lainnya yang tersedia dari sumber lain.

Perintah yang paling berguna adalah C-x v v (vc-next-action) yang melakukan tindakan selanjutnya yang sesuai untuk file yang Anda kunjungi. Ini mungkin berarti memperbarui dari repositori atau melakukan perubahan Anda, vc.el juga rebinds C-x C-q untuk check in dan out file jika Anda menggunakan sistem yang membutuhkannya (seperti RCS).

Perintah lain yang sangat berguna adalah C-x v l dan C-x v = yang menunjukkan Anda log dan diff saat ini untuk file yang Anda gunakan.

Tetapi untuk produktivitas nyata, Anda harus menghindari menggunakan perintah file tunggal vc.el selain untuk hal-hal sederhana. Ada beberapa paket yang dapat memberi Anda gambaran tentang status seluruh pohon Anda, dan memberi Anda lebih banyak kekuatan, dan belum lagi kemampuan untuk membuat komit koheren yang mencakup beberapa file.

Sebagian besar sangat dipengaruhi atau didasarkan pada aslinya pcl-cvs/pCV untuk CVS. Bahkan ada dua dari mereka yang datang dengan Subversion, psvn.el dan dsvn.el. Ada paket untuk git dll.

8
dkagedal

Saya setuju bahwa Anda harus belajar tentang kompilasi M-x (mengikat itu dan M-x kesalahan berikutnya ke urutan tombol pendek).

Pelajari tentang binding untuk kontrol versi (mis. Vc-diff, vc-next-action, dll.)

Lihatlah ke register. Anda tidak hanya dapat mengingat lokasi dalam buffer tetapi juga konfigurasi seluruh jendela (C-x r w - window-configuration-to-register).

7
HD.

Titik awal (yang mungkin tidak jelas) untuk menjelajahi fitur VC dari Emacs adalah M-x vc-next-action

Itu melakukan "operasi kontrol versi logis berikutnya" pada file saat ini, tergantung pada keadaan file dan backend VC. Jadi jika file tersebut tidak di bawah kontrol versi, ia mendaftarkannya, jika file telah diubah, perubahan dikirimkan dll. 

Butuh sedikit membiasakan diri, tetapi saya merasa sangat berguna. 

Penjilidan kunci default adalah C-x v v

6
Chopmo

Ada TFS.el untuk integrasi emacs ke Microsoft TFS . Ini berfungsi dengan TFS apa pun, termasuk TFS yang menjalankan Codeplex.com. 

Langkah-langkah dasar untuk menyiapkan:

  1. Tempatkan tfs.el di jalur beban Anda.

  2. Dalam file .emacs Anda: 

    (require 'tfs)
    (setq tfs/tf-exe  "c:\\vs2008\\common7\\ide\\tf.exe")
    (setq tfs/login "/login:domain\\userid,password")
          -or-
    (setq tfs/login (getenv "TFSLOGIN"))  ;; if you have this set
    
  3. juga di file .emacs Anda, atur binding kunci lokal atau global untuk perintah tfs. seperti itu:

    (global-set-key  "\C-xvo" 'tfs/checkout)
    (global-set-key  "\C-xvi" 'tfs/checkin)
    (global-set-key  "\C-xvp" 'tfs/properties)
    (global-set-key  "\C-xvr" 'tfs/rename)
    (global-set-key  "\C-xvg" 'tfs/get)
    (global-set-key  "\C-xvh" 'tfs/history)
    (global-set-key  "\C-xvu" 'tfs/undo)
    (global-set-key  "\C-xvd" 'tfs/diff)
    (global-set-key  "\C-xv-" 'tfs/delete)
    (global-set-key  "\C-xv+" 'tfs/add)
    (global-set-key  "\C-xvs" 'tfs/status)
    (global-set-key  "\C-xva" 'tfs/annotate)
    (global-set-key  "\C-xvw" 'tfs/workitem)
    
4
Cheeso

kompilasi, kesalahan-berikutnya, dan kesalahan-sebelumnya adalah semua perintah yang cukup penting untuk pengembangan C++ di Emacs (bekerja sangat baik pada keluaran grep juga). Etag, tag-kunjungan-tabel, dan tag-cari juga penting. completion.el adalah salah satu peretasan tanpa tanda jasa yang bagus di abad ke-20, dan dapat mempercepat peretasan C++ Anda dengan urutan besar. Oh dan jangan lupa ediff.

Saya belum belajar cara menggunakan kontrol versi tanpa mengunjungi Shell, tetapi sekarang saya menjalankan lebih banyak komit (dengan git) saya mungkin harus melakukannya.

3
jfm3

Saya menggunakan emacs di Windows. modul kompilasi Nice, tetapi saya ingin kompilasi menjadi lebih pintar tentang baris perintah kompilasi yang disarankan. Mungkin untuk menggunakan "File Variables" untuk menentukan compile-command , tapi saya ingin sesuatu yang sedikit lebih pintar dari itu. Jadi saya menulis sedikit fungsi untuk membantu. Itu menebak perintah kompilasi untuk menggunakan, untuk Meminta pengguna, ketika menjalankan compile

Fungsi duga mencari file vbproj atau csproj atau sln, dan jika ditemukan, ini menunjukkan msbuild. Kemudian terlihat pada nama file buffer, dan tergantung pada itu, menyarankan hal yang berbeda. File .wxs berarti itu adalah proyek WIX, dan Anda mungkin ingin membangun MSI, jadi logika tebakan menyarankan perintah nmake untuk MSI. Jika ini adalah modul Javascript, maka sarannya adalah menjalankan jslint-for-wsh.js untuk memisahkan file .js. Sebagai mundur, ini menyarankan nmake. 

Kode yang saya gunakan terlihat seperti ini:

(defun cheeso-guess-compile-command ()
  "set `compile-command' intelligently depending on the
current buffer, or the contents of the current directory."
  (interactive)
  (set (make-local-variable 'compile-command)
       (cond
        ((or (file-expand-wildcards "*.csproj" t)
             (file-expand-wildcards "*.vcproj" t)
             (file-expand-wildcards "*.vbproj" t)
             (file-expand-wildcards "*.shfbproj" t)
             (file-expand-wildcards "*.sln" t))
         "msbuild ")

        ;; sometimes, not sure why, the buffer-file-name is
        ;; not set.  Can use it only if set.
        (buffer-file-name
         (let ((filename (file-name-nondirectory buffer-file-name)))
           (cond

            ;; editing a .wxs (WIX Soluition) file
            ((string-equal (substring buffer-file-name -4) ".wxs")
             (concat "nmake "
                     ;; (substring buffer-file-name 0 -4) ;; includes full path
                     (file-name-sans-extension filename)
                     ".msi" ))

            ;; a javascript file - run jslint
            ((string-equal (substring buffer-file-name -3) ".js")
             (concat (getenv "windir")
                     "\\system32\\cscript.exe c:\\users\\cheeso\\bin\\jslint-for-wsh.js "
                     filename))

            ;; something else - do a typical .exe build
            (t
             (concat "nmake "
                     (file-name-sans-extension filename)
                     ".exe")))))
        (t
         "nmake "))))


(defun cheeso-invoke-compile-interactively ()
  "fn to wrap the `compile' function.  This simply
checks to see if `compile-command' has been previously set, and
if not, invokes `cheeso-guess-compile-command' to set the value.
Then it invokes the `compile' function, interactively."
  (interactive)
  (cond
   ((not (boundp 'cheeso-local-compile-command-has-been-set))
    (cheeso-guess-compile-command)
    (set (make-local-variable 'cheeso-local-compile-command-has-been-set) t)))
  ;; local compile command has now been set
  (call-interactively 'compile))

;; in lieu of binding to `compile', bind to my monkeypatched function
(global-set-key "\C-x\C-e"  'cheeso-invoke-compile-interactively)

Saya mencoba melakukan ini sebagai "sebelum saran" untuk fungsi kompilasi tetapi tidak dapat membuatnya bekerja dengan memuaskan. Jadi saya mendefinisikan fungsi baru dan mengikatnya ke kombinasi penekanan tombol yang sama yang telah saya gunakan untuk compile


EDIT sekarang ada " smarter-compile.el " yang membawa ide ini selangkah lebih maju.

3
Cheeso

Anda mungkin juga menemukan tabbar berguna. Ini meniru satu-satunya perilaku yang saya lewatkan ketika pindah dari Eclipse ke Emacs. Terikat "," dan "." untuk pindah ke bilah tab sebelumnya dan berikutnya, itu menghidupkan Anda dari beralih buffer dengan Ctrl-x b sepanjang waktu.

Sayangnya, halaman web yang disebutkan tidak memberikan versi yang benar untuk diunduh. Namun, sebagian besar versi Ubuntu mengirimkannya dalam paket emacs-goodies mereka.

3
wr.

Saya tahu ini adalah posting yang sangat lama. Tetapi pertanyaan ini berlaku untuk pemula emacs.

IMO cara terbaik untuk menggunakan emacs sebagai sebuah ide adalah dengan menggunakan protokol server bahasa dengan emacs. Anda dapat menemukan semua informasi tentang server bahasa di situs web yang ditautkan. 

Untuk pengaturan cepat, saya akan mendorong Anda untuk pergi ke halaman ini eglot . Ego eglot melakukan pekerjaannya dengan cukup baik. Ini terintegrasi dengan baik dengan paket penyelesaian otomatis seperti perusahaan. Memberikan referensi pencarian, dan banyak lagi. 

Juga untuk debugger, Anda mungkin memerlukan debugger khusus untuk bahasa tertentu. Anda dapat menggunakan gdb dari dalam emacs. Cukup ketik M-x gdb

Untuk mengkompilasi kode Anda, yang terbaik adalah menggunakan perintah-Shell. Saya sedang mengerjakan proyek ini eproj . Butuh beberapa saat untuk menyelesaikannya. Tapi yang dilakukannya hanyalah memetakan perintah Shell ke tipe proyek. Dan membangun proyek Anda melalui Shell. Itu melakukan hal yang sama untuk mengeksekusi perintah. Saya mungkin perlu bantuan menyelesaikan proyek ini. Ini tidak siap untuk digunakan, tetapi jika Anda tahu sedikit elisp Anda bisa membaca kode. 

Selain itu, selalu lebih baik menggunakan perintah kompilasi emacs.

Untuk kontrol versi, saya belum melihat paket lain yang dapat menyamai kekuatan magit . Ini khusus untuk git. Juga untuk git ada paket git-timemachine lain, yang menurut saya sangat berguna.

Pencarian objek dan pencarian kelas disediakan oleh protokol server bahasa. 

Pohon proyek dapat digunakan untuk antarmuka seperti ide dengan treemacs .

Ada juga proyek Perpustakaan Interaksi bernama projectile .

Untuk penyelesaian otomatis, saya menemukan mode perusahaan sangat berguna. 

Sungguh emacs dapat dibuat untuk melakukan apa saja.

2
sidharth arya

Pada pencarian dokumentasi: itu tergantung pada bahasa pemrograman Anda.

Pustaka dan panggilan sistem biasanya didokumentasikan dalam halaman manual. Untuk itu Anda bisa menggunakan M-x man. Beberapa hal dapat didokumentasikan dengan lebih baik di halaman info; gunakan M-x info.

Untuk elisp itu sendiri, gunakan C-h f. Untuk python, gunakan >>> help(<function, class, module>) dalam interpreter.

Saya menemukan bahwa sebagian besar bahasa lain menawarkan dokumentasi dalam bentuk html. Untuk itu, coba peramban yang disematkan (saya menggunakan w3m). Atur variabel lingkungan BROWSER Anda menjadi skrip wrapper di sekitar emacsclient -e "(w3m-goto-url-new-session \"[email protected]\")" (di * nix), seandainya ada sesuatu yang membuka browser dan Anda ingin membuka di emacs.

2
Jonas Kölker

Dalam beberapa tahun terakhir, Dentang menjadi bagian penting dari dukungan Emacs C++. Atila Neves berbicara di CppCon 2015: "Emacs as a C++ IDE"

Ini adalah pembicaraan 16 menit, di mana ia menunjukkan solusi untuk topik-topik berikut:

  • Langsung ke definisi
  • Pelengkapan otomatis
  • Penyorotan sintaksis saat terbang
  • Temukan file dalam proyek

Slide dapat ditemukan di sini .

1
Philipp Claßen

Dalam gaya Unix atau X windows, saya tidak tahu bahwa ada IDE terintegrasi yang bekerja untuk semuanya. 

Untuk berinteraksi dengan debugger, cukup satu komponen IDE, pertimbangkan realgud . Hal lain yang menurut saya berguna adalah parser untuk pesan lokasi, sehingga jika Anda memiliki jejak stack panggilan dan ingin mengedit di tempat tertentu di callstack, antarmuka front-end ini akan dapat melakukannya. 

Sejauh ini program ini bisa menggunakan peningkatan. Tapi kemudian bisa juga menggunakan orang yang bekerja untuk memperbaikinya. 

Penafian: Saya mengerjakan realgud

0
rocky