2010-08-17 38 views
17

Có tương đương với chất nhờn cho python không?Làm thế nào tôi có thể sử dụng meta-dot (M-.) Trong python với emacs?

Ví dụ: nếu tôi định vị con trỏ trên foo() và thực hiện M-. (Nhảy tới định nghĩa) Tôi muốn xem định nghĩa nguồn của hàm foo

này nên làm việc bất kể foo là trong

1) thư mục dự án địa phương

2) ở một số ~/.virtualenvs/bar/lib/site-packages

3) trong một số khác python-path

4) env ảo được sử dụng (ví dụ, cần tìm trong virtualenv hiện tại của tôi)

Liệu các kết hợp pymacs/ropemacs có thực hiện được điều này không?

+1

Tôi thích tương đương với chất nhờn, mà là để nói, một cái gì đó mà groks python ở cấp mã/ngữ nghĩa, không chỉ ở cấp độ văn bản. Ropemacs hoặc pymacs có thể là những gì tôi muốn, mặc dù tôi không biết nếu nó giúp với M-. bằng mọi cách. – nunb

Trả lời

11

Để tránh -e bạn có thể sử dụng etags và với một tìm thấy bạn một cách đệ quy thêm file py:

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

Vâng, nhưng các tệp .py có liên quan không nằm trong thư mục con của mã của tôi, chúng nằm trong ~/.virtualenv trong khi tôi làm việc trong ~/src/project/foo – nunb

+0

Với tìm thấy bạn có thể sử dụng bất kỳ thư mục nào bạn muốn: 'find ~/.virtualenv -type f -name '* .py' | xargs etags' – mathk

+0

Tôi đoán điều này gọi cho một virtualenv móc sau đó, để các thẻ có thể tự động được tạo ra cho bất kỳ thư mục làm việc + virtualenv combo người sử dụng là in – nunb

4

M-. thường chạy hàm "find-tag". Bạn nên tạo một tệp TAGS của các tệp nguồn python của bạn. Sau đó, bạn "visit-tags-table" trước khi thực hiện M-. Bằng cách đó, Emacs sẽ chuyển đến tất cả các định nghĩa của thẻ. Nhập C-u M-. để chuyển định nghĩa tiếp theo cho thẻ của bạn. Xem tài liệu tìm thẻ để được trợ giúp. Tham khảo ý kiến ​​Emacs giúp biết cách tạo một tệp tin TAGS từ các tệp nguồn python.

Bạn có thể sử dụng ví dụ Exuberant Ctags để tạo tệp TAGS.

Đến thư mục gốc của file python của bạn và thực hiện điều này:

ctags -e -R . 

Một tập tin TAGS thường được tạo ra ở thư mục gốc của dự án.

+3

Tôi cũng khuyên bạn nên xem http://www.emacswiki.org/emacs/EtagsSelect, cung cấp giao diện đẹp hơn nếu bạn liên kết 'M-.' thành' etags-select-find-tag' – phils

+0

Với một số nguyên trong gốc và một số dự án sẽ không bị lẫn lộn giữa các cài đặt khác nhau của cùng một gói (nhiều gói trang web?). Hoặc ít nhất, mỗi khi nó bật lên một bộ đệm hỏi tôi * mà * nguồn defn tôi muốn đi đến? – nunb

+0

Bạn tạo một tệp TAGS cho mỗi dự án của bạn tại thư mục gốc tương ứng của chúng (không phải thư mục gốc/của hệ thống). Sau đó, bạn sử dụng 'visit-tags-table' trên mỗi tệp TAGS mà bạn quan tâm. Tất cả tham chiếu tệp TAGS được thêm vào biến 'thẻ-bảng-danh sách'. Sau đó, sử dụng M-. , emacs tìm kiếm từ khóa trong tất cả các tệp TAGS được tham chiếu trong 'thẻ-bảng-danh sách'. –

2

Sau đây sẽ chỉ số dự án hiện tại của bạn

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

Nhưng nếu bạn muốn lập chỉ mục libs đã nhập của bạn. Trước tiên, bạn kích hoạt virtualenv của mình. Sau đó sử dụng which python để phát hiện vị trí libs của bạn và sau đó kéo chúng vào 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

Hầu hết các câu trả lời được đề cập ở đây đều lỗi thời. Một giải pháp đơn giản là sử dụng elpy cho M-. mà không có etags (yêu cầu công việc bổ sung).

Cài đặt elpy as mentioned here.

M-x package-install elpy 

và sau đó cài đặt gói python

$ sudo pip install rope jedi 

emacs Khởi động lại, mở bất kỳ file python và chạy M-.

Elpy được ghi chép đầy đủ, bạn có thể đọc about M-. here.

0

Câu trả lời được chấp nhận bỏ lỡ một điểm quan trọng, nếu bạn thực hiện etags như find . -type f -name '*.py' | xargs etags thì mỗi tệp TAGS sẽ được tạo mỗi lần cho mỗi tệp.

Cách đúng để làm điều đó là để nối thêm dữ liệu vào file TAGS hiện với --append như

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

Ngoài ra nếu bạn muốn bao gồm định danh từ gói trang web env ảo dir (ví dụ: ~/.virtualenvs/bar/lib/site-packages):

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

* điều chỉnh python3.6 lên phiên bản Python hiện tại của bạn

0

Hãy thử của emacs anaconda-modecompany-anaconda gói. Cập nhật cấu hình:

(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) 

Đổi thành virtualenv với pythonic-activate, nếu bạn có một.

Bây giờ bạn đã có M-. và bạn có thể nhấn M-* để quay lại!

Các vấn đề liên quan