ฉันจะแก้ไขปัญหา Emacs ได้อย่างไร


21

ในสถานการณ์ที่ Emacs ไม่ทำงานเหมือนที่ฉันต้องการฉันจะแก้ไขปัญหาได้อย่างไร ฉันจะใช้ขั้นตอนอะไรในการค้นหาและแก้ไขปัญหาด้วยตนเอง

หรือล้มเหลวฉันจะรวบรวมข้อมูลที่เป็นประโยชน์เพื่อให้ผู้คนที่นี่ (หรือในรายชื่อผู้รับจดหมายหรือฟอรัมอื่น ๆ ) สามารถช่วยฉันแก้ปัญหาได้อย่างไร

Emacs ของฉันมีแพ็คเกจมากมายสำเนาของตัวอย่าง & วาง (หรือถูกฆ่า & ดึง) จากทั่วอินเทอร์เน็ตและอิลิสที่กำหนดเองของฉันซึ่งฉันจำไม่ได้ว่าเป็นงานเขียนหรือไม่เข้าใจอีกต่อไป มีวิธีที่จะทำให้ความรู้สึกของภาวะแทรกซ้อนเหล่านี้ทั้งหมดหรือไม่?


ไม่แน่ใจว่านี้เป็นสถานที่ที่ดีที่สุดสำหรับการนี้ แต่มีจำนวนมากของคำถามที่ว่าได้รับการตอบ / ความคิดเห็นขอemacs -Qเป็นขั้นตอนแรก ฉันเขียนสิ่งนี้ขึ้นเพื่อเชื่อมโยงคำถามเหล่านั้นกับความช่วยเหลือทั่วไปสำหรับผู้ใช้ใหม่
ไทเลอร์

ใช่มันเป็นสถานที่ที่ดีที่สุดสำหรับสิ่งนี้ ที่จริงแล้วคำถามดังกล่าวถูกแนะนำ (เกือบ) 2 ปีที่แล้ว: meta.emacs.stackexchange.com/q/198/184ขอบคุณ!
T. Verron

คำตอบ:


28

ขั้นตอนที่ 1: เรียกใช้ emacs -Q

สิ่งแรกที่คุณต้องทำคือเรียกใช้ emacs โดยไม่ต้องทำการปรับแต่งใด ๆ หากคุณสามารถสร้างปัญหาขึ้นมาใหม่ใน Vanilla Emacs ได้จริง ๆ แล้วมันอาจจะเป็นข้อบกพร่องใน Emacs เอง มันหายาก แต่เราแยกออกเป็นขั้นตอนแรก

หากคุณเริ่มต้น Emacs จากบรรทัดคำสั่งด้วยการ-Qตั้งค่าสถานะเช่นemacs -Qคุณจะได้รับ emacs เปล่าหรือ 'vanilla' โดยไม่มีการกำหนดค่าท้องถิ่นของคุณโหลด ปัญหาของคุณยังคงเกิดขึ้นหรือไม่? หากเป็นเช่นนั้นให้ข้ามไปที่ "การให้ข้อผิดพลาดสูตร"

ขั้นตอนที่ 1b: จะเกิดอะไรขึ้นหากมีปัญหากับแพ็คเกจ

หากปัญหาของคุณเฉพาะแพคเกจเฉพาะแน่นอนคุณไม่สามารถทำซ้ำได้โดยไม่ต้องโหลดแพคเกจที่ แต่คุณต้องการโหลดเฉพาะแพ็คเกจที่เกี่ยวข้องไม่ใช่การกำหนดค่าทั้งหมดของคุณ หากต้องการทำเช่นนั้นให้เรียกใช้emacs -Qอีกครั้งและเตรียมสคริปต์สั้น ๆ ดังต่อไปนี้:

(require 'package)
(setq package-load-list
      '((package1 t)))
(package-initialize)

แทนที่package1ด้วยชื่อของแพ็คเกจที่คุณต้องการโหลด หากคุณต้องการโหลดหลายแพ็คเกจให้แก้ไขสคริปต์ตามนี้:

(require 'package)
(setq package-load-list
      '((package1 t)
        (package2 t)
        (package3 t)))
(package-initialize)

การโหลดโค้ดนี้คุณสามารถวางมันลงไปในกันชนและโทร*scratch* M-x eval-buffer(หรือบัฟเฟอร์ใด ๆ ตราบใดที่มันไม่มีโค้ดอื่นอยู่!)

ณ จุดนี้คุณได้โหลดแพคเกจและเพียงแค่แพคเกจที่คุณกำลังทดสอบ หากคุณสามารถทำให้เกิดปัญหาได้ในตอนนี้ให้ข้ามไปที่ "การจัดหาสูตรบั๊ก"

ขั้นตอนที่ 2: ค้นหาจุดบกพร่องในตัวคุณ .emacs

ตอนนี้คุณได้ยืนยันแล้วว่าปัญหามาจากบางสิ่งในการกำหนดค่าของคุณ ("การโทรมาจากภายในบ้าน!") การกำหนดค่าของคุณอาจยาวหลายพันบรรทัดและอาจโหลดไฟล์หลายไฟล์ ในการค้นหาปัญหาคุณจะทำการค้นหาแบบไบนารีโดยใส่ความคิดเห็นลงครึ่งหนึ่งของรหัสในแต่ละครั้งเพื่อ จำกัด สิ่งต่าง ๆ ให้แคบลง 1

  1. เปิด emacs ปกติของคุณemacsโดยไม่มี-Qตัวเลือก
  2. เปิดไฟล์กำหนดค่าของคุณ (โดยปกติ~/.emacsหรือ.emacs.d/init.elหากคุณไม่สามารถลองได้C-h v user-init-file)
  3. เลือกครึ่งแรกของไฟล์: C-spaceในการตั้งเครื่องหมายเลื่อนลงครึ่งทางเพื่อขยายพื้นที่
  4. ใส่ความคิดเห็นเกี่ยวกับภูมิภาคที่เลือก: M-;และบันทึกไฟล์
  5. เปิดใหม่ emacs ( emacs ทดสอบของคุณ) โดยปล่อยให้ emacs ตัวแรกทำงาน emacs ทดสอบจะอ่านเวอร์ชันที่ลดลงของการกำหนดค่าของคุณ
  6. ลองทำซ้ำปัญหาในการทดสอบ emacs
  7. หากคุณไม่สามารถทำซ้ำได้ให้ปิดการทดสอบ emacsและใน emacs ดั้งเดิมของคุณที่undoมีความคิดเห็นด้วยC-/และแสดงความคิดเห็นครึ่งหนึ่งของรหัสที่เหลืออยู่ เปิดemacs ทดสอบใหม่แล้วลองอีกครั้ง
  8. หากคุณสามารถทำให้เกิดปัญหาอีกครั้งให้ใส่รหัสครึ่งที่เหลือและดูว่ายังมีปัญหาอยู่หรือไม่
  9. ทำซ้ำขั้นตอนนี้จนกว่าคุณจะพบการกำหนดค่าน้อยที่สุดที่จำเป็นในการทำให้เกิดปัญหาอีกครั้ง

หากปัญหาของคุณเกิดขึ้นกับแพคเกจเฉพาะคุณจะต้องทิ้งรหัสที่โหลดไว้โดยไม่ใส่เครื่องหมายแสดงความคิดเห็นแน่นอน

หากไฟล์กำหนดค่าของคุณโหลดไฟล์อื่น ๆ คุณอาจขยายการค้นหาลงในไฟล์เหล่านั้นด้วย

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

ขั้นตอนที่ 3: การจัดทำสูตร Bug

ณ จุดนี้คุณควรสามารถให้สูตรบั๊กแบบละเอียดเพื่อโพสต์ได้ที่นี่ มันควรจะรวมถึง:

  • เวอร์ชั่น Emacs ของคุณ (คุณสามารถรับได้จาก Emacs ด้วย M-x emacs-version
  • ระบบปฏิบัติการของคุณ (Windows #, Mac, Linux Distribution)
  • เวอร์ชันของแพ็คเกจที่คุณกำลังต่อสู้หากมี
  • เฉพาะขั้นตอนที่จำเป็นที่จะต้องแสดงให้เห็นถึงปัญหาที่เกิดขึ้นรวมทั้งสิ่งที่คุณคาดหวังที่จะเกิดขึ้นและสิ่งที่เกิดขึ้นจริง

ตัวอย่างเช่นฉันอาจโพสต์คำถามเช่นนี้:

ฉันมีปัญหากับโหมดซุปเปอร์ เมื่อฉันใช้M-x sm-compile-codeมันจะทำการถอนออกจากบัญชี PayPal ของฉัน

ขั้นตอนในการทำซ้ำ:

โหลดโหมดซุปเปอร์:

(require 'package)
(setq package-load-list
      '((super-mode t)))
(package-initialize)
  • เปิดไฟล์ใหม่ด้วย C-x C-f my-code
  • ป้อนรหัสหนึ่งบรรทัด:
10 goto 10
  • โทร M-x sm-compile-code

ฉันคาดว่าสิ่งนี้จะเรียก super-compiler และรวบรวมโปรแกรมของฉัน ฉันเห็นข้อความใน minibuffer แทน "$ 100 ถูกโอนจาก paypal ไปยังผู้สร้างโหมด super"

GNU Emacs 25.1.50.3
Debian Linux
Super-mode เวอร์ชั่น 3.1415


1 ฮันเตอร์ Bugแพคเกจอาจจะช่วยให้คุณมีนี้ (กึ่ง) โดยอัตโนมัติตัดไฟล์ init ของคุณ


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