วิธีที่ง่ายที่สุดในการดาวน์เกรดแพ็คเกจที่ติดตั้งผ่าน MELPA


22

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

ตอนนี้ฉันสามารถทำได้สองวิธี:

  • ฉันได้ตั้ง emacs เพื่อลบไฟล์โดยการย้ายไปที่ถังขยะและเมื่อฉันอัปเดตแพ็คเกจรุ่นเก่าจะถูกทิ้งในถังขยะ ~/.emacs.d/elpaฉันสามารถเรียกรุ่นเก่าและแทนที่หนึ่งใน

  • ไปที่ repo github ของแพ็คเกจที่ใช้งานไม่ได้, ดึงแพ็คเกจที่เก่ากว่า, แทนที่อันที่หนึ่ง~/.emacs.d/elpaด้วย gitub จากนั้นทำการคอมไพล์ไฟล์อีกครั้ง

วิธีการทั้งสองนี้เกี่ยวข้องกับการทำงานด้วยตนเองจำนวนมากซึ่งเคลื่อนไหวไปมา มีวิธีที่ง่ายกว่า (ดีกว่าโดยอัตโนมัติ) ในการดาวน์เกรดแพ็คเกจที่ติดตั้งจาก MELPA หรือไม่?


4
คุณสามารถติดตั้งเวอร์ชั่นล่าสุดผ่านทาง ELPA / package.el, Melpa และ Melpa-stable ไม่ได้เก็บแพ็คเกจรุ่นเก่าไว้ การติดตั้งแพคเกจด้วยตนเอง 1) ดาวน์โหลดรหัสต้นฉบับ M-x package-install-file2) นอกจากนี้ยังมีวิธีอื่นในการจัดการแพคเกจนอกเหนือจาก ELPA / package.el เช่นel-getและquelpaพวกเขาดูเหมือนจะสามารถใช้งานได้โดยไม่ต้อง ELPA บางทีพวกเขาสามารถทำสิ่งที่คุณต้องการ
xuchunyang

2
หากคุณไม่ได้รับง่าย , สามารถทำงานได้คำตอบสำหรับคำถามนี้โปรดพิจารณาส่งคำขอเพิ่มประสิทธิภาพ Emacs: M-x report-emacs-bug(มันยังเป็นที่สำหรับร้องขอการเพิ่มประสิทธิภาพ)
ดึง

คำตอบ:


9

เมื่อคุณอัปเดตแพ็คเกจผ่านM-x list-packagesอินเทอร์เฟซหลังจากติดตั้งแพคเกจสำเร็จคุณจะได้รับคำถามว่าคุณต้องการลบแพคเกจเก่าออกหรือไม่ อย่าลบพวกเขาเพื่อให้พวกเขาอยู่ในสถานที่และจากนั้นคุณสามารถลบแพคเกจใหม่ผ่านทางอินเตอร์เฟซนี้

รายการแพ็กเกจปัจจุบันของฉันแสดงการติดตั้ง magit 4 เวอร์ชันในแผนผังไดเร็กทอรี ~ / .emacs.d / elpa / ของฉัน

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

คุณสามารถล้างข้อมูลเวอร์ชันเก่าในภายหลังด้วยคีย์~(package-menu-mark-obsolete-for-deletion) เพื่อทำเครื่องหมายแพ็กเกจที่ล้าสมัยทั้งหมด หากต้องการลบเวอร์ชันเก่าที่แน่นอนให้ย้ายไปที่บรรทัดและกดdเพื่อทำเครื่องหมายเพื่อลบ หลังจากคุณทำเครื่องหมายแพ็คเกจที่คุณใช้xเพื่อดำเนินการตามปกติ

ในEmacs 25การทำเครื่องหมายแพคเกจทั้งหมดสำหรับUฟังก์ชั่น pgrade จะตั้งค่าแพคเกจเก่าทั้งหมดสำหรับการลบโดยอัตโนมัติและไม่แจ้งให้ยืนยันหลังจากติดตั้ง คุณต้องค้นหาบรรทัดที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่ "D" ซึ่งคุณสามารถยกเลิกการทำเครื่องหมาย (ดีที่สุดด้วยมาโครต่อไปนี้)

พิมพ์คีย์หรือคอร์ดทางด้านซ้ายของเส้นประจากบรรทัดต่อไปนี้

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

หากไม่มีการจับคู่เพิ่มเติมสำหรับการค้นหามาโครจะส่งเสียงกริ่งและหยุดดังนั้นคุณสามารถC-u 0 <F4>ยกเลิกการทำเครื่องหมายแพ็คเกจทั้งหมดที่ทำเครื่องหมายไว้สำหรับการลบ หลังจากนี้คุณสามารถxทำการติดตั้ง

ฟังก์ชั่นที่ฉันประกาศว่าจะเปลี่ยนแปลงในความคิดเห็นของฉันจะต้องมีการเปลี่ยนแปลงในแบบที่ฉันยังไม่เข้าใจเพราะเป็นสิ่งสำคัญที่บล็อก (cond) สุดท้ายจะต้องประสบความสำเร็จเพื่อที่จะไม่วนซ้ำไม่รู้จบ


โอ้โหมันไม่ได้ขอให้ยืนยันการลบใน emacs ของฉัน มันเพิ่งลบแพ็คเกจเก่า: / ฉันคิดว่ามันเคยถามใน emacs 24? ฉันจำไม่ได้
Chakravarthy Raghunandan

จริง Emacs 24 พร้อมท์, 25 ดูเหมือนว่าจะทำเครื่องหมายเก่าสำหรับการลบและที่จะก่อให้เกิดการดำเนินการเครื่องหมาย คุณสามารถทำเครื่องหมายแพ็คเกจสำหรับการติดตั้งด้วยมือหรือยกเลิกการทำเครื่องหมายการลบหรือเปลี่ยน(t (package-menu-mark-delete))บรรทัดpackage-menu--mark-upgrades-1เพื่อให้บรรทัดแรกคือการทดสอบตัวแปรการกำหนดค่าหรือสิ่งที่ส่งกลับnilเมื่อคุณไม่ต้องการลบแพคเกจเก่าทันที
p_wiersig

คุณช่วยเพิ่มบรรทัดที่เกี่ยวข้องเพื่อแก้ไขในpackage.elคำตอบเดิมเพื่อที่ฉันจะได้รับคำตอบหรือไม่ ขอบคุณ
Chakravarthy Raghunandan

แน่ใจ ฉันสังเกตเห็นว่าฉันไม่สามารถทำให้ฟังก์ชั่นทำสิ่งที่ฉันต้องการได้ฉันจึงอธิบายวิธียกเลิกการทำเครื่องหมายทั้งหมดผ่านมาโคร
p_wiersig

7

ตัวเลือกนิวเคลียร์อย่างที่ควรจะเป็นไปได้package.elทั้งหมดและใช้โปรแกรมจัดการแพ็คเกจที่ฉันเขียนstraight.elแทน ข้อดีคือการstraight.elติดตั้งแพ็กเกจโดยการโคลนที่เก็บ Git ของพวกเขาดังนั้นจึงเป็นการง่ายที่จะใช้เวอร์ชันที่คุณต้องการ นอกจากนี้ยังstraight.elมีฟังก์ชั่นสำหรับจัดการกับการแก้ไขล็อกไฟล์ซึ่งช่วยให้คุณสามารถบันทึกสถานะที่แน่นอนของการกำหนดค่าการจัดการบรรจุภัณฑ์ของคุณลงไปในรายละเอียดที่เล็กที่สุด จากนั้นในกรณีฉุกเฉินคุณสามารถเปลี่ยนแพคเกจทั้งหมดกลับเป็นรุ่นที่รู้จักดีได้

การดำเนินงานประเภทนี้โดยทั่วไปเป็นไปไม่ได้package.elและจะไม่สามารถทำได้ตลอดเนื่องจากการออกแบบโดยรวม

straight.elในการตอบสนองความต้องการของคุณเพื่อหลีกเลี่ยงการกระทำทุกครั้งที่คุณอัปเดตแพคเกจของคุณนี้ไม่จำเป็นต้องมี ฉันขอแนะนำให้เขียนรุ่น lockfile และยอมรับว่าทุกครั้งที่คุณอัปเดตแพ็คเกจของคุณเนื่องจากเป็นไปไม่ได้เลยที่จะเข้าสู่สถานะที่การกำหนดค่า Emacs ของคุณเสียหลังจากการอัปเกรดและคุณไม่รู้วิธีการคืนค่า แต่คุณไม่ต้องทำสิ่งนี้ถ้าคุณชอบใช้ชีวิตบนขอบ


4

ฉันพบวิธีง่ายๆในการปรับลดรุ่น: การจัดการ Melpa ที่เก็บถาวรของคุณเอง

  1. Clone melpa repo
  2. ติดตามหน้า wiki Melpa ที่เก็บถาวรที่กำหนดเองของ melpaเพื่อลบสูตรทั้งหมด
  3. ค้นหาการกระทำของแพ็คเกจที่คุณต้องการลดระดับลงและสร้างสูตรใหม่ด้วยการกระทำสำหรับแพ็คเกจ (ดูreadme ของ melpaเกี่ยวกับวิธีระบุการส่ง)
  4. รันmakeเพื่อสร้างแพ็คเกจที่ถูกดาวน์เกรด
  5. เพิ่มการเก็บถาวร Melpa ของคุณเองซึ่งสามารถเป็นไดเรกทอรีท้องถิ่นไปยังpackage-archivesรายการ
  6. ติดตั้งแพ็คเกจที่ลดระดับโดยใช้เมนูแพ็คเกจ หรือคุณสามารถใช้package-pinned-packagesเพื่อ จำกัด การเก็บถาวรที่ควรดาวน์โหลดแพคเกจจาก

3

ผู้คนจำนวนมากเลือกที่จะไม่มอบแพ็คเกจ ELPA ให้กับการควบคุมเวอร์ชัน แต่นี่เป็นตัวอย่างของสาเหตุที่ฉันเชื่อว่าคุณควรทำเช่นนั้น

การคืนค่าสิ่งต่าง ๆนั้นเป็นเรื่องเล็กน้อยหากมีความมุ่งมั่น

ขึ้นอยู่กับสถานะของแพ็คเกจ ELPA ต้นน้ำที่มีความเสี่ยง


แต่นั่นหมายความว่าฉันต้องจำให้คอมมิททุกครั้งที่ฉันอัพเดทแพ็คเกจ นั่นไม่ใช่สิ่งที่ฉันต้องการ หรือมีวิธีที่ฉันสามารถสร้าง emacs โดยอัตโนมัติและยอมรับแพคเกจการปรับปรุงเมื่อใดก็ตามที่ฉันทำการปรับปรุงแพคเกจ?
Chakravarthy Raghunandan

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