Emacsを使用してPythonで関数を検索するにはどうすればよいですか?


22

関数が定義されている場所を検索できるようにEmacsを構成する最も簡単な方法は何ですか?Emacsで強調表示し、キーの組み合わせを押して、関数のソースがどこにあるかを調べたいと思います。

また、特定の機能が使用されている場所を見つけることはできますか?

これはPyCharmで簡単にできますが、Emacsでも簡単にできますか?

回答:


14

あなたは試すましたElpyをelpy-goto-definitionキーにバインドしますM-.
最近のEmacsをお持ちの場合は、xref-pop-marker-stackM-,)で元に戻すこともできます。Elpyには他にも便利な機能がいくつかあります。

それをインストールするには、リンクの指示に従ってください。



8

あなたが言及したPyCharmの機能は私のお気に入りの1つであり、PyCharmをEmacsに完全に置き換えようとしたときに最初に探したものの1つです(できたことを嬉しく思います)。

別の回答で述べたように、elpyパッケージに(他の多くの便利なIDE機能に加えて)この機能があります。ただし、elpy-goto-definitionポイントでシンボルを検索するために使用する場合、遅かれ早かれ、PyCharmが探しているものを見つけることに成功する場合もありますが、そうではないことがわかりますelpy。ドキュメントが言うように:

バックエンドは、どの種類のシンボルがポイントにあるかを常に特定できるとは限りません。特に、いくつかの間接参照の後、彼らは基本的に正しい推測の希望を持っていないので、彼らはしません

この場合、呼び出しelpy-goto-definitionは何もせず、エコーエリアに小さなエラーメッセージを表示します。これが発生した場合、もちろん、あなたはまだあなたが探しているものを見つけたいです、そしてelpyあなたをぶら下げたままにしません。この種の状況では、私は常にC-c C-selpy-rgrep-symbol)を使用しrgrepて、プロジェクトのポイントにシンボルを配置します。少なくとも私にとっては、多かれ少なかれ探しているものが常にrgrep結果に表示されます。実際、これはPyCharmの機能にも似ていると思います。何かの定義を調べて、PyCharmがどこで定義されているかわからない場合は、リストから選択します。私は実際にはelpyの実装を好みます。なぜなら、最初のオプションに移動すると消える一時的なリストではなく、elpy-rgrep-symbol 可能性のリストを別のバッファで開いたままにして、必要に応じてそれらの間で前後にジャンプできるようにします。

私のワークフローはほとんど常に最初の呼び出しでelpy-goto-definitionあり、失敗した場合はcall elpy-rgrep-symbolなのでelpy-rgrep-symbolelpy-goto-definition失敗した場合に自動的に呼び出す単純な関数を一緒にハックすることにしました。その機能は以下のとおりです。

(defun goto-def-or-rgrep ()
  "Go to definition of thing at point or do an rgrep in project if that fails"
  (interactive)
  (condition-case nil (elpy-goto-definition)
    (error (elpy-rgrep-symbol (thing-at-point 'symbol)))))

次に、これをM-.(のデフォルトのバインディングelpy-goto-definition)にバインドします 。

(define-key elpy-mode-map (kbd "M-.") 'goto-def-or-rgrep)

このようにして、お気に入りのエディターでお気に入りのPyCharm機能の1つを使用できます。これは古い質問の一種であり、この問題を既に解決したか、先に進んだかもしれませんが、あなたや他の誰かがこれを役に立つと思うことを願っています!



2

M-。anacondaモードで動作します(elpyで問題が発生した後に切り替えました)。

- :あなたは私の場合、私は次の操作を行い、適切なPython環境を必要とすることに注意してくださいmkvirtualenv someenv - python setup.py developすべてのモジュールの開発または使用(またはその代わりにインストールされたバージョンのソースに到達することを好む) - M-x venv-workon someenvemacsの中でパスを有効にします。

それから私configureはanaconda-modeアクティブにするたびI編集のpythonと出来上がり、M-.作品


1

いい質問です。これはすぐに使用できるわけではなく、本格的なIDEの便利な機能です。私はそれを行うcscope素敵なヘルムインターフェースで、:  http://wikemacs.org/wiki/Python#cscopeをそれ缶「それが使用される場合、どここのシンボルが定義されている?」などの答え質問が。

ps:邪悪なモードでは、同じファイル内のシンボルの定義に移動できますgd


gd悪がファイル内で最初に現れるシンボルのみを見つけると信じています(docstringにかかわらず:「定義の下にある、またはポイントの下にあるシンボルの最初の出現」)
ゴードンガスタフソン

0

M-.にバインドされelpy-goto-definitionているトリックを行います。を使用するM-*と、バッファ内の前の場所に戻ることができます。これにより、何かをすばやく確認して前の場所に戻ることができます。

私もC-c C-oよく使用します(elpy-occur-definitions)。これにより、すべてのクラスと関数が現在のバッファーであるウィンドウが開きます。そのバッファーから、を押すEnterと、ソースコードの定義が表示されます。


実際、AFAICT M-.はバインドされてxref-find-definitionsおりelpy-goto-definition、デフォルトではどのキーにもありません(ただし、メニューにあります)。サイトパッケージで定義を見つけることは、まったくうまくいかないようです。
ロバートP.ゴールドマン

0

Jediは、Python用の素晴らしいオートコンプリート/静的解析ライブラリです。vimを使用していたときまでずっと使用していました。

golangオートコンプリートエンジン(gocode)がvimとemacsの両方で機能するように、同じJediエンジンはvimemacsの両方で機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.