นำทางไปยังซอร์สโค้ดของฟังก์ชันและตัวแปรในตัว


9

ตลอดทั้งวันฉันใช้C-h fหรือC-h v( describe-functionและdescribe-variable) เพื่อค้นหาเอกสารสำหรับฟังก์ชั่นและตัวแปรตลอดเวลา บ่อยกว่านั้นถ้าฉันไม่ได้รับข้อมูลทั้งหมดที่ฉันต้องการฉันจะคลิกที่ลิงค์ของไฟล์ในตอนท้ายของ:

some-random-command is an interactive compiled Lisp function in `some-mode.el'.

และนำทางไปยังซอร์สโค้ด ใช้งานได้กับแพ็คเกจที่ติดตั้ง แต่ดูเหมือนจะใช้งานไม่ได้กับแพ็คเกจในตัว ตัวอย่างเช่นที่ด้านบนของหน้าช่วยเหลือสำหรับคำสั่งdescribe-functionทั้งหมดที่ฉันได้รับคือ:

describe-function is an interactive compiled Lisp function.

ไม่มีลิงก์ไปยังซอร์สโค้ด มีวิธีใดที่จะนำทางไปยังซอร์สโค้ดของแพ็คเกจในตัวได้อย่างรวดเร็ว

ฉันรู้ว่าฉันสามารถหาซอร์สโค้ดได้เช่น, /usr/share/emacs/24.5/lispและหาวิธีการเข้าถึงไดเรกทอรีนั้นได้อย่างรวดเร็ว แต่ฉันอยากรู้ว่ามีวิธีที่ง่ายและรวดเร็วในการนำทางฟังก์ชั่น / คำจำกัดความของตัวแปรในตัว รหัสแหล่งที่มา. ขอบคุณ!


5
M-x find-function; M-x find-variable; M-x find-face; M-x find-library. ฉันมักจะใช้การติดตั้ง Emacs แบบเต็มรูปแบบเพื่อให้ฉันสามารถเข้าถึงทุกสิ่งได้และหลังจากสร้าง Emacs ของตัวเองฉันก็จะคัดลอกรหัส C-source และตั้งค่าตำแหน่งเพื่อให้ฉันสามารถค้นหาคำจำกัดความของรหัส C-Source ได้เช่นกัน ดูตัวแปรfind-function-C-source-directoryเพื่อตั้งค่าตำแหน่งของรหัส C-source หลังจากที่คุณคัดลอกไป
กฎหมาย

1
การใช้สาขาหลักของ Emacs ฉันได้รับดังต่อไปนี้ด้วยM-x describe-function: description-function เป็นฟังก์ชั่น Lisp ที่คอมไพล์แล้วที่มีการโหลดอัตโนมัติใน 'help-fns.el' และจากที่นั่นฉันสามารถคลิกที่ (หรือกด Enter) help-fns.elแล้วส่งไปยังส่วนที่เกี่ยวข้องของรหัส บางทีคุณอาจมี Emacs หลายรุ่นและรุ่นที่คุณใช้อยู่ในขณะนี้ไม่ได้ติดตั้งซอร์สโค้ดทั้งหมดใช่หรือไม่
กฎหมาย

หากคุณพบพฤติกรรมดังกล่าวเมื่อคุณเริ่มใช้ Emacs โดยใช้emacs -Q(ไม่มีไฟล์ init) หรือหากคุณสามารถทำซ้ำได้ด้วยสูตรที่ขึ้นต้นด้วยemacs -Q(เช่นบอกว่าคุณโหลดไลบรารีใดและโหลดอย่างไร ฯลฯ ) โปรดพิจารณาการจัดทำข้อบกพร่อง รายงาน: M-x report-emacs-bug.
ดึง

4
nb IIRC, แพ็คเกจ Emacs สำหรับ Debian (อาจเป็น OS อื่น ๆ เช่นกัน) แยก.elไฟล์ (ถือว่าเป็นตัวเลือก) ออกจาก.elcไฟล์ (จำเป็น), เช่นที่คุณต้องติดตั้งแพ็คเกจเพิ่มเติมหนึ่งแพ็คเกจหรือมากกว่าเพื่อรับมัน หากคุณได้รับ Emac จากผู้จัดการแพ็คเกจระบบปฏิบัติการของคุณนี่อาจอธิบายได้
phils

1
คุณสามารถทำการ grep (หรือยูทิลิตีการค้นหาอื่น ๆ ) สำหรับชื่อของไบนารี (ที่มีสิทธิ์อนุญาตปฏิบัติการ) - emacsหรือemacsclient - และดูว่าพวกเขาอยู่ที่ไหนในฮาร์ดไดรฟ์ของคุณ ฉันเก็บระเบิดทั้งหมดไว้ในโฟลเดอร์เฉพาะของพวกเขาเอง ตัวอย่างเช่นฉันมีรุ่นที่จัดส่งมาพร้อมกับระบบปฏิบัติการของฉัน - /usr/bin/emacsและ/usr/bin/emacsclientฉันมีรุ่นที่บรรจุอย่างดีในโฟลเดอร์แอปพลิเคชัน OSX ที่ลงท้ายด้วย. app - เช่น/Applications/Emacs.app(ภายใน Emacs.app นั้นเป็นไบนารีและทั้งหมด ไฟล์ซอร์สโค้ด)
กฎหมาย

คำตอบ:


7

บางครั้งเหตุผลที่คุณเห็น“ ฟังก์ชั่น Lisp ที่คอมไพล์ด้วยอินเตอร์แอคทีฟ” (หรือตัวแปรเช่นเดียวกัน) ที่ไม่มีชื่อไฟล์ก็คือฟังก์ชั่นถูกโหลดจากไฟล์ที่คอมไพล์ด้วยไบต์และไฟล์ต้นฉบับ Elisp ที่สอดคล้องกัน ในการแสดงซอร์สโค้ดแก่คุณ Emacs จะต้องสามารถค้นหาซอร์สโค้ดได้

การกระจายจำนวนมากจัดส่งไฟล์ต้นฉบับ Lisp ในแพ็คเกจแยกต่างหากเพราะไม่ใช่ผู้ใช้ทุกคนที่ต้องการและพวกเขาก็ใหญ่ ยกตัวอย่างเช่นใน Debian emacs24-elและอนุพันธ์ติดตั้ง หากคุณสร้าง Emacs จากแหล่งที่มาให้make installคัดลอกแหล่งที่มาของ Elisp

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

Emacs load-pathมองหาแหล่งที่มาของเสียงกระเพื่อมในไดเรกทอรีใน สำหรับฟังก์ชั่นหรือตัวแปรโหลดจากfoo.elc,ไฟล์ที่สามารถหรือfoo.el foo.el.gzEmacs จะค้นหาแหล่งที่มาของ C ภายใต้source-directoryและแจ้งให้คุณหาไดเรกทอรีอื่นหากไม่พบไฟล์ต้นฉบับ


แม้ว่าฉันจะได้สาบานว่าฉันจะสร้าง Emacs รุ่นนี้จากแหล่งที่มาเมื่อฉันเรียกM-x emacs-versionมันว่า "แก้ไขโดย Debian" ในตอนท้ายซึ่งจะระบุว่าฉันกำลังใช้เวอร์ชันจากตัวจัดการแพคเกจระบบปฏิบัติการ (Ubuntu) ใช่ไหม?
elethan

@elethan หากมีข้อความว่า“ แก้ไขโดย Debian” คุณต้องติดตั้งหรือสร้างแพ็คเกจ Ubuntu อย่างน้อย คุณอาจสร้างมันขึ้นมาจากแหล่งที่มา (อาจเป็นเพราะคุณต้องการเวอร์ชั่นที่ใหม่กว่าใน Ubuntu ของคุณ) คุณกำลังทำงานอยู่/usr/bin/emacsหรือ/usr/local/bin/emacs?
Gilles 'หยุดความชั่วร้าย'

1

หากคุณกำลังมองหาวิธีที่จะข้ามไปยังซอร์สโค้ดอย่างรวดเร็วก็มีเช่นกันfind-function-at-pointและfind-variable-at-pointจะข้ามไปที่นิยามของสัญลักษณ์ใต้เคอร์เซอร์ - คุณสามารถผูกมันไว้กับ Ch Cf และ Ch Cv

หรือคุณอาจลองใช้elisp-slime-navซึ่งใช้ M- เพื่อข้ามไปที่คำจำกัดความของสัญลักษณ์และ M- เพื่อส่งคืน - นำทางไปยังตัวแปรฟังก์ชันไลบรารีและใบหน้า - https://github.com/purcell/elisp-slime-nav/

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