ฉันจะโหลด. emacs ใหม่หลังจากเปลี่ยนได้อย่างไร


375

ฉันจะให้ Emacs โหลดคำจำกัดความทั้งหมดของฉันที่ฉันอัปเดต.emacsใหม่โดยไม่ต้องรีสตาร์ท Emacs ได้อย่างไร


18
ฉันรู้ว่า emacs นั้นมักจะถือว่าเป็นระบบปฏิบัติการ แต่ ... s / reboot / restart /?
William Pursell

6
ฉันไม่ใช่นักพัฒนาดังนั้นคำตอบจำนวนมากที่เข้าใจได้ทันทีสำหรับนักพัฒนาไม่ได้มีความหมายกับฉันมากนัก
Yazz.com

4
@MJB จุดประสงค์ของ Stack Overflow คือเป็นคลังความรู้สำหรับแม้แต่คำถามพื้นฐานที่สุด คำถามนี้เข้ากันได้อย่างสมบูรณ์แบบกับจุดประสงค์ของการโอเวอร์โฟลว์ โปรดดูstackoverflow.com/faq
chollida


10
ฮ่าฮ่าห้าปีต่อมาคำแนะนำ "การค้นหาโดย Google ก่อน" นำไปสู่ที่นี่! ดี
JimLohse

คำตอบ:


350

คุณสามารถใช้คำสั่งโหลดไฟล์ ( M-x load-fileจากนั้นกด Return สองครั้งเพื่อยอมรับชื่อไฟล์เริ่มต้นซึ่งเป็นไฟล์ปัจจุบันที่กำลังแก้ไข)

คุณสามารถย้ายจุดไปยังจุดสิ้นสุดของ sexp ใด ๆ แล้วกดC-xC-eเพื่อเรียกใช้ sexp นั้น โดยปกติแล้วมันไม่จำเป็นต้องทำการรีโหลดไฟล์ทั้งหมดหากคุณเพียงแค่เปลี่ยนบรรทัดหรือสองไฟล์


22
โปรดทราบว่าสิ่งนี้อาจไม่ได้ทำในสิ่งที่คุณคิดเสมอไป หากคุณมีตัวแปรที่มีเนื้อหาที่ถูกฟลอปปี้ (นั่นคือการตั้งค่าบูลีนเป็นตรงกันข้าม) พฤติกรรมจะไม่เหมือนกับโหลดไฟล์
chollida

4
ผลข้างเคียงใด ๆ โดยทั่วไปมีแนวโน้มที่จะทำลายพฤติกรรมที่ต้องการ: การโหลดไฟล์ ฯลฯ
vemv

เมื่อฉันทำสิ่งนี้ฉันจะได้รับข้อความ: การโหลดด้วยการแปลงรหัส: ค่าของสัญลักษณ์ในขณะที่ตัวแปรเป็นโมฆะ: n
Chris Marie

2
แทนการย้ายจุดที่อยู่เบื้องหลังdefunหรือคุณยังสามารถปล่อยให้มันอยู่ภายในร่างกายประกาศและประเภทdefvar C-M-xมีประโยชน์มาก
โทมัส

151

แปลกมากที่สะดวกมาก

M-x eval-buffer

ไม่ได้กล่าวถึงที่นี่

มันจะประเมินโค้ดทั้งหมดในบัฟเฟอร์ทันทีซึ่งเป็นวิธีที่เร็วที่สุดหากคุณ.emacsเป็น idempotent


3
ใครบอกว่านั่น.emacsคือ (หรือจะต้องเป็น) idempotent?
ไมค์

@ ไมค์: ไม่ใช่ฉัน "ให้ a, b เป็นจริง" มีความหมายสำหรับฉัน "ถ้า a, b เป็นจริง" แต่ฉันเห็นได้ว่าคุณหมายถึงอะไร ฉันเปลี่ยนให้ถ้าหากเพื่อความชัดเจนมากขึ้น
ปีเตอร์

7
@ ไมค์: เมื่อไหร่ที่จะ .emacsไม่ควรเป็น idempotent?
Zaz

ฉันคิดว่านี่จะเป็นคำแนะนำแรก
สไตรเกอร์

1
ฉันจะไม่บอกว่ามันเป็นสไตล์ที่ดี แต่มันอาจเกิดขึ้น ตัวอย่างเช่นคุณสามารถเลือกที่จะไม่กำหนดฟังก์ชันใหม่หากมีการกำหนดไว้แล้ว (ตั้งแต่เริ่มต้นครั้งแรก) คุณอาจไม่เห็นการเปลี่ยนแปลงในคำนิยามเมื่อทำการประเมินไฟล์ init ของคุณ
Kaligule

43

โดยปกติคุณสามารถประเมินภูมิภาคที่เปลี่ยนแปลงได้อีกครั้ง ทำเครื่องหมายภูมิภาค ~ / .emacs M-x eval-region RETที่คุณได้เปลี่ยนแปลงและการใช้งานแล้ว วิธีนี้มักจะปลอดภัยกว่าการประเมินไฟล์ทั้งหมดอีกครั้งเนื่องจากง่ายต่อการเขียนไฟล์. emacs ที่ไม่ทำงานค่อนข้างถูกต้องหลังจากโหลดสองครั้ง


2
น่าสนใจ ฉันไม่ได้พิจารณาความคิดของไฟล์. emacs ที่ไม่ใช่ idempotent สิ่งที่ต้องระวังในขณะที่ฉันเริ่มต้นด้วย ELisp
Erik

2
ฉันเดาว่ามันยากที่จะหาไฟล์. emacs ที่เป็น idempotent อย่างน้อยก็ในแง่ที่ดีของการประหารชีวิตสองครั้งทำให้เกิดสภาวะเดียวกันกับการประหารชีวิตครั้งเดียว อย่างน้อยที่สุดมันเป็นเรื่องธรรมดามากที่จะผนวกเข้ากับรายการต่าง ๆ บ่อยครั้งในวิธีที่จะไม่ระงับรายการที่ซ้ำกันเมื่อดำเนินการครั้งที่สอง
Dale Hagglund

1
อีกความคิดหนึ่ง: โดยใช้วิธีที่ฉันแนะนำข้างต้นเป็นไปได้ว่ารัฐ emacs ที่คุณได้รับไม่ใช่สิ่งที่ emacs ของคุณทำ คือตั้งแต่คุณยังไม่ได้ดำเนินการไฟล์ทั้งหมด .emacs จากกระดานชนวนสะอาดคุณไม่จริงรู้ว่ามันไม่สิ่งที่คุณต้องการ
Dale Hagglund

1
ที่ถูกกล่าวว่ามันเป็นไปไม่ได้ที่จะเขียน. emacs ในแบบ idempotent? รัฐทั่วโลกเป็นคนขี้เหนียว
Ehtesh Choudhury

39

หากคุณเปิดไฟล์. emacs ไว้ในบัฟเฟอร์ที่ใช้งานอยู่ในปัจจุบัน:

Mx eval-buffer

12
สิ่งหนึ่งที่ควรระวังที่นี่คือการทำเช่นนี้อาจไม่ทำให้คุณอยู่ในสภาวะเดียวกับวิธีการรีสตาร์ท (ตัวอย่างที่มีให้: หากคุณมี "สลับ" ส่งผลกระทบต่อใน. emacs ของคุณ)
luapyad

28
M-x load-file
~/.emacs

1
ฉันได้เรียนรู้ว่าในการติดตั้ง Windows 7 ของฉันโฟลเดอร์. emacs.d อยู่ในโฟลเดอร์% appdata% แทนที่จะเป็นโฟลเดอร์หลักของผู้ใช้
Bassdrop Cumberwubwubwub


13

สารละลาย

M-: (load user-init-file)


บันทึก

  • คุณพิมพ์ในEval:พรอมต์ (รวมถึงวงเล็บ)
  • user-init-fileเป็นตัวแปรที่เก็บ ~/.emacsค่า (ชี้ไปที่พา ธ ของไฟล์การกำหนดค่า) โดยค่าเริ่มต้น
  • (load)มีขนาดสั้นลงเก่ากว่าและไม่ใช่แบบโต้ตอบของ(load-file); มันไม่ได้เป็นคำสั่ง emacs (ที่จะพิมพ์M-x) แต่ฟังก์ชั่นเพียงแค่ elisp

ข้อสรุป

M-: > M-x


M-:> Ctrl Alt x คืออะไร ตามตรรกะของคุณฉันคิดว่า M-: <CMx เมื่อมีการเปลี่ยนแปลงเพียงหนึ่งบรรทัดในไฟล์ init หรือไม่ อาจจะเป็นเพียง ==
Robert Houghton

12

คนอื่นตอบคำถามของคุณตามที่ระบุไว้ แต่ฉันพบว่าฉันมักจะต้องการดำเนินการตามบรรทัดที่ฉันเพิ่งเขียน สำหรับที่CtrlAltxในเสียงกระเพื่อมทำงานได้ดี


3
ดูได้eval-lastsexpที่C-x C-e
Derek Slager

ด้วยC-M-xคุณไม่จำเป็นต้องเป็น "ในตอนท้ายของเสียงกระเพื่อม" - คุณกำลังนึกถึงC-x C-eบางที สิ่งที่ดีเกี่ยวกับC-M-xคือคุณสามารถเรียกใช้ได้แม้ในขณะที่จุดอยู่ตรงกลางของการประกาศฟังก์ชั่น / ตัวแปร
โทมัส

ฉันอาจจะเคยชินกับการหยุดกระเพื่อมในเวลาที่ฉันใช้ Cx Ce เท่านั้น ขอบคุณสำหรับการจับ!
Bahbar

9

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

เมื่อคุณมีความสุขกับการเปลี่ยนแปลงในที่สุดจากนั้นดำเนินการต่อและใช้หนึ่งในคำตอบอื่น ๆ เพื่อโหลดซ้ำ ความชอบส่วนบุคคลของฉันคือการevalเพียงส่วนที่คุณได้เพิ่ม / เปลี่ยนแปลงและที่จะทำเพียงแค่เน้นภูมิภาคเพิ่ม / M-x eval-regionรหัสการเปลี่ยนแปลงและการโทร การทำเช่นนี้จะทำให้โค้ดที่ถูกประเมินน้อยที่สุดลดผลข้างเคียงที่ไม่ได้ตั้งใจให้น้อยที่สุดเนื่องจาก luapyad ชี้ให้เห็น


9

แป้นพิมพ์ลัด:

(defun reload-init-file ()
  (interactive)
  (load-file user-init-file))

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file

! สดใส นี่เป็นสิ่งที่ดีมาก!
PinkCollins


4

ฉันใช้ Ubuntu 15.04 อยู่ในขณะนี้ ฉันชอบกำหนดกุญแจสำหรับสิ่งนี้
[M-insert] แปลเป็น alt-insert บนคีย์บอร์ดของฉัน
วางสิ่งนี้ลงในไฟล์. emacs ของคุณ:

(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))

3

กำหนดไว้ในไฟล์ init ของคุณและโทรหาโดยMx reload-user-init-file

(defun reload-user-init-file()
  (interactive)
  (load-file user-init-file))

2

แม้ว่าM-x eval-bufferจะได้ผลคุณอาจพบปัญหากับการสลับและสิ่งอื่นที่คล้ายคลึงกัน วิธีที่ดีอาจจะมีการ "เครื่องหมาย" หรืออะไรที่ไฮไลท์ใหม่ใน .emacs ของคุณ (หรือแม้กระทั่งรอยขีดข่วนบัฟเฟอร์ถ้าของคุณเพียงแค่ messing รอบ) M-x eval-regionแล้ว หวังว่านี่จะช่วยได้


2

นี่คือวิธีที่รวดเร็วและง่ายดายในการทดสอบการกำหนดค่าของคุณ นอกจากนี้คุณยังสามารถใช้C-x C-eที่ส่วนท้ายของเสียงกระเพื่อมที่เฉพาะเจาะจงเพื่อดำเนินการฟังก์ชั่นบางอย่างเป็นรายบุคคล

Cx Ce รันคำสั่ง eval-last-sexp (พบในแผนที่โลก) ซึ่งเป็นฟังก์ชั่น Lisp ที่คอมไพล์แบบอินเตอร์แอคทีฟ

มันถูกผูกไว้กับ Cx Ce

(eval-last-sexp EVAL-LAST-SEXP-ARG- ภายใน)

ประเมิน sexp ก่อนชี้ ค่าการพิมพ์ในพื้นที่ echo แบบโต้ตอบพร้อมอาร์กิวเมนต์นำหน้าพิมพ์ผลลัพธ์ลงในบัฟเฟอร์ปัจจุบัน

โดยปกติแล้วฟังก์ชั่นนี้จะตัดทอนผลลัพธ์แบบยาวตามค่าของตัวแปร 'eval-expression-print-length' และ 'eval-expression-print-level' อย่างไรก็ตามด้วยคำนำหน้าเป็นศูนย์ แต่ไม่มีการตัดทอน อาร์กิวเมนต์คำนำหน้าดังกล่าวยังทำให้จำนวนเต็มถูกพิมพ์ในหลายรูปแบบเพิ่มเติม (ฐานแปดฐานสิบหกและอักขระ)

หาก 'eval-expression-debug-on-error' เป็น non-nil ซึ่งเป็นค่าเริ่มต้นคำสั่งนี้จะจัดเรียงข้อผิดพลาดทั้งหมดเพื่อเข้าสู่การดีบัก


2

ข้างคำสั่งเช่นMx eval-bufferหรือMx load-fileคุณสามารถรีสตาร์ท emacs ใหม่จากบรรทัดคำสั่ง:

emacs -q --load "init.el"

ตัวอย่างการใช้งานstackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/


คำถามถามว่าจะทำอย่างไรโดยไม่ต้องรีสตาร์ท Emacs การเปิดตัวสำเนาใหม่ในขณะที่ตอบคำถามทางเทคนิคดูเหมือนจะไม่สอดคล้องกับจิตวิญญาณของคำถาม 😄
chwarr

0

คุณสามารถตั้งค่าการผูกคีย์สำหรับ emacs เช่นนี้

;; reload emacs configuration
(defun reload-init-file ()
  (interactive)
  (load-file "~/.emacs"))

(global-set-key (kbd "C-c r") 'reload-init-file) 

หวังว่านี่จะช่วยได้!


-2

หากคุณมีการเปิดเชลล์ภายใน Emacs คุณสามารถทำได้:

. ~/.emacs

อาจบันทึกการกดปุ่มสองสามครั้ง

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