9

私は長い間 emacs を使用してきましたが、多くの機能についていけていません。これらの 1 つがspeedbarで、今簡単に調査したところです。もう一つはimenuです。これらはどちらも in-emacs-how-can-i-jump-between-functions-in-the-current-file? で言及されています。

imenu を使用すると、作業中のモジュール内の特定のメソッドにジャンプできます。ただし、(オートコンプリートを使用して) メソッド名を選択するオプションを取得する前に、交渉しなければならない解析階層があります。

こんなふうになります。入力してから、またはM-x imenuを選択します。Using を選択すると、C# ファイルの最上位にある using ステートメントのいずれかにジャンプできます (C# を知らない人のために、Java モジュールの imports ステートメントのようなものです)。とても役に立ちません。タイプを選択します。次に、名前空間とクラスを選択する必要がありますが、ソース モジュールにはそれぞれ 1 つしかありません。その時点で、変数、型、およびメソッドから選択できます。メソッドを選択すると、最終的に選択するメソッドのリストが表示されます。私がトラバースする階層は次のようになります。UsingTypes

Using
Types
  Namespace
    Class
      Types
      Variables
      Methods
         method names

5 番目のレベルに到達して初めて、本当にジャンプしたいもの、つまり特定のメソッドを選択できるようになります。

Imenu はソース モジュールについては賢いようですが、ちょっと使いにくいです。私はそれを間違っていますか?

4

3 に答える 3

2

http://cedet.sf.netの CEDET ツールには、C# コードを解析できる「contrib」領域に C# パーサーが含まれています。次に CEDET は、speedbar と imenu の両方に特化したインターフェイスをサポートします。これにより、タグ タイプが整理されるのではなく、コードが整理されるようにメニュー構造が形作られます。たとえば、C++ では、次のようにコーディングします。

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

「foo」の下に「bar」、「bar」の下に「somemethod」を持つツリーが得られるため、構造がわかっている場合は、必要なタグに名前で巻き戻すだけで済みます。

于 2010-02-13T01:49:44.950 に答える
1

次の関数を使用します。この関数は ido を使用し、ジャンプ先のシンボルを要求するだけです。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)))))))
于 2010-02-10T22:37:49.207 に答える