1

私は cscope emacs 拡張機能を使用しています (非常に便利です)。残念ながら、現在のディレクトリ以下のみを検索するデフォルトの動作では不十分なので、選択したディレクトリに対して cscope-set-initial-directory を使用します。残念ながら、私にはそれぞれ独自の「初期」ディレクトリを持つ複数の異なるプロジェクトがあるため、これも不十分になりました。

私は、emacs で最もよく使用する 3 つの cscope メソッドのホット キーを設定しました。

(global-set-key [f9] 'cscope-find-this-text-string)
(global-set-key [f8] 'cscope-find-global-definition)
(global-set-key [f7] 'cscope-find-this-symbol)

これらの呼び出しを関数でラップして、特定のパス (buffer-file-name を調べて生成) で cscope-set-initial-directory を実行するのはかなり簡単だと思いました。しかし、私はまだ成功していません!

(global-set-key [f9] (lambda () (interactive) (cscope-set-initial-directory "blah") 'cscope-find-this-text-string))

動作しません。また、2 つの cscope-hook にフックを追加しようとしましたが、通常の使用パターンではどちらも呼び出されないようです。バッファを切り替えるたびに一度実行してもかまいませんが、そのためのフックはどこにもありませんでした:/。

誰か助けてくれませんか?:)

4

1 に答える 1

1

免責事項: cscope をインストールしていないため、これをテストすることはできません。

(global-set-key (kbd "<f9>") 'my-cscope-find-this-text-string)
(defun my-cscope-find-this-text-string (dir)
  (interactive "DRoot area to start search:")
  (let ((default-directory dir))
    (call-interactively 'cscope-find-this-text-string)))

基本的な考え方は、開始するディレクトリを求めるプロンプトを表示することです。これがインタラクティブへの呼び出しです。次に、ディレクトリを設定します。let ステートメントがそれを行います。次に、必要な元のルーチンを呼び出します。それを呼び出すと、'call-interactivelyプロンプトが表示されます。

他の 2 つのルーチンも同様にラップします。

これが機能するようになったら、ルート領域のプロンプトをカスタマイズして、3 つのルーチン間で共有される独自の履歴変数を持たせることで、より洗練されたものにすることができます。

あなたの最初の解決策に関しては、それは良い試みでした。'interactiveほとんどの人は、関数をコマンドに変換する必要性を認識していません。引用された名前がうまくいかない理由は、引用がインタープリターにシンボルをシンボルとして扱い、それに対して何もしないように指示しているだけだからです。ルーチンを呼び出すには、通常、次のようにします。

(lambda ()
    (c-scope-find-this-text-string "some-string"))

残念ながら、上記のような直接呼び出しでは、引数 (検索する文字列) を指定する必要があります。そのため、文字列のプロンプトを表示するコードを追加するか、コマンドの組み込みコードを使用してプロンプトを表示することができます。それが ' のcall-interactively使用目的であり、コマンドを呼び出し'interactive、プロンプトを表示するフォームを呼び出します。

また、2 つの理由から、裸のラムダではなく、キーストロークをコマンドの名前にバインドすることをお勧めしC-h kますM-x describe-key。関数を使用すると、バインディングをいじる必要なく実行できます。

于 2009-06-17T15:30:42.100 に答える