คำถามติดแท็ก elisp

สำหรับคำถามเกี่ยวกับ Emacs Lisp เป็นภาษาเทียบกับภาษาอื่นโดยเฉพาะเมื่อเทียบกับภาษา Lisp อื่น ๆ นั่นคือสำหรับคำถาม * เกี่ยวกับภาษา * นั้น * อย่าใช้มัน * สำหรับคำถามเกี่ยวกับ * โดยใช้ * Emacs Lisp Emacs Lisp เป็นภาษาสคริปต์และการเขียนโปรแกรมที่ตัวแก้ไข Emacs สร้างขึ้น

4
ข้อดีของการตั้งค่าตัวแปรด้วย setq แทนที่จะเป็น custom.el?
ฉันเห็นคนจำนวนมาก (ผู้เขียนส่วนขยายและคนอื่น ๆ ) ให้ตัวอย่างการกำหนดค่าด้วยsetq: (setq foo 'bar) พารามิเตอร์เหล่านี้มักจะถูกกำหนดด้วยทำให้พวกเขาสามารถใช้ได้สำหรับการปรับแต่งผ่านdefcustomcustom.el ฉันมักจะใช้custom.elเพื่อตั้งค่าพวกเขา จะมีข้อได้เปรียบใด ๆ ในการใช้งานsetqแทนหรือว่าทั้งสองวิธีนั้นเทียบเท่ากันหรือไม่

6
ฉันสามารถใช้โหมดองค์กรเพื่อจัดโครงสร้าง. emacs หรือไฟล์กำหนดค่า. el อื่น ๆ ได้หรือไม่
ฉัน.emacsแฟ้มการกำหนดค่าที่ได้รับใหญ่และขนาดใหญ่และฉันต้องการที่จะได้รับภาพรวมที่ดีขึ้นและการก่อสร้างโดยการเพิ่มหัวข้อหัวข้อย่อยและความสามารถในการซ่อนหรือแสดงให้พวกเขาเหมือนที่ผมสามารถทำอะไรกับ org-modeEmacs ฉันสังเกตเห็นว่าฉันสามารถเปิดใช้งานorg-modeได้ใน.emacsบัฟเฟอร์และเป็นไปได้ที่จะเพิ่มส่วนหัวและยุบพวกเขา แต่ Emacs / Aquamacs จะยังสามารถโหลดรหัส Elisp จากเอกสารได้หรือไม่หากฉันเพิ่มorg-modeส่วนหัว (เช่นบรรทัดที่ขึ้นต้นด้วยเครื่องหมายดอกจันหนึ่งตัวหรือมากกว่า)? ฉันมีทุกอย่างในไฟล์เดียวหรือฉันต้องมี.*orgไฟล์เดียวแล้วส่งออกรหัส Elisp ไปยังไฟล์อื่นเป็นประจำหรือไม่

3
จะบันทึกมาโครคีย์บอร์ดเป็นฟังก์ชั่น Lisp ได้อย่างไร?
บ่อยมากฉันจะต้องดำเนินการตามขั้นตอนที่ต้องใช้หลายจังหวะกุญแจ สำหรับเซสชั่นเดียวกันขั้นตอนเหล่านั้นสามารถบันทึกในแมโครแป้นพิมพ์ ตัวอย่างคือการบันทึกการดำเนินการค้นหา / แทนที่ที่ดำเนินการบ่อยเป็นแมโครแป้นพิมพ์ แต่มาโครนั้นจะหายไปเมื่อฉันออกจาก emacs ฉันจะบันทึกแมโครคีย์บอร์ดที่ใช้บ่อยเป็นฟังก์ชั่น Lisp ได้อย่างไร? เพื่อความเรียบง่ายฉันต้องการบันทึกการกระทำของการแทนที่ "abc" ด้วย "def" เป็นฟังก์ชันเพื่อให้ฉันสามารถนำมันกลับมาใช้ใหม่ในเซสชัน emacs ได้

2
ทำไม elisp ไม่มี namespaces?
ถาม:ทำไมเอลลิสจึงไม่มีเนมสเปซและเราจะหามาได้อย่างไร Elisp ไม่มีเนมสเปซอื่นนอกจากโกลบอลซึ่งนำไปสู่การเขียนโค้ดของการเติมคำนำหน้าฟังก์ชันโกลบอลตัวแปรและค่าคงที่ทั้งหมดด้วยคำนำหน้าที่ไม่ซ้ำใคร นอกเหนือจากปัจจัยความน่ารำคาญใจแล้วมันยังทำให้ฉันกลายเป็นประเด็นที่เดือดดาลจาก 1) จำนวนไลบรารีและแพ็คเกจที่ยิ่งใหญ่และ 2) การมีอยู่ของฟังก์ชันและตัวแปรดั้งเดิมที่ไม่เคารพต่อคำนำหน้าหรือ มีนิสัยแปลก ๆ พอสมควรว่าไม่มีตัวเลือกคำนำหน้าดี ๆ ที่พวกเขาสามารถใช้ได้ นอกจากนี้ยังหมายถึงความพยายามเป็นระยะ ๆ ในการหาเหตุผลเข้าข้างตนเองรหัสเก่า (เช่นเดียวกับการเปลี่ยนจากclเป็นcl-lib) เป็นจำนวนงานที่ไม่สำคัญ (แม้ว่าฉันจะดีใจในการทำความสะอาด แต่ฉันก็ยังขาดน้ำตาทุกครั้งที่พิมพ์อะไรเช่นนี้cl-find) ฉันออกไปเดินเล่นรอบ ๆ เพื่อดูว่าฉันจะรู้ได้ไหมว่าทำไมเอลลิสยังคงไม่มีเนมสเปซหลังจากใช้งานไปหลายสิบปี แต่รู้สึกประหลาดใจเล็กน้อยที่การเก็บเกี่ยวเล็กน้อย หน้าวิกิพีเดียใน namespacesค่อนข้างสั้น Nic Ferrierมีการแก้ไขปัญหาอีกต่อไปเล็กน้อยและมีหัวข้อล่าสุดเกี่ยวกับemacs-develเกี่ยวกับเรื่องนี้เช่นกัน มีเธรดสแต็คโอเวอร์โฟลว์เก่าจากปี 2010 ที่กล่าวถึงความเป็นไปได้ในการใช้มาโครในการติดตั้งเนมสเปซ ตัวอย่างของวิธีการแมโครอื่นสามารถพบได้ที่นี่ มีการใช้งานอย่างน้อยสอง ( ที่นี่และที่นี่พร้อมคำอธิบายของหลังที่นี่) ออกไปที่นั่น แต่พวกเขาไม่ได้เห็นกิจกรรมมากนักเป็นเวลาสองปีและฉันไม่ได้ทำงานในห้องสมุดใด ๆ ที่ใช้พวกเขา ฉันคิดว่าถ้าการเพิ่มเนมสเปซเป็นเรื่องง่าย ดังนั้น: อะไรคืออุปสรรคทางเทคนิคในการเพิ่มเนมสเปซลงใน elisp การเพิ่มเนมสเปซทำลายรหัสที่มีอยู่จำนวนมากหรือไม่ ฟังก์ชั่นนี้เป็นบางสิ่งที่จำเป็นต้องเป็นออร์แกนิกเป็นเอลิค (เปลี่ยนล่ามเอง) หรือมันสามารถสร้างขึ้นมาจากด้านบนผ่านมาโครได้หรือไม่?
40 elisp 

9
ฉันจะเริ่มเรียนรู้ Emacs Lisp ได้อย่างไร
พื้นหลัง: ฉันส่วนใหญ่เป็นผู้ใช้ vi และกำลังแปลงเป็น Emacs วางพื้นฐานและตอนนี้ใช้สำหรับการเขียนโค้ดใน C และ Python บางอันพร้อมกับวางแผนที่จะทำการแปลง R ด้วย ฉันเขียน LISP (Common) LISP เป็นเวลาหลายปีกว่าสองทศวรรษที่แล้วตอนที่ฉันเรียนอยู่ระดับปกรณ์ แต่ตอนนี้ฉันหมดแรงลงอย่างมาก (สามารถเขียนสวัสดีโลกได้ คำถาม: สิ่งที่คุณจะแนะนำสำหรับคนที่อยู่ในตำแหน่งของฉันเพื่อเรียนรู้เกี่ยวกับสภาพแวดล้อม Emacs LISP และเริ่มแฮ็ค Emacs มีหนังสือบล็อกแหล่งข้อมูลที่ฉันควรอ่านแบบฝึกหัดที่ฉันควรทำหรือไม่

5
จะเปลี่ยนองค์ประกอบของอลิสได้อย่างไร?
ฉันมีสิ่งนี้เป็นค่าเริ่มต้นในauto-mode-alist: ("\\.js\\'" . javascript-mode) (ถึงกับemacs -Q) ฉันต้องการที่จะทดแทนสำหรับjs2-mode javascript-modeแน่นอนฉันสามารถใช้assq-delete-allแล้วadd-to-listอีกครั้ง แต่ฉันสงสัยว่าไม่มีวิธีที่ดีกว่า แก้ไข: ฉันไม่ต้องการใช้ปรับแต่งอย่างชัดเจนฉันชอบการสร้างงานinit.elเอง

3
ทำไม `ให้ 'เร็วขึ้นด้วยขอบเขตศัพท์?
ขณะอ่านผ่านซอร์สโค้ดของdolistมาโครฉันพบความคิดเห็นต่อไปนี้ ;; นี้ไม่ได้มีการทดสอบความน่าเชื่อถือ แต่มันก็ไม่ได้เรื่องเพราะทั้งสองความหมายเป็นที่ยอมรับสรรพสินค้าหนึ่งที่เร็วขึ้นเล็กน้อยกับการกำหนดขอบเขตแบบไดนามิกและอื่น ๆ ที่เป็นเร็วขึ้นเล็กน้อย (และมีความหมายทำความสะอาด) ที่มีการกำหนดขอบเขตของคำศัพท์ ซึ่งอ้างถึงตัวอย่างนี้ (ซึ่งฉันได้ทำให้เข้าใจง่ายขึ้น) (if lexical-binding (let ((temp list)) (while temp (let ((it (car temp))) ;; Body goes here (setq temp (cdr temp))))) (let ((temp list) it) (while temp (setq it (car temp)) ;; Body goes here (setq temp (cdr temp))))) มันทำให้ฉันประหลาดใจเมื่อเห็นletรูปแบบที่ใช้ในวง ฉันเคยคิดว่ามันช้าเมื่อเทียบกับการใช้ซ้ำ ๆsetqกับตัวแปรภายนอกเดียวกัน …

3
จะทราบได้อย่างไรว่าจะใช้อัญประกาศเดี่ยวข้างหน้าชื่อตัวแปรเมื่อใดหรือไม่
ฉันมีด้านล่าง: (setq some-variable "less") ฉันกำลังสับสนว่าทำไมผมต้องใช้คำพูดเดียวกับแต่ไม่ได้มีboundpbound-and-true-p ตัวอย่างที่ 1: (when (boundp 'some-variable) (message "some-variable is %s" some-variable)) ผล: "บางตัวแปรน้อย" ตัวอย่าง 2a: (when (bound-and-true-p some-variable) ;; Note that using single-quote causes error (message "some-variable is %s" some-variable)) ผล: "บางตัวแปรน้อย" ตัวอย่าง 2b: (when (bound-and-true-p 'some-variable) ;; Note that using single-quote causes error (message "some-variable …
31 elisp  quote 

4
เมื่อใดที่จะอ้างคำแลมบ์ดาที่คมชัด?
ถาม:เมื่อใดถ้าเคยจะมีประโยชน์กับการเสนอราคาที่คมชัดlambdaและถ้าเป็นไปไม่ได้เราจะไม่เสนอราคาที่คมชัดเมื่อlambdaใด คนใช้lambdas ในสามวิธี: ธรรมดา: (lambda (x) x) ที่ยกมา: '(lambda (x) x) คมชัดที่ยกมา: #'(lambda (x) x) เธรด SO นี้กล่าวถึงสามประเภทเธรด SO นี้อธิบายถึงสาเหตุที่ไม่อ้างถึง (NB: not -quote quote ) lambdas และเธรด SOนี้ยังกล่าวถึงความแตกต่างระหว่างการอ้างถึงและการอ้างอิงที่คมชัด ตอนนี้โหนดแบบแมนนวลในฟังก์ชั่นที่ไม่ระบุชื่อและ docstring เพื่อlambdaทราบว่าlambdaเป็นข้อความที่อ้างถึง: การเรียกแบบฟอร์ม(lambda ARGS DOCSTRING INTERACTIVE BODY)เป็นการอ้างตนเอง ผลของการประเมินแลมบ์ดาแสดงออกคือการแสดงออกของตัวเอง แลมบ์ดานิพจน์นั้นอาจถูกมองว่าเป็นฟังก์ชัน ... ดังนั้นจึงปรากฏว่า(lambda (x) x)และ#'(lambda (x) x)เทียบเท่า แต่'(lambda (x) x)ไม่ใช่ (ที่สำคัญที่สุดคือเมื่อรวบรวมไบต์) ดูเหมือนว่าจะไม่ค่อยต้องการอ้างถึงlambdaแต่ก็ไม่ชัดเจนสำหรับฉันเมื่อใดก็ตามที่เราควรหรือไม่ควรจะพูดคมชัด: การอ้างความคมชัดเป็นlambdaเพียงตัวเลือกโวหารหรือมีสถานการณ์ที่การอ้างอิงที่คมชัดนั้นมีประโยชน์จริงหรือไม่? …
30 elisp  functions 

2
จะประเมินตัวแปรก่อนเพิ่มลงในรายการได้อย่างไร?
เห็นได้ชัดว่าด้านล่างใช้งานไม่ได้และด้วยเหตุนี้คำถามนี้ ฉันจะแก้ไขโค้ดด้านล่างเพื่อให้ค่าsomelistกลายเป็น'(("abc" . 123))อย่างไร (setq x "abc") (setq y 123) (setq somelist nil) (add-to-list 'somelist '(x . y))

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

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

2
exec-path และ $ PATH
ฉันได้เห็นตัวอย่างออนไลน์ที่ผู้คนเพิ่มเส้นทางไปยังเส้นทางเริ่มต้นใน Emacs ด้วย: (add-to-list 'exec-path "/usr/local/bin/") ฉันใหม่สำหรับ Elisp และฉันคิดว่าฉันเข้าใจว่าข้อความข้างต้นทำอะไร แต่ฉันมีคำถามสองสามข้อ: ในสิ่งที่สั่งซื้อไม่ค้นหา Emacs ผ่านเส้นทางการดำเนินการหรือไม่ ตัวอย่างเช่นพิจารณาถึงค่าของ$PATH(env. variable) เลย (และถ้าเป็นเช่นนั้นก่อนหรือหลังexec-path?) ฉันจะย่อหน้าเส้นทางดังกล่าวหลาย ฉันสามารถต่อพวกเขาต่อกันได้ไหม? เช่น (add-to-list 'exec-path "PATH1", "PATH2") หรือฉันควรทำ: (add-to-list 'exec-path "PATH1:PATH2:PATH3") ฉันยังพบแพคเกจที่น่าสนใจนี้บน GitHub: exec เส้นทางจากเปลือก ทำไมจึงจำเป็นต้องมีแพ็คเกจสำหรับ? แรงจูงใจ เคยพบว่าคำสั่งทำงานในเชลล์ของคุณ แต่ไม่ใช่ใน Emacs? สิ่งนี้เกิดขึ้นมากมายใน OS X ซึ่งอินสแตนซ์ Emacs เริ่มต้นจาก GUI สืบทอดชุดตัวแปรสภาพแวดล้อมเริ่มต้น ไลบรารีนี้ใช้งานได้เพื่อแก้ไขปัญหานี้โดยการคัดลอกตัวแปรสภาพแวดล้อมที่สำคัญจากเชลล์ของผู้ใช้: มันทำงานโดยขอให้เชลล์ของคุณพิมพ์ตัวแปรที่สนใจแล้วคัดลอกลงในสภาพแวดล้อมของ Emacs
28 elisp  path 

2
ค่าเริ่มต้นของพารามิเตอร์ทางเลือก
Emacs Lisp ไม่ได้รับการสนับสนุนด้านการสร้างประโยคสำหรับพารามิเตอร์ที่เป็นตัวเลือก อะไรคือสำนวนที่แนะนำสำหรับการจัดหาพารามิเตอร์เหล่านี้? เพื่อชี้แจงประเด็นของฉันนี่เป็นวิธีหนึ่งที่ชัดเจนเกินไปในการทำเช่นนั้น (defun command (a &optional supplied-b) (let ((b (or supplied-b default-b))) (command-body a b))) สไตล์ที่แนะนำคืออะไร?
26 elisp 

3
ความแตกต่างระหว่างการพุชและการเพิ่มในรายการคืออะไร
ฉันพบว่าแพคเกจต่าง ๆ ในคำแนะนำการติดตั้งใช้ push หรือ add-to-list (ตัวอย่างเช่นการเพิ่มไดเรกทอรีไปยัง load-path) และฉันก็สงสัยว่าอะไรคือความแตกต่างและกรณีการใช้งานของแต่ละคนจะเป็นอย่างไร
26 elisp 

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