2010-02-10 11 views
8

Uzun zamandır emacs kullanıyorum, ancak bir sürü özellik kullanmaya devam etmedim. Bunlardan biri, şu an kısaca araştırdığım speedbar. Bir diğeri imenu. Bunların her ikisi de, ben çalışıyorum modülünde belirli yöntemlere atlayabilir imenu kullanma in-emacs-how-can-i-jump-between-functions-in-the-current-file?Emacs'te, imenu C# ile daha mantıklı bir şekilde nasıl kullanabilirim?

bahsedildi. Ama seçeneği seçmek ulaşmadan müzakere gereken bir ayrıştırma hiyerarşisi (ile orada otomatik tamamlama) yöntem adı.

Böyle gider. M-x imenu yazıp Using veya Types'u seçiyorum. Kullanım seçeneği, C# dosyasının en üst düzeyindeki (C# tanımını bilmeyenler için bir Java modülündeki içe aktarma ifadeleri gibi) kullanım ifadelerinden herhangi birine atlamamı sağlar. Süper yararlı değil. Türleri seçiyorum. Daha sonra kaynak modülünde sadece bir tane olsa bile bir isim ve bir sınıf seçmem gerekiyor. Bu noktada değişkenler, tipler ve yöntemler arasında seçim yapabilirim. Yöntemleri seçersem, sonunda seçim yapabileceğim yöntemler listesini alırım. Geçiş yaptığım hiyerarşi şöyle:

Using 
Types 
    Namespace 
    Class 
     Types 
     Variables 
     Methods 
     method names 

Ben 5 seviyeye ulaşmak Sadece sonra ben gerçekten atlamak istediğiniz şeyi seçmek için olsun: Belirli bir yönteme. Imenu, kaynak modülüyle ilgili akıllı görünmekle birlikte, kullanımı zor bir tür gibi görünmektedir. Yanlış mı yapıyorum?

+1

Çok daha fazla iş olurdu, ancak Emacs'ın C# desteğini geliştirmenin (ki bu da oldukça muhtaç görünmektedir) geliştirilmesi konusunda ciddiyseniz, bunu yapmanın en eksiksiz ve güçlü yolu Semantic'tir (http: // cedet .sourceforge.net/semantic.shtml). Bu, tam çözümleyici yazmayı içerir, ancak böyle bir ayrıştırıcıya sahip olmanın yararlarını sağlar. Hızlı bir şey arıyorsanız, bununla birlikte, overkill. – haxney

+1

Sorunuz, makefile modunda benzer bir sorun için bir yama göndermem için bana ilham verdi: iki üst düzey menülere, "Bağımlılıklar" ve "Makro ödevlerine" sahipti, ancak benim yamağumla düz bir listeyle birleştirildi (Sadece başlık dizelerini nil ile değiştirdim). C# modu için aynı şeyi yapmak zor olmamalıdır. – legoscia

+0

Düzeltme eki: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=5582 – legoscia

cevap

1

CEDET araçları C# kodu ayrıştırmak olabilir 'contrib' alanında bir C# çözümleyici içerir. CEDET daha sonra hem speedbar hem de imenu için özelleştirilmiş arayüzleri destekler; bu, menü yapılarınızı organize edilen etiket tipini değil organize edilen bir şekilde biçimlendirir. Böyle C++, örneğin, kod: Eğer yapısını biliyorsanız böylece

namespace foo { 
    class bar { 
     int somemethod(); 
    } 
} 

size, size "bar" altında "foo" altında "bar" ve "birYöntem" vardı bir ağaç sadece verecekti İstediğiniz etikete isme göre gevşetmeniz gerekir.

1

Ido'yu kullanacağınız ve yalnızca atlayabileceğiniz sembollerin sorulmasını sağlayan aşağıdaki işlevi kullanıyorum. Sadece imenu yerine diyoruz: http://cedet.sf.net de

(defun ido-goto-symbol() 
    "Will update the imenu index and then use ido to select a symbol to navigate to" 
    (interactive) 
    (imenu--make-index-alist) 
    (let ((name-and-pos '()) 
     (symbol-names '())) 
    (flet ((addsymbols (symbol-list) 
         (when (listp symbol-list) 
         (dolist (symbol symbol-list) 
          (let ((name nil) (position nil)) 
          (cond 
           ((and (listp symbol) (imenu--subalist-p symbol)) 
           (addsymbols symbol)) 
           ((listp symbol) 
           (setq name (car symbol)) 
           (setq position (cdr symbol))) 
           ((stringp symbol) 
           (setq name symbol) 
           (setq position (get-text-property 1 'org-imenu-marker symbol)))) 
          (unless (or (null position) (null name)) 
           (add-to-list 'symbol-names name) 
           (add-to-list 'name-and-pos (cons name position)))))))) 
     (addsymbols imenu--index-alist) 
     (let* ((symbol-at-point (symbol-name (symbol-at-point))) 
      (selected-symbol (ido-completing-read 
           "Symbol? " 
           (if (member symbol-at-point symbol-names) 
            (cons symbol-at-point (remove-if (lambda (x) (string-equal x symbol-at-point)) 
                    symbol-names)) 
           symbol-names))) 
      (position (cdr (assoc selected-symbol name-and-pos)))) 
     (if (markerp position) 
      (goto-char position) (goto-char (overlay-start position))))))) 
    (goto-char position) (goto-char (overlay-start position))))))) 
İlgili konular