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, elpy
gó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, elpy
sẽ 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-definition
sẽ 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à elpy
khô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
) rgrep
cho 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 rgrep
kế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 elpy
triể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-definition
và 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-symbol
tự động nếu elpy-goto-definition
thấ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!
python-mode
là Emacs theo mặc định. ( stackoverflow.com/questions/11363089/