it-swarm-tr.com

Emacs'i bir kullanma IDE

Şu anda C veya C++ 'da kodlarken Emacs ile iş akışım üç pencereden oluşuyor. Sağdaki en büyük, birlikte çalıştığım dosyayı içeriyor. Sol ikiye ayrılır, alt kısım derleme veya komutları yazmak için kullandığım bir Shell'dir ve üst kısım genellikle çalışırken çalışırken danışmak istediğim bir tür belge veya README dosyasıdır. Şimdi orada bazı oldukça uzman Emacs kullanıcıları olduğunu biliyorum ve başka bir Emac'in işlevsel olarak tam bir IDE olarak kullanma niyetindeyken işlevsel olarak ne işe yaradığını merak ediyorum. Spesifik olarak, çoğu IDE genellikle bu işlevleri yerine getirir;

  • Kaynak kodu editörü
  • Derleyici
  • Hata ayıklama
  • Belge Araması
  • Sürüm Kontrolü
  • Sınıf araması ve nesne denetçisi gibi OO özellikleri 

Bunlardan birkaçı için, Emacs'ın bu işlevlere nasıl uyduğu oldukça açıktır, peki ya gerisi? Ayrıca, belirli bir dilin odaklanması gerekiyorsa, C++ olması gerektiğini söyleyebilirim. 

Edit: Bir kullanıcı 'gerisi ne olacak?' Dediğimde daha belirgin olmam gerektiğine işaret etti. Çoğunlukla, verimli sürüm kontrolü ve dokümantasyon araştırması hakkında merak ediyordum. Örneğin, SLIME’de LISP işlevinde hızlı bir hiperspec araması yapmak oldukça kolaydır. C++ STL belgelerinde bir şeyi aramak için hızlı bir yol var mı (örneğin hash_map 'in sözdizimini tam olarak unuttuysam)?

163
user7545

"Geri kalanlar" ile ne demek istediğinizi açıkça belirtmeniz gerekir. Nesne denetçisinin (bildiğim kadarıyla) dışında, emacs yukarıdakilerin hepsini kolayca yapıyor:

  • editör (açık)
  • derleyici - sadece M-x compile komutunu çalıştırın ve derleme komutunuzu girin. Oradan, sadece M-x compile ve varsayılanı kullanabilirsiniz. Emacs, C/C++ derleyici hatalarını yakalar (GCC ile en iyi şekilde çalışır) ve uyarılar veya hatalarla satırlara gitmenize yardımcı olur.
  • Hata ayıklama - benzer şekilde, hata ayıklamak istediğinizde, M-x gdb yazın ve özel bağlantıları olan bir gdb tamponu oluşturacaktır.
  • Dokümantasyon Araması - emacs, kod navigasyonu için mükemmel CScope bağlarına sahiptir. Diğer belgeler için: Emacs ayrıca bir manpage okuyucuya sahiptir ve her şey için web ve kitaplar var.
  • sürüm kontrolü - çeşitli VCS arka uçları için birçok Emacs bağlaması vardır (CVS, SCCS, RCS, SVN, GIT hepsi akla geliyor)

Düzenleme: Kod gezinti için gerçekten dokümante edilmiş arama hakkındaki cevabımı biliyorum. İşte daha fazla noktaya bilgi: 

Google’da arama yapmak şüphesiz başka örnekler de ortaya çıkaracaktır.

İkinci bağlantıda görüldüğü gibi, kutudan desteklenmese bile, diğer belgelerde (ve her neyse) arama işlevleri yapılabilir.

73
Ben Collins

Emacs için Emacs Kod Tarayıcısı daha "geleneksel" IDE tarzı bir ortam önermeliyim.

EDIT: Ben de emacs'deki standart VCS arayüzü üzerinden Magit 'yi tavsiye ederim.

29
baudtack

Shell penceresinde bir make komutu çalıştırmak yerine, M-x derlemeyi denediniz mi? Make komutunu çalıştırır, hataları görüntüler ve çoğu durumda çıktı dosya adları ve satır numaraları içeriyorsa, hataya neden olan kod satırına atlamayı çok kolaylaştırır.

Bir IDE hayranıysanız, emacs'nin speedbar paketine de bakmak isteyebilirsiniz (M-x speedbar). Daha önce yapmadıysanız, kodunuzda gezinmek için etiket tablolarını nasıl kullanacağınızı öğrenin.

19
Bryan Oakley

Bir zamanlar keşfedilmemiş şekilde sizi daha üretken yapan keşif köşeleri var. Diğerlerinin de belirttiği gibi, etiketleri kullanmak kaynak kodunuzu yakınlaştırmak için harika ve hızlı bir yoldur ve M-/(dabbrev-genişletme) kullanmak genellikle bir değişken adını tamamlarken beklediğiniz şeyi yapar. 

Gerçekleşmeyi kullanmak, düzenli bir ifadenin bütün oluşumlarını içeren bir arabellekte arabellek elde etmek için kullanışlıdır. Kodu yeniden gözden geçirme ve kod parçalarını veya değişken kullanımlarını ararken veya kaynak dosyalarınızda TODO işaretleyicileri kullanıyorsanız ve hepsini ziyaret etmek istiyorsanız bu gerçekten kullanışlıdır.

flush lines, sort-numeric-fields, replace-regexp ve dikdörtgen işlevleri, bazı araçlardan bir dökümü almak ve onu elisp programı veya virgülle ayrılmış bir elektronik tablo gibi yararlı verilere dönüştürmek için gerçekten yararlı olabilir. 

Emacs ile yapabileceğiniz şeyler hakkında IDE hakkında bir sayfa yazdım. 

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

Elisp öğrenmek, emac'lerin tipik bir IDE yapabileceklerinin ötesinde neler yapabileceğinin ötesinde neler yapabileceğini kendinize cevaplamanın başka bir harika yoludur. 

Mesela yazma hakkında blog yazdım Suçlama gibi performans fonksiyonlarını yerine getirme (kendi isteğinizi yazmanız, istediğiniz gibi davranmanızı sağlar) ...

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

Ayrıca, noktada çalışmakta olduğum kodlama standartlarına uyan bir fonksiyon için dinamik olarak yorum yapan bir kod yazdım. 

Elisp kodumun hiçbiri özellikle mükemmel değil ve çoğu zaten kütüphanelerde var, ancak emacs'ın bir iş günü boyunca ortaya çıkan özel şeyler yapmasını sağlamak gerçekten çok yararlı. 

15
justinhj

Emacs ve sürüm kontrolü entegrasyonunun detaylı açıklamasını sitemde . Ayrıca, birçok dilde Emacs'ın Geliştirme Ortamı olarak kullanılması hakkında yazı üzerine çalışıyorum - C/C++, Java, Perl, LISP/Scheme, Erlang, vb ...

10
Alex Ott

Tamam, buradaki herkes emacs'i harika bir IDE yapmak için mükemmel ipuçları veriyor. 

Ancak herkes, emaklarınızı çok fazla uzatma ile özelleştirdiğinizde (özellikle anında kontrol etmek için olanlar, işlev tanımı aramaları vb.), Emaklarınızın bir editör için çok yavaştır. 

Bu sorunu gidermek için emacs server mode içinde kullanmanızı şiddetle tavsiye ederim. 

Kullanımı oldukça basittir, init dosyanızı özelleştirmenize gerek yoktur .. __ Sadece emacs'ı daemon modunda başlatmanız gerekir;

emacs --daemon

Bu bir emacs sunucusu yaratacaktır, sonra onu terminalden veya gui'den bağlayabilirsiniz. Aramayı kolaylaştırmak için takma adlar oluşturmanızı da tavsiye ederim. 

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

Bu şekilde, emacs, vaat etmekten daha hızlı ateşlenecek, söz veriyorum.

Buradaki olası problem, geçici kullanıcınızdan emacs daemon kullanıyorsanız, muhtemelen emacs sunucusunu root olarak bağlayamazsınız. 

Öyleyse, root erişimi olan bir dosyayı açmanız gerekirse; bunun yerine tramp kullanın. Emacs istemcinizi normal kullanıcınızla çalıştırın ve bu gibi dosyaları açın;

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

Bu hayatımı kolaylaştırdı, ağır özelleştirilmiş pitonumu IDE milisaniyede bu şekilde açabilirim. Ayrıca sistem başlangıcınıza emacs - daemon eklemek veya emacsclient için bir masaüstü dosyası oluşturmak isteyebilirsiniz. Sana bağlı. 

Daha fazlası emacs daemon ve emacs istemcisi wiki'de bulunabilir;

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

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

8
Muhammet Can

Sürüm kontrolü için, hangi sürüm kontrol sistemini kullandığınıza bağlı olarak kullanabileceğiniz birkaç şey vardır. Ancak, bazı işlevler hepsinde ortaktır.

vc.el sürüm kontrolü bir dosya düzeyinde işlemek için yerleşik bir yoldur. Çoğu sürüm kontrol sistemi için arka uçları vardır. Örneğin, Subversion arka ucu Emacs ile birlikte gelir ve git arka uçları ve diğer kaynaklardan temin edilebilen diğerleri vardır.

En kullanışlı komut C-x v v (vc-next-action) ziyaret ettiğiniz dosya için uygun bir sonraki işlemi yapar. Bu, depodan güncelleme yapmak veya değişikliklerinizi taahhüt etmek anlamına gelebilir, vc.el C-x C-q İhtiyacı olan bir sistem kullanıyorsanız (RCS gibi) dosyaları teslim almak ve kontrol etmek için.

Diğer çok yararlı komutlar C-x v l ve C-x v = Bu, kullandığınız dosyanın günlük ve geçerli farkını gösterir.

Ancak gerçek üretkenlik için, basit şeyler dışındaki tek dosya vc.el komutlarını kullanmaktan kaçınmalısınız. Tüm ağacınızın durumuna genel bir bakış açısı kazandırabilen ve size daha fazla güç kazandırabilen ve birkaç dosyaya yayılan tutarlı taahhütler oluşturma yeteneğinden bahsetmeyecek birkaç paket var.

Bunların çoğu ağır etkilenir veya orijinaline dayanır. pCL-cvs/pCVS CVS için. Subversion ile birlikte gelen iki kişi bile var. psvn.el ve dsvn.el. Git vs. için paketler var.

8
dkagedal

M-x derleme hakkında bilgi edinmeniz gerektiğine katılıyorum (bunu ve M-x'in bir sonraki hatadan sonra kısa bir tuş sırasına bağlanması).

Sürüm kontrolü için ciltlemeler hakkında bilgi edinin (ör. Vc-diff, vc-next-action, vb.)

Kayıtlara bak. Yalnızca tamponlardaki konumları hatırlayamazsınız, tüm pencere konfigürasyonlarını da hatırlayabilirsiniz (C-x r w - pencere-konfigürasyon-kayıt).

7
HD.

Emacs'in VC özelliklerini keşfetmek için bir başlangıç ​​noktası (açıkça görülmeyebilir) M-x vc-next-action

Dosyanın durumuna ve VC arka ucuna bağlı olarak geçerli dosya üzerinde "sonraki mantıksal sürüm kontrol işlemi" yapar. Bu nedenle, dosya sürüm kontrolü altında değilse, dosyayı kaydeder, dosya değiştirilmişse değişiklikler vb. Gönderilir. 

Alışması biraz zaman alıyor ama ben bunu çok faydalı buluyorum. 

Varsayılan tuş bağlama C-x v v

6
Chopmo

Microsoft TFS'ye emacs entegrasyonu için bir TFS.el var . Codeplex.com çalıştıran TFS dahil olmak üzere herhangi bir TFS ile çalışır. 

Kurulum için temel adımlar:

  1. Tfs.el dosyasını yük yolunuza yerleştirin.

  2. .Emacs dosyanızda: 

    (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. ayrıca .emacs dosyanızda, tfs komutları için yerel veya genel anahtar bağlantıları ayarlayın. bunun gibi:

    (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

derleme, sonraki hata ve önceki hata Emacs'ta C++ geliştirme için oldukça önemli komutlardır (grep çıktısı için de harika çalışır). Etag'ler, visit-tags-table ve find-tag de önemlidir. finishion.el, 20. yüzyılın en büyük unsung hack'lerinden biridir ve C++ hack'lerinizi büyük bir düzen ile hızlandırabilir. Oh ve ediff'i unutmayalım.

Bir Shell'i ziyaret etmeden sürüm kontrolünü nasıl kullanacağımı henüz öğrenmedim, ancak şimdi çalıştığım için çok daha sık (git ile) taahhüt ediyorum.

3
jfm3

Windows'da emacs kullanıyorum. derleme modülü Nice, ancak derleme önerdiği derleme komut satırı hakkında daha akıllı olmak istedim. compile-command belirtmek için "Dosya Değişkenleri" kullanmak mümkündür, ancak ondan biraz daha akıllıca bir şey istedim. Bu yüzden yardım için küçük bir fonksiyon yazdım. compile komutunu çalıştırırken, kullanıcıya sormak için kullanılacak derleme komutunu tahmin eder. 

Tahmin işlevi vbproj veya csproj veya sln dosyasını arar ve bulunursa msbuild'i önerir. Sonra arabellek dosya adına bakar ve buna bağlı olarak farklı şeyler önerir. Bir .wxs dosyası bir WIX projesi olduğu ve muhtemelen bir MSI oluşturmak istediğiniz anlamına gelir, bu nedenle tahmin mantığı MSI için bir nmake komutu önerir. Bir Javascript modülü ise, öneri .js dosyasını astarlamak için jslint-for-wsh.js dosyasını çalıştırmaktır. Bir geri dönüş olarak, nmake önerir. 

Kullandığım kod şöyle görünüyor:

(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)

Bunu derleme işlevi için "öneriden önce" olarak yapmaya çalıştım ancak tatmin edici bir şekilde çalışmasını sağlayamadım. Bu yüzden yeni bir fonksiyon tanımladım ve onu compile için kullandığım tuş vuruş kombinasyonuna bağladım. 


EDIT bu fikri bir adım daha ileri götüren " smarter-compile.el " ifadesi var.

3
Cheeso

Ayrıca tabbar faydalı bulabilirsiniz. Eclipse'den Emacs'a geçerken kaçırdığım tek davranış öykünüyor. "," Ve "." önceki ve sonraki sekme çubuğuna geçmek için, tamponu her zaman Ctrl-x b ile değiştirmekten kurtarır.

Ne yazık ki, bahsedilen web sayfası indirmek için doğru sürümü sağlamıyor. Ancak çoğu Ubuntu sürümü emacs-goodies paketlerinde sunar.

3
wr.

Bunun çok eski bir yazı olduğunu biliyorum. Ancak bu soru emacs yeni başlayanlar için geçerlidir.

IMO'yu emac'leri ide olarak kullanmanın en iyi yolu, dil sunucusu protokolünü emacs kullanmaktır. Dil sunucuları ile ilgili tüm bilgileri bağlantılı web sitesinde bulabilirsiniz. 

Hızlı bir kurulum için, bu sayfaya gitmenizi tavsiye ederim eglot . IMO eglot bu işi oldukça iyi yapıyor. Şirket gibi otomatik tamamlama paketleriyle iyi bütünleşir. Referans bul ve daha fazlasını sağlar. 

Ayrıca bir hata ayıklayıcı için, belirli diller için belirli hata ayıklayıcılara ihtiyacınız olabilir. Gdb'yi emacs içinden kullanabilirsiniz. Sadece M-x gdb yazın. 

Kodunuzu derlemek için Shell-komutlarını kullanmak en iyisidir. Bu proje üzerinde çalışıyorum eproj . Tamamlaması biraz zaman alacak. Ancak tüm yaptığı, Shell komutunu proje türüne eşlemektir. Ve sizi Shell ile projelendiriyor. Aynı komutu çalıştırmak için yapar. Bu projeyi tamamlamak için yardıma ihtiyacım olabilir. Kullanıma hazır değil, ancak biraz elisp biliyorsanız kodu kullanabilirsiniz. 

Bu bir yana, emacs derleme komutunu kullanmak her zaman en iyisidir.

Sürüm kontrolü için, magit 'in gücüyle eşleşen başka bir paket görmedim. Git'e özgü. Ayrıca git için çok yararlı bulduğum başka bir paket git-timemachine var.

Nesne araması ve sınıf araması, dil sunucusu protokolü tarafından sağlanır. 

treemacs ile ide benzeri arayüzler için bir proje ağacı kullanılabilir.

Ayrıca projectile adında bir proje Etkileşim Kütüphanesi var.

Otomatik tamamlama için, şirket modu çok faydalı buluyorum. 

Gerçekten herhangi bir şey yapmak için emacs yapılabilir.

2
sidharth arya

Belge aramada: bu programlama dilinize bağlıdır.

C kütüphaneleri ve sistem çağrıları tipik olarak man sayfalarında belgelenir. Bunun için M-x man kullanabilirsiniz. Bilgi sayfalarında bazı şeyler daha iyi belgelenebilir; M-x info kullanın.

Elisp'in kendisi için C-h f kullanın. Python için yorumlayıcıda >>> help(<function, class, module>) işlevini kullanın.

Diğer dillerin çoğunun html biçiminde belgeler sunduğunu biliyorum. Bunun için gömülü bir tarayıcı deneyin (w3m kullanıyorum). Bir şeyin tarayıcı açabilmesi ve emacs içinde açılmasını istemeniz durumunda BROWSER ortam değişkeninizi emacsclient -e "(w3m-goto-url-new-session \"[email protected]\")" (on * nix) etrafındaki bir sarmalayıcı komut dosyasına ayarlayın.

2
Jonas Kölker

Son yıllarda Clang, Emacs C++ desteğinin önemli bir parçası oldu. Atila Neves, CppCon 2015 hakkında bir konuşma yaptı: "C++ IDE Olarak Emacs"

Aşağıdaki konular için çözümler gösterdiği, 16 dakikalık bir konuşmadır:

  • Tanıma atla
  • Otomatik tamamlama
  • Anında sözdizimi vurgulama
  • Projede dosya bul

Slaytlar burada bulunabilir.

1
Philipp Claßen

Unix veya X pencereleri tarzında, her şey için işe yarayan entegre bir IDE olduğunu bilmiyorum. 

Hata ayıklayıcılarla etkileşimde bulunmak için, bir IDE'nin yalnızca bir bileşeni olarak, realgud komutunu kullanın. Kullanışlı bulduğum diğer şey konum mesajları için ayrıştırıcılardır, böylece bir çağrı yığını izlemeniz varsa ve çağrı dizisindeki belirli bir yerde düzenlemek istiyorsanız, bu ön uç arayüzü bunu yapabilir. 

Şimdiye kadar bu program iyileştirme kullanabilirdi. Ancak daha sonra geliştirmek için üzerinde çalışan insanları da kullanabilir. 

Yasal Uyarı: realgud üzerinde çalışıyorum

0
rocky