2010-08-17 25 views
17

有沒有相當於python的粘液?如何在Python中使用emacs使用meta-dot(M-。)?

例如,如果我將光標放在foo()上並執行M-。 (跳轉到),我想看看函數foo的源定義

這應該不管富是在一些

1)本地項目目錄

2)工作的〜/ .virtualenvs /酒吧/ lib中/在其他Python路徑

4)虛擬ENV在使用中(即,它應該在我目前的virtualenv)

站點包

3)

pymacs/ropemacs組合是否可以做到這一點?

+1

我寧願相當於粘液,也就是說,在代碼/語義層面上,而不僅僅是在文本級別上咕py python。 Ropemacs或pymacs可能是我想要的,但我不知道它是否有助於M-。以任何方式。 – nunb 2010-08-18 05:02:34

回答

11

爲了避免您可以使用ETag -e和有找到你遞歸添加PY文件:

find . -type f -name '*.py' | xargs etags 
+0

是的,但相關的.py文件是不是在我的代碼的子目錄,他們是在〜/ .virtualenv,而我在〜/ src目錄/項目合作/富 – nunb 2010-08-18 04:59:58

+0

有了發現你可以使用任何目錄,你想: '找到〜/ .virtualenv -type f -name'* .py'| xargs etags' – mathk 2010-08-18 07:07:33

+0

我想這需要一個virtualenv鉤子,這樣標籤可以自動生成任何工作目錄+ virtualenv組合用戶所在。 – nunb 2010-08-18 08:42:12

4

M-。通常運行「find-tag」功能。 您應該創建一個Python源文件的TAGS文件。然後你在做M-之前「visit-tags-table」。這樣,Emacs將跳轉到標籤的所有定義。類型C-u M-。跳轉標籤的下一個定義。請參閱find-tag文檔以獲取幫助。請教Emacs幫助知道如何從python源文件創建一個TAGS文件。

例如,您可以使用Exuberant Ctags創建TAGS文件。

轉到您的Python文件的根目錄,然後執行以下操作:

ctags -e -R . 

標籤文件是在項目的根目錄下創建的。

+3

我建議在看http://www.emacswiki.org/emacs/EtagsSelect爲好,它提供了一個更好的接口,如果你綁定'M-.'到'的ETag選 - 查找 - tag' – phils 2010-08-17 22:13:27

+0

隨着根的ETag的,並且幾個項目不會在相同包的不同安裝(多個站點包?)之間混淆。或者至少,每次它彈出一個緩衝區問我*哪一個源defn我想去? – nunb 2010-08-18 05:01:15

+0

您在每個項目的各自根目錄(而不是系統的根目錄)中創建一個TAGS文件。然後你在每個你感興趣的TAGS文件上使用'visit-tags-table'。所有TAGS文件參考都附加到'tags-table-list'變量。然後,使用M-。 ,emacs在'tags-table-list'中引用的所有TAGS文件中搜索關鍵字。 – 2010-08-19 15:14:33

2

下將指數當前項目

find . -type f -name '*.py' | xargs etags

但是,如果你想索引你的導入庫。你首先激活你的virtualenv。然後使用which python來檢測你的庫在哪裏,然後將它們傳送給etags。

workon my-project # if using virtualenvwrappwer 
source bin/activate # if using virtualenv 

find ${$(which python)/\/bin\/python/} -type f -name '*.py' | xargs etags 
6

這裏提到的大多數答案都過時了。一個簡單的解決方案是使用elpy作爲M-.而沒有etags(這需要額外的工作)。

安裝elpy as mentioned here

M-x package-install elpy 

,然後再安裝Python包

$ sudo pip install rope jedi 

重新啓動emacs的,打開任何蟒蛇文件並運行M-.

Elpy是完全記錄,你可以閱讀about M-. here

0

接受的答案錯過了一個重要的觀點,如果您執行etags就像find . -type f -name '*.py' | xargs etags那麼每個文件每次都會生成每個TAGS文件。

做到這一點是如果你要包括從虛擬ENV現場包標識符將數據追加到與--append現有的標籤文件像

rm -f TAGS 
find . -type f -name '*.py' -print0 | xargs -0 etags --append 

也是正確的方法目錄(例如:~/.virtualenvs/bar/lib/site-packages):

SITEPACKAGES=$(cdvirtualenv;pwd)/lib/python3.6/site-packages/ 
find $SITEPACKAGES -type f -name '*.py' -print0 | xargs -0 etags -a 

*調整python3.6到當前的Python版本

0

嘗試的Emacs的anaconda-modecompany-anaconda包。更新配置:

(eval-after-load "company" 
'(add-to-list 'company-backends 'company-anaconda)) 
(add-hook 'python-mode-hook 'anaconda-mode) 
(add-hook 'python-mode-hook 'company-mode) 

切換到virtualenv與pythonic-activate,如果你有。

現在你已經得到M-.,你可以按M-*回去!