2010-02-10 14 views
8

He usado emacs durante mucho tiempo, pero no he estado al día con un montón de características. Uno de estos es speedbar, que acabo de investigar brevemente ahora. Otro es imenu. Ambos fueron mencionados en in-emacs-how-can-i-jump-between-functions-in-the-current-file?En Emacs, ¿cómo puedo usar imenu más sensiblemente con C#?

Usando imenu, puedo saltar a métodos particulares en el módulo que estoy trabajando. Pero hay una jerarquía de análisis que tengo que negociar antes de que consiga la opción de elegir (con autocompletar) el nombre del método.

Funciona así. Escribo M-x imenu y luego puedo elegir Using o Types. La opción Usar me permite saltar a cualquiera de las instrucciones de uso en el nivel superior del archivo C# (algo así como las instrucciones de importación en un módulo Java, para aquellos que no conocen C#). No muy útil. Elijo Tipos. Luego, tengo que elegir un espacio de nombres y una clase, aunque solo haya uno en el módulo fuente. En ese punto, puedo elegir entre variables, tipos y métodos. Si elijo métodos, finalmente obtengo la lista de métodos para elegir. La jerarquía que recorro se ve así;

Using 
Types 
    Namespace 
    Class 
     Types 
     Variables 
     Methods 
     method names 

Sólo después llego al quinto nivel llego a seleccionar lo que realmente quiero ir a: un método en particular.

Imenu parece inteligente sobre el módulo fuente, pero es un poco difícil de usar. ¿Lo estoy haciendo mal?

+1

Sería mucho más trabajo, pero si realmente quiere mejorar el soporte Cma de Emacs (que parece necesitar desesperadamente), la forma más completa y poderosa de hacerlo es con Semántica (http: // cedet .sourceforge.net/semantic.shtml). Esto implica escribir un analizador completo, pero le brinda los beneficios de tener dicho analizador. Si está buscando algo rápido, es excesivo, sin embargo. – haxney

+1

Su pregunta me inspiró a enviar un parche para un problema similar en el modo MAPA: solía tener dos menús de nivel superior, "Dependencias" y "Asignaciones de macro", pero con mi parche se fusionaron en una lista plana (Acabo de reemplazar las cadenas de encabezado con nil). Hacer lo mismo para el modo C# no debería ser difícil. – legoscia

+0

Mi parche: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=5582 – legoscia

Respuesta

1

Las herramientas CEDET en http://cedet.sf.net incluye un analizador de C# en la zona 'contrib' que puede analizar el código C#. CEDET luego admite interfaces especializadas tanto para speedbar como para imenu, que darán forma a las construcciones del menú de una manera organizada por el código, no por el tipo de etiqueta organizada. En C++, por ejemplo, un código como éste:

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

le daría un árbol que tenía "barra" en "foo", y "SomeMethod" bajo "barra", por lo que si usted sabe que su estructura, que acaba necesita relajarse por su nombre a la etiqueta que desea.

1

Uso la siguiente función, que utilizará ido y solo solicitará los símbolos a los que puede acceder. Sólo tiene que llamar en lugar de 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))))))) 
Cuestiones relacionadas