ใช้ Emacs เพื่อค้นหาฟังก์ชันใน Python อย่างไร


22

เป็นวิธีที่ง่ายที่สุดในการกำหนดค่า Emacs เพื่อให้สามารถค้นหาตำแหน่งที่กำหนดฟังก์ชันได้อย่างไร ฉันต้องการไฮไลต์ไว้ใน Emacs แล้วกดแป้นคำสั่งผสมเพื่อค้นหาที่มาของฟังก์ชั่น

คุณสามารถทราบได้ว่ามีการใช้งานฟังก์ชั่นที่เฉพาะเจาะจงหรือไม่?

สามารถทำได้อย่างง่ายดายใน PyCharm แต่สามารถทำได้ใน Emacs หรือไม่

คำตอบ:


14

คุณลองElpy แล้วหรือยัง มันผูกคีย์elpy-goto-definition หากคุณมี Emacs ล่าสุดฉันคิดว่าคุณสามารถย้อนกลับด้วย( ) Elpy มีคุณสมบัติที่ดีอื่น ๆ เช่นกันM-.
xref-pop-marker-stackM-,

หากต้องการติดตั้งให้ทำตามคำแนะนำในลิงค์


12

ฉันใช้โหมด Jedi สำหรับ Python และฉันมีความสุขมาก ไม่เพียง แต่จะทำการค้นหาที่ถูกต้องสำหรับการเรียกใช้ฟังก์ชันเท่านั้น แต่ยังแก้ไขฟังก์ชั่นให้เป็นคำจำกัดความที่ถูกต้องแม้ในสถานการณ์ที่ซับซ้อน (เช่นการสืบทอด) มาพร้อมกับระบบสมบูรณ์แบบอัตโนมัติในการบูต http://tkf.github.io/emacs-jedi/latest/


8

คุณสมบัติของ PyCharm ที่คุณพูดถึงเป็นหนึ่งในรายการโปรดของฉันและเป็นหนึ่งในสิ่งแรกที่ฉันมองหาในการพยายามแทนที่ PyCharm อย่างสมบูรณ์ด้วย Emacs (ซึ่งฉันยินดีที่จะบอกว่าฉันสามารถทำได้)

ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆelpyแพ็คเกจนี้มีคุณสมบัตินี้ (นอกเหนือจากคุณสมบัติ IDE ที่มีประโยชน์อื่น ๆ อีกมากมาย ) อย่างไรก็ตามหากคุณใช้elpy-goto-definitionเพื่อค้นหาสัญลักษณ์ ณ จุดนั้นคุณจะพบว่าไม่ช้าก็เร็วว่าในบางกรณีที่ PyCharm จะประสบความสำเร็จในการค้นหาสิ่งที่คุณกำลังมองหาelpyจะไม่ ตามที่เอกสารระบุไว้:

แบ็กเอนด์ไม่สามารถระบุประเภทของสัญลักษณ์ได้เสมอ โดยเฉพาะอย่างยิ่งหลังจากไม่กี่ทิศทางพวกเขาไม่มีความหวังที่จะคาดเดาได้ถูกต้องดังนั้นพวกเขาจึงไม่ทำเช่นนั้น

ในกรณีนี้การเรียกใช้elpy-goto-definitionจะไม่ทำอะไรเลยและแสดงข้อความแสดงข้อผิดพลาดเล็กน้อยในพื้นที่ echo เมื่อสิ่งนี้เกิดขึ้นแน่นอนคุณยังต้องการค้นหาสิ่งที่คุณกำลังมองหาและ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 ที่ชื่นชอบในตัวแก้ไขรายการโปรดของฉัน ฉันรู้ว่านี่เป็นคำถามแบบเก่าและคุณอาจแก้ไขปัญหาหรือย้ายไปแล้ว แต่ฉันหวังว่าคุณหรือคนอื่น ๆ พบว่ามีประโยชน์นี้!



2

M- ทำงานในโหมดงูใหญ่ (ซึ่งฉันเปลี่ยนไปหลังจากมีปัญหากับ elpy)

โปรดทราบว่าคุณต้องการสภาพแวดล้อมที่เหมาะสมหลามในกรณีของฉันฉันทำต่อไปนี้: - mkvirtualenv someenv - python setup.py developสำหรับโมดูลทั้งหมดพัฒนาหรือการใช้งาน (หรือต้องการที่จะไปถึงแหล่งที่มาแทนรุ่นที่ติดตั้ง) - M-x venv-workon someenvการเปิดใช้เส้นทางใน emacs

จากนั้นฉันกำหนดค่าanaconda-modeให้ใช้งานได้ทุกครั้งที่ฉันแก้ไข python และ voila M-.ทำงาน


1

เป็นคำถามที่ดีที่ไม่มีให้ในกล่องและเป็นคุณสมบัติที่มีประโยชน์ของ IDE แบบเต็มรูปแบบ ฉันทำอย่างนั้นด้วยcscopeอินเตอร์เฟส helm ที่ดี:  http://wikemacs.org/wiki/Python#cscopeมันสามารถตอบคำถามเช่น "สัญลักษณ์นี้ถูกกำหนดไว้ที่ไหน?

PS: gdในความชั่วร้ายโหมดที่เราสามารถไปที่ความหมายของสัญลักษณ์ในไฟล์เช่นเดียวกันกับ


ฉันเชื่อgdในความชั่วร้ายเท่านั้นที่พบสัญลักษณ์แรกที่เกิดขึ้นในไฟล์ (แม้จะมี docstring: "ไปที่คำจำกัดความหรือการเกิดขึ้นครั้งแรกของสัญลักษณ์ภายใต้จุด")
Gordon Gustafson

0

M-.ซึ่งถูกผูกไว้elpy-goto-definitionจะทำเคล็ดลับ ใช้M-*จะช่วยให้คุณกระโดดกลับไปที่ตำแหน่งก่อนหน้า int เขาบัฟเฟอร์ สิ่งนี้จะช่วยให้คุณตรวจสอบบางอย่างได้อย่างรวดเร็วและกลับไปยังตำแหน่งก่อนหน้า

ฉันยังใช้C-c C-oบ่อย ( elpy-occur-definitions) นี่จะเป็นการเปิดหน้าต่างที่มีคลาสทั้งหมดและฟังก์ชั่นคือบัฟเฟอร์ปัจจุบัน จากบัฟเฟอร์นั้นการกดEnterจะทำให้คุณมีคำจำกัดความในซอร์สโค้ด


ที่จริงแล้ว AFAICT M-.นั้นเชื่อมโยงกับxref-find-definitionsและelpy-goto-definitionไม่ได้อยู่ในคีย์ใด ๆ โดยค่าเริ่มต้น (แม้ว่าจะอยู่ในเมนู) การค้นหาคำจำกัดความในแพ็คเกจเว็บไซต์ดูเหมือนจะไม่ได้ผลเลย
Robert P. Goldman

0

เจไดเป็นไลบรารีการวิเคราะห์อัตโนมัติ / สแตติกที่น่าประทับใจสำหรับ Python.I ใช้มันเป็นอย่างมากเมื่อฉันใช้ vim

เช่นเดียวกับเครื่องยนต์ golang เติมข้อความอัตโนมัติ (เช่น gocode) ทำงานทั้งเป็นกลุ่มและ emacs เครื่องยนต์เจไดเดียวกันทำงานทั้งเป็นกลุ่มและemacs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.