Emacs 24: การโหลดแพ็คเกจที่ติดตั้งผ่านทาง ELPA


12

ฉันเพิ่งติดตั้งcmake-modeแพ็คเกจใน Emacs 24 โดยใช้:

M-x package-install cmake-mode

ฉันสามารถดูแพ็คเกจได้ที่: ~/.emacs.d/elpa/cmake-mode-20110824และฉันสามารถโหลดได้โดยใช้คำแนะนำที่Commentary:ส่วนของ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el:

;; Add this code to your .emacs file to use the mode:
;;
;;  (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path))
;;  (require 'cmake-mode)
;;  (setq auto-mode-alist
;;        (append '(("CMakeLists\\.txt\\'" . cmake-mode)
;;                  ("\\.cmake\\'" . cmake-mode))
;;                auto-mode-alist))

อย่างไรก็ตามสิ่งนี้ขัดแย้งกับคำแนะนำการใช้งานในหน้า EmacsWiki ของ ELPA:

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

ฉันมักจะเห็นด้วยกับคำแนะนำนี้เพราะการเพิ่ม~/.gnu-emacsไฟล์ลงในบรรทัดของฉันเช่น:

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

น่าเกลียดและจะแตกถ้าและเมื่อไหร่ฉันจะอัพเกรดแพ็คเกจ อย่างไรก็ตามหากไม่มีบรรทัดนี้ฉันไม่สามารถใช้งานcmake-modeได้

ฉันทำอะไรบางอย่างหายไปหรือเปล่า

หมายเหตุ:

  • ฉันไม่ได้ทำอะไรแปลกและค่าที่เป็นpackage-enable-at-startupt
  • ฉันใช้โหมโรง
  • user-emacs-directoryค่าคือ"~/.emacs.d/" (ขอบคุณ @lawlist สำหรับคำแนะนำ)
  • package-user-dir ค่าคือ "~/.emacs.d/elpa"

1
เป็นไปได้หรือไม่ที่คุณได้เปลี่ยนตำแหน่งของdefault-directoryหรือuser-emacs-directoryเช่นที่elpaไดเรกทอรีไม่ได้ถูกโหลด? package-installสร้างelpaไดเรกทอรีและไฟล์ autoloads ที่สร้างขึ้นระหว่างการติดตั้งขึ้นอยู่กับตำแหน่งนั้น
กฎหมาย

1
บรรทัดสุดท้ายของรหัสในคำถามของคุณแสดงให้เห็นว่าคุณย้ายแพคเกจออกจากelpaไดเรกทอรี - กล่าว~/.emacs.d/cmake-mode-20110824/คือไม่ใช่ตำแหน่งที่ไฟล์ autoloads คาดว่าจะเป็น
กฎหมาย

@ กฎหมาย: คุณเป็นคนช่างสังเกตมาก ฉันทำผิดพลาดในคำถาม มันได้รับการแก้ไขในขณะนี้ (คำถาม) ~/.emacs.d/elpa/cmake-mode-20110824/เป็นค่าที่ถูกต้องของ ปัญหายังคงอยู่
เฉินเลวี

คำตอบ:


2

ฉันติดตั้ง cmake-mode ด้วย marmalade-repo และดูที่ cmake-mode-autoloads.el ปรากฏว่าผู้เขียนได้ทำการตัดสินใจnotอย่างมีสติรวมถึงทุกสิ่งที่จำเป็นสำหรับการตั้งค่าภายในไฟล์ autoloads อย่างไรก็ตามคำแนะนำในบรรทัดที่ 25 ถึง 30 ของ cmake-mode.el นั้นถูกต้องซึ่งคุณอ้างถึงในคำถามของคุณ หากคุณใช้เส้น 25-30 และกำหนดเส้นทางได้อย่างถูกต้องแล้วคุณไม่(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")จำเป็นต้องมีสายพิเศษของรหัสเช่น

เห็นได้ชัดว่าคุณจะไม่ต้องการใช้/dir/with/cmake-mode- คุณต้องการใช้~/.emacs.d/elpa/cmake-mode-20110824โดยไม่ต้องใช้สแลชข้างหน้าตอนจบ

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path))
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

คุณอาจต้องลบไดเรกทอรี c-make-mode ... และลองติดตั้งใหม่หากรหัสด้านบนไม่ทำงาน (ใช้เส้นทางของคุณเอง)


แน่นอน แต่ถ้าฉันไม่มีอะไรขาดหายไปถ้าคุณอัปเดตโหมด cmake ผ่านทาง ELPA ในภายหลังไดเรกทอรีจะถูกเปลี่ยนชื่อเป็นสิ่งที่ไม่ได้อยู่ในไฟล์ init ของคุณหรือรุ่นที่ใหม่กว่าจะจบลงในไดเรกทอรีที่ไม่ได้อยู่ในเส้นทางโหลดของคุณ ในกรณีหลังคุณอาจไม่เห็นการอัปเดตหรือคุณได้รับความแปลกเกินควรเนื่องจากคุณโหลดหนึ่งเวอร์ชันด้วยตนเองและกำลังโหลดอีกเวอร์ชัน(package-initialize)หนึ่ง ฉันผิดหรือเปล่า? ฉันหมายความว่าฉันไม่ได้ใช้ ELPA มากและยังไม่ได้อัปเดตแพ็คเกจใด ๆ ด้วยดังนั้นฉันอาจผิด และแน่นอนว่าไม่ใช่เรื่องสำคัญในทุกกรณี แต่ทำไมไม่หลีกเลี่ยงมันทั้งหมด?
Aaron Miller

คุณถูก. อย่างไรก็ตามแพ็คเกจเหล่านี้ไม่เพียง แต่อัพเดตตัวเองโดยที่คุณไม่รู้ตัว - ถ้าและเมื่อใดที่คุณอัปเดตนั่นจะเป็นเวลาที่คุณจะต้องดูแลทำความสะอาด ฉันลงทุนบ่อยครั้งในการแก้ไขไฟล์ต้นฉบับของแพ็คเกจต่างๆและฉันไม่ต้องการให้พวกเขาอัปเดตหลังจากใช้เวลาตลอดเวลาทำให้พวกเขาถูกต้อง Emac นั้นอยู่ไกลจากสิ่งที่คน ๆ หนึ่งอาจคิดว่าเป็น "การบำรุงรักษาฟรี"
กฎหมาย

จุดที่ยอดเยี่ยม
Aaron Miller

3

เมื่อพิจารณาถึงลักษณะของวิกิว่าเป็นที่เก็บรหัสครึ่ง, ผู้ช่วยครึ่งความจำสำหรับแฮ็กเกอร์ Emacs คุณมองข้ามประเด็นนี้อย่างเข้าใจได้:

มันอาจจะง่ายกว่าเพียงแค่ย้ายแพคเกจเริ่มต้นไปยังจุดอื่นในระหว่างการเริ่มต้นเพื่อให้คุณสามารถ (ต้อง) แพคเกจ ELPA สิ่งนี้จะดูแลปัญหาที่อธิบายไว้มากมาย:

นี่คือสิ่งที่ฉันทำ; หนึ่งในไฟล์แรกที่โหลดโดยสคริปต์เริ่มต้นที่กำหนดเองของฉัน (การสร้างซึ่งจากทั้งหมดที่ฉันสามารถรวบรวมเป็นpons asinorumของ Emacs ร้ายแรงใช้1 )

(require 'package)
(setq package-enable-at-startup nil)
(package-initialize)

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

(1. แม้จะมีสิ่งล่อใจเกือบล้นหลาม แต่ฉันปฏิเสธที่จะตั้งชื่อสคริปต์เริ่มต้นที่กำหนดเองของฉันlightsaber.elด้วยตนเอง)


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

1

after-init-hookคุณก็สามารถทำเริ่มต้นของคุณทั้งหมดหลังจากโหลดแพคเกจการใช้ จากEmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))

0

ฉันมีปัญหาที่คล้ายกันเมื่อฉันเริ่มใช้ ELPA ในกรณีของฉันฉันมีแพคเกจท้องถิ่นหลายอย่างเนื่องจากไม่มีใน ELPA

ดังนั้นฉันจึงเปลี่ยนเส้นทางโหลด ด้วยเหตุผลบางประการโหลดพา ธ ไม่ได้รับการอัพเดตอย่างเหมาะสมโดย package.el เพื่อแก้ปัญหาฉันต้องใส่(setq load-path (cons "~/.emacs.d" load-path)) หลังจากโทรไปpackage-initialize

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