पायथन में एक फ़ंक्शन को देखने के लिए Emacs का उपयोग कैसे करते हैं?


22

Emacs को कॉन्फ़िगर करने का सबसे आसान तरीका क्या है जो एक फ़ंक्शन को परिभाषित करने में सक्षम है? मैं इसे Emacs में उजागर करना चाहता हूं और यह देखने के लिए एक कुंजी कॉम्बो दबाता हूं कि फ़ंक्शन का स्रोत कहां है।

क्या आप यह भी पता लगा सकते हैं कि एक विशिष्ट फ़ंक्शन का उपयोग कहां किया जा रहा है?

यह PyCharm में आसानी से किया जाता है, लेकिन क्या यह Emacs में भी आसानी से किया जा सकता है?

जवाबों:


14

क्या आपने एलपी की कोशिश की ? यह elpy-goto-definitionकुंजी को बांधता है M-.
यदि आपके पास हाल ही में Emacs हैं, तो मुझे लगता है कि आप भी xref-pop-marker-stack( M-,) के साथ वापस कूद सकते हैं । एल्पी में कुछ अन्य अच्छी विशेषताएं भी हैं।

इसे स्थापित करने के लिए, लिंक में दिए गए निर्देशों का पालन करें।


12

मैं पायथन के लिए जेडी मोड का उपयोग करता हूं और मैं इससे बहुत खुश हूं। न केवल यह फ़ंक्शन कॉल के लिए सटीक लुक अप करता है, यह जटिल परिस्थितियों (जैसे वंशानुक्रम) में भी सही परिभाषा के लिए कार्यों को हल करता है। बूट करने के लिए ऑटो के साथ आता है। http://tkf.github.io/emacs-jedi/latest/


8

PyCharm की जिस विशेषता का आप उल्लेख करते हैं, वह मेरे पसंदीदा में से एक थी, और पहली चीजों में से एक जिसे मैंने PyCharm को Emacs के साथ पूरी तरह से बदलने की कोशिश में देखा था (जो मुझे यह कहने में खुशी है कि मैं करने में सक्षम हूं)।

जैसा कि एक अन्य उत्तर में उल्लेख किया गया है कि elpyपैकेज में यह सुविधा है (कई अन्य उपयोगी आईडीई सुविधाओं के अलावा )। हालाँकि, यदि आप elpy-goto-definitionबिंदु पर प्रतीक को देखने के लिए उपयोग करते हैं, तो आप जल्द ही या बाद में पाएंगे कि कुछ मामलों में जहां PyCharm आपको ढूंढने में सफल elpyहोगा , वह नहीं होगा। डॉक्स कहते हैं:

बैकएंड हमेशा इस बात की पहचान नहीं कर सकता है कि बिंदु किस तरह का प्रतीक है। विशेष रूप से कुछ अप्रत्यक्ष के बाद, उन्हें मूल रूप से सही अनुमान लगाने की कोई उम्मीद नहीं है, इसलिए वे नहीं करते हैं

इस मामले में, आह्वान elpy-goto-definitionकुछ नहीं करेगा और इको क्षेत्र में थोड़ा त्रुटि संदेश दिखाएगा। जब ऐसा होता है, तो निश्चित रूप से आप अभी भी वही ढूंढना चाहते हैं जो आप ढूंढ रहे हैं, और elpyआपको फांसी पर नहीं छोड़ना चाहिए। इस तरह की स्थिति में मैं हमेशा प्रतीक का उपयोग करता हूं C-c C-s( elpy-rgrep-symbol) rgrepमैं जिस भी परियोजना में हूं उस बिंदु पर। कम से कम मेरे लिए, जिस चीज को मैं कम या ज्यादा ढूंढ रहा हूं वह हमेशा rgrepपरिणामों में दिखाई देती है। वास्तव में, मुझे लगता है कि यह PyCharm के समान है: यदि आप किसी चीज़ की परिभाषा देखने की कोशिश करते हैं और PyCharm को यह सुनिश्चित नहीं है कि इसे कहाँ परिभाषित किया गया है, तो यह आपके पास एक सूची से चुनना होगा। मैं वास्तव में elpyकार्यान्वयन को प्राथमिकता देता हूं , क्योंकि एक क्षणिक सूची के बजाय जब आप पहले विकल्प पर जाते हैं तो गायब हो जाते हैं,elpy-rgrep-symbol एक अन्य बफर में खुली संभावनाओं की सूची को छोड़ देगा ताकि आप यदि आवश्यक हो तो उनके बीच आगे और पीछे कूद सकें।

चूंकि मेरा वर्कफ़्लो लगभग हमेशा पहले कॉल करने के लिए होता है elpy-goto-definitionऔर यदि यह विफल रहता है, तो कॉल करें elpy-rgrep-symbol, मैंने एक साधारण फ़ंक्शन को एक साथ हैक करने का फैसला किया जो विफल होने पर बस elpy-rgrep-symbolस्वचालित रूप से कॉल करता elpy-goto-definitionहै। वह फ़ंक्शन निम्न है:

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

फिर मैं इसे M-.(डिफ़ॉल्ट बाइंडिंग के लिए elpy-goto-definition) बांधता हूं ।

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

इस तरह मैं अपने पसंदीदा संपादक में अपने पसंदीदा PyCharm सुविधाओं में से एक का उपयोग कर सकता हूं। मुझे पता है कि यह एक पुराना प्रश्न है और आप पहले से ही इस समस्या को हल कर सकते हैं या आगे बढ़ सकते हैं, लेकिन मुझे आशा है कि आपको या किसी और को यह उपयोगी लगता है!


4

python-mode.el एक कमांड प्रदान करता है py-find-definition- मेनू में देखें सहायता।


6
ध्यान दें कि अजगर-मोड.एल को स्थापित करना होगा। ऐसा नहीं है python-modeकि Emacs डिफ़ॉल्ट रूप से है। ( stackoverflow.com/questions/11363089/… )
ब्रायन जेड

2

एम। एनाकोंडा-मोड में काम करता है (जिसे मैंने एलपीई की समस्या होने के बाद स्विच किया था)।

ध्यान दें कि आपको उचित अजगर पर्यावरण की आवश्यकता है, मेरे मामले में मैं निम्नलिखित कार्य करता हूं: - mkvirtualenv someenv - python setup.py developसभी मॉड्यूल विकसित या उपयोग के लिए (या स्थापित संस्करण के बजाय स्रोत तक पहुंचना पसंद करते हैं) - M-x venv-workon someenvemacs में पथ सक्षम करने के लिए।

anaconda-modeजब भी मैं अजगर और वॉइला को संपादित M-.करता हूं, तब मैं सक्रिय होने के लिए कॉन्फ़िगर करता हूं


1

अच्छा सवाल, यह बॉक्स से बाहर उपलब्ध नहीं है और पूर्ण विकसित आईडीई की एक आसान विशेषता है। मैं cscopeएक अच्छा पतवार इंटरफ़ेस के साथ ऐसा करता हूं :  http://wikemacs.org/wiki/Python#cscope यह "इस प्रतीक को कहां परिभाषित किया गया है? इसका उपयोग कहां किया गया है" जैसे सवालों के जवाब दे सकता है।

पीएस: बुराई-मोड में हम उसी फ़ाइल में एक प्रतीक की परिभाषा के साथ जा सकते हैं gd


मैं मानता हूं कि gdबुराई केवल फ़ाइल में प्रतीक की पहली घटना को खोजती है (डॉकस्ट्रिंग के बावजूद: "परिभाषा पर जाएं या बिंदु के तहत प्रतीक की पहली घटना।")
गॉर्डन गुस्ताफसन

0

M-.जो करने के लिए बाध्य है elpy-goto-definition। उपयोग M-*आपको पिछले स्थान पर वापस जाने की अनुमति देगा int वह बफर। इससे आप किसी चीज़ को जल्दी से देख सकते हैं और पिछले स्थान पर वापस जा सकते हैं।

मैं भी C-c C-oअक्सर ( elpy-occur-definitions) का उपयोग करता हूं । यह सभी वर्ग के साथ एक विंडो खोलेगा और फ़ंक्शन वर्तमान बफर है। उस बफ़र से, दबाव Enterआपको स्रोत कोड में परिभाषा पर उतरेगा।


दरअसल, AFAICT, डिफ़ॉल्ट रूप से किसी भी कुंजी के M-.लिए बाध्य है xref-find-definitionsऔर elpy-goto-definitionनहीं है (हालांकि यह मेनू पर है)। साइट पैकेजों में परिभाषाएं ढूंढना बिल्कुल भी ठीक नहीं लगता है।
रॉबर्ट पी। गोल्डमैन

0

जेडी पायथन के लिए एक भयानक ऑटोकम्प्लीशन / स्टैटिक विश्लेषण पुस्तकालय है। मैंने इसे बहुत पहले इस्तेमाल किया जब मैं विम का उपयोग कर रहा था।

Golang स्वतः पूर्ण इंजन (यानी gocode) vim और Emacs के लिए दोनों काम करता है वैसे ही जैसे, एक ही जेडी इंजन के लिए दोनों काम करता है vim और Emacs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.