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!
python-modelà Emacs theo mặc định. ( stackoverflow.com/questions/11363089/