В Emacs, как я могу более разумно использовать imenu с C #? - PullRequest
9 голосов
/ 11 февраля 2010

Я давно пользуюсь emacs, но не слежу за кучей возможностей. Одним из них является speedbar , который я только что кратко исследовал. Другой - имя . Оба из них были упомянуты в в-Emacs-как-может-я-переход между ними-функций-в-текущем файле?

Используя imenu, я могу перейти к определенным методам в модуле, в котором я работаю. Но есть иерархия синтаксического анализа, с которой мне нужно договориться, прежде чем я получу возможность выбрать (с автозаполнением) имя метода.

Это так. Я набираю M-x imenu и затем я выбираю Using или Types. Выбор «Использование» позволяет мне перейти к любому из операторов using на верхнем уровне файла C # (что-то вроде операторов импорта в модуле Java для тех из вас, кто не знает C #). Не супер полезно. Я выбираю Типы. Затем мне нужно выбрать пространство имен и класс, хотя в исходном модуле есть только одно из них. На этом этапе я могу выбирать между переменными, типами и методами. Если я выбираю методы, я, наконец, получаю список методов на выбор. Иерархия, которую я пересекаю, выглядит следующим образом;

Using
Types
  Namespace
    Class
      Types
      Variables
      Methods
         method names

Только после того, как я достигну 5-го уровня, я могу выбрать то, к чему я действительно хочу перейти: конкретный метод.

Имену кажется умным в отношении исходного модуля, но довольно сложен в использовании. Я делаю это неправильно?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2010

Инструменты CEDET на http://cedet.sf.net включают анализатор C # в области «contrib», который может анализировать код C #. Затем CEDET поддерживает специализированные интерфейсы как для панели быстрого доступа, так и для имен, которые будут формировать конструкции вашего меню таким образом, чтобы код был организован, а не тип тега. Например, в C ++ такой код:

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

даст вам дерево с "bar" под "foo" и "somemethod" под "bar", поэтому, если вы знаете свою структуру, вам просто нужно развернуть по имени нужную метку.

1 голос
/ 11 февраля 2010

Я использую следующую функцию, которая будет использовать ido и просто запрашивать символы, к которым можно перейти. Просто назовите это вместо имени:

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