Làm cách nào để sử dụng Emacs để tìm kiếm một hàm trong Python?


22

Cách dễ nhất để cấu hình Emacs để có thể tìm kiếm nơi một chức năng được xác định là gì? Tôi muốn làm nổi bật nó trong Emacs và nhấn một tổ hợp phím để tìm nơi nguồn của hàm.

Bạn cũng có thể tìm ra nơi một chức năng cụ thể đang được sử dụng?

Điều này được thực hiện dễ dàng trong PyCharm, nhưng nó cũng có thể dễ dàng thực hiện trong Emacs?

Câu trả lời:


14

Bạn đã thử Elpy chưa? Nó liên kết elpy-goto-definitionvới chìa khóa M-..
Nếu bạn có một Emacs gần đây, tôi nghĩ bạn cũng có thể quay lại với xref-pop-marker-stack( M-,). Elpy có một số tính năng tốt đẹp khác là tốt.

Để cài đặt nó, hãy làm theo các hướng dẫn trong liên kết.


12

Tôi sử dụng chế độ Jedi cho Python và tôi rất hài lòng với nó. Nó không chỉ thực hiện tra cứu chính xác cho các lệnh gọi hàm, nó giải quyết các hàm theo định nghĩa chính xác ngay cả trong các tình huống phức tạp (như kế thừa). Đi kèm với tự động hoàn thành để khởi động. http://tkf.github.io/emacs-jedi/latest/


8

Tính năng của PyCharm mà bạn đề cập là một trong những mục yêu thích của tôi và là một trong những điều đầu tiên tôi tìm kiếm khi thay thế hoàn toàn PyCharm bằng Emacs (điều tôi rất vui khi nói rằng tôi đã có thể làm được).

Như đã đề cập trong câu trả lời khác, elpygói có tính năng này (ngoài nhiều tính năng IDE hữu ích khác ). Tuy nhiên, nếu bạn sử dụng elpy-goto-definitionđể tìm kiếm biểu tượng tại điểm, bạn sẽ sớm thấy rằng trong một số trường hợp, PyCharm sẽ thành công trong việc tìm kiếm những gì bạn đang tìm kiếm, elpysẽ không. Như các tài liệu nói:

các phụ trợ không phải lúc nào cũng có thể xác định loại biểu tượng nào tại điểm. Đặc biệt là sau một vài lần quyết định, về cơ bản họ không có hy vọng đoán đúng, vì vậy họ không

Trong trường hợp này, việc gọi elpy-goto-definitionsẽ không làm gì và hiển thị một thông báo lỗi nhỏ trong vùng echo. Khi điều này xảy ra, tất nhiên bạn vẫn muốn tìm thấy những gì bạn đang tìm kiếm và elpykhông để bạn bị treo. Trong tình huống này, tôi luôn sử dụng C-c C-s( elpy-rgrep-symbol) rgrepcho biểu tượng tại bất kỳ dự án nào tôi tham gia. Ít nhất là đối với tôi, điều tôi đang tìm kiếm ít nhiều luôn xuất hiện trong rgrepkết quả. Trên thực tế, tôi nghĩ điều này tương tự với những gì PyCharm cũng làm: nếu bạn cố gắng tìm định nghĩa của một cái gì đó và PyCharm không chắc chắn nó được định nghĩa ở đâu, nó sẽ cho bạn chọn từ danh sách. Tôi thực sự thích elpytriển khai hơn, vì thay vì một danh sách thoáng qua sẽ biến mất khi bạn đi đến tùy chọn đầu tiên,elpy-rgrep-symbol sẽ để lại danh sách các khả năng mở trong một bộ đệm khác để bạn có thể nhảy qua lại giữa chúng nếu cần thiết.

Vì quy trình làm việc của tôi hầu như luôn luôn là cuộc gọi đầu tiên elpy-goto-definitionvà nếu thất bại, hãy gọi elpy-rgrep-symbol, tôi quyết định hack cùng một chức năng đơn giản chỉ gọi elpy-rgrep-symboltự động nếu elpy-goto-definitionthất bại. Chức năng đó là dưới đây:

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

Sau đó, tôi liên kết này với M-.(ràng buộc mặc định cho elpy-goto-definition).

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

Bằng cách này, tôi có thể sử dụng một trong những tính năng PyCharm yêu thích của mình trong trình chỉnh sửa yêu thích. Tôi biết đây là một câu hỏi cũ và bạn có thể đã giải quyết vấn đề này hoặc tiếp tục, nhưng tôi hy vọng bạn hoặc ai đó thấy điều này hữu ích!



2

M-. hoạt động ở chế độ anaconda (mà tôi đã chuyển sang sau khi gặp vấn đề với elpy).

Lưu ý rằng bạn cần môi trường python thích hợp, trong trường hợp của tôi, tôi thực hiện như sau: - mkvirtualenv someenv - python setup.py developcho tất cả các mô-đun phát triển hoặc sử dụng (hoặc thích tiếp cận nguồn thay vì phiên bản đã cài đặt) - M-x venv-workon someenvđể bật đường dẫn trong emacs.

Sau đó, tôi định cấu hình anaconda-modeđể hoạt động bất cứ khi nào tôi chỉnh sửa python và voila, M-.hoạt động


1

Câu hỏi hay, không có sẵn trong hộp và là một tính năng tiện dụng của các IDE đầy đủ. Tôi làm điều đó với cscopemột giao diện helm đẹp:  http://wikemacs.org/wiki/Python#cscope Nó có thể trả lời các câu hỏi như "biểu tượng này được định nghĩa ở đâu? Nó được sử dụng ở đâu?".

ps: trong chế độ ác chúng ta có thể đi đến định nghĩa của một biểu tượng trong cùng một tệp với gd.


Tôi tin gdvào cái ác chỉ tìm thấy sự xuất hiện đầu tiên của biểu tượng trong tệp (mặc dù có chuỗi: "Đi đến định nghĩa hoặc lần xuất hiện đầu tiên của biểu tượng dưới điểm.")
Gordon Gustafson

0

M-.đó là ràng buộc elpy-goto-definitionsẽ làm các thủ thuật. Sử dụng M-*sẽ cho phép bạn nhảy trở lại vị trí trước đó. Điều này cho phép bạn nhanh chóng kiểm tra một cái gì đó và quay trở lại vị trí trước đó.

Tôi cũng sử dụng C-c C-othường xuyên ( elpy-occur-definitions). Điều này sẽ mở một cửa sổ với tất cả các lớp và chức năng là bộ đệm hiện tại. Từ bộ đệm đó, nhấn Entersẽ đưa bạn vào định nghĩa trong mã nguồn.


Trên thực tế, AFAICT, M-.được ràng buộc xref-find-definitionselpy-goto-definitionkhông có trên bất kỳ khóa nào theo mặc định (mặc dù nó nằm trên các menu). Tìm định nghĩa trong các gói trang web dường như không hoạt động tốt.
Robert P. Goldman

0

Jedi là một thư viện phân tích tĩnh / tự động tuyệt vời cho Python. Tôi đã sử dụng nó rất nhiều khi tôi sử dụng vim.

Giống như công cụ tự động hoàn thành golang (tức là gocode) hoạt động cho cả vim và emacs, cùng một công cụ Jedi hoạt động cho cả vimemacs .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.