2010-02-10 8 views
8

Używam emacs przez długi czas, ale nie nadążam za wieloma funkcjami. Jednym z nich jest speedbar, który właśnie pokrótce zbadałem. Kolejna to imenu. Obie te zostały wymienione w in-emacs-how-can-i-jump-between-functions-in-the-current-file?W Emacs, jak mogę używać imenu bardziej sensownie z C#?

Korzystanie imenu, mogę przejść do poszczególnych metod w module pracuję. Ale istnieje hierarchia parse że muszę negocjować zanim się opcja do wyboru (z autouzupełnianie) nazwa metody.

To działa tak. Piszę: M-x imenu, a następnie wybieram Using lub Types. Wybór "Użycie" pozwala mi przejść do dowolnej z instrukcji użycia na najwyższym poziomie pliku C# (coś w rodzaju instrukcji importu w module Java, dla tych z was, którzy nie znają C#). Niezbyt pomocna. Wybieram Typy. Następnie muszę wybrać przestrzeń nazw i klasę, nawet jeśli w module źródłowym jest tylko jeden z nich. W tym momencie mogę wybierać między zmiennymi, typami i metodami. Jeśli wybiorę metody, otrzymam wreszcie listę metod do wyboru. Hierarchia, którą przechodzę, wygląda tak:

Using 
Types 
    Namespace 
    Class 
     Types 
     Variables 
     Methods 
     method names 

Dopiero po osiągnięciu piątego poziomu wybieram opcję, do której naprawdę chcę przejść: konkretną metodę.

Imenu wydaje się być inteligentny w stosunku do modułu źródłowego, ale jest trudny w użyciu. Czy robię to źle?

+1

Byłoby o wiele więcej pracy, ale jeśli poważnie myślisz o poprawie obsługi Cacu dla Emacsa (która wydaje się odstręczająco potrzebna), najbardziej kompletnym i skutecznym sposobem na to jest Semantic (http: // cedet .sourceforge.net/semantic.shtml). Wymaga to napisania pełnego analizatora składni, ale daje korzyści z posiadania takiego parsera. Jeśli szukasz czegoś szybkiego, to jednak przesada. – haxney

+1

Twoje pytanie zainspirowało mnie do wysłania łatki podobnego problemu w trybie makefile: miała ona dwa menu najwyższego poziomu, "Zależności" i "Przypisania makr", ale z moją łatką zostały scalone w płaską listę (Właśnie zastąpiłem ciągi nagłówków zero). Zrobić to samo dla trybu C# nie powinno być trudne. – legoscia

+0

Moja łatka: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=5582 – legoscia

Odpowiedz

1

Narzędzia CEDET na http://cedet.sf.net obejmuje C# parser w obszarze 'contrib', które można analizować kod C#. CEDET wspiera następnie wyspecjalizowane interfejsy zarówno dla speedbar, jak i dla imenu, które będą kształtować twoje konstrukcje menu w sposób zorganizowany, a nie zorganizowany tag. W C++, na przykład, kod tak:

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

dałby ci drzewa, który miał „bar” pod „foo” i „metodę someMethod” pod „bar”, więc jeśli znasz swoją strukturę, po prostu trzeba odwijać według nazwy do znacznika, który chcesz.

1

Używam poniższej funkcji, która użyje ido i po prostu poprosi o symbole, do których można przejść. Wystarczy zadzwonić to zamiast imenu:

(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))))))) 
Powiązane problemy