質問

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-hooksにフックを追加しようとしましたが、どちらも通常の使用パターンでは呼び出されないようです。バッファーを切り替えるたびに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)))

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

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

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

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

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

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

また、次の2つの理由から、裸のラムダではなく、キーストロークをコマンドの名前にバインドすることをお勧めします。1つ目は、 Ch k Mx describe-キー)、意味のあるコマンド名を取得し、2番目に、関数を変更する場合/変更する場合は、バインディングをいじる必要なく行うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top