เบ็ดคืออะไร


8

เพื่อชี้แจง ... ตัวอย่างเช่นในเอกสารนี้:

เบ็ดเป็นตัวแปรเสียงกระเพื่อมซึ่งถือรายการของฟังก์ชั่นที่จะเรียกในบางโอกาสที่กำหนดไว้ (นี่เรียกว่าการเรียกใช้ hook) ฟังก์ชั่นแต่ละอย่างในรายการเรียกว่าฟังก์ชั่น hook ของ hook ตัวอย่างเช่น hook kill-emacs-hookรันก่อนออกจาก Emacs ...

ฉันคิดว่ามันกำลังพูดว่ามีตัวแปร (สัญลักษณ์) ชื่อkill-emacs-hookที่แสดงถึงรายการชุดของ "ฟังก์ชั่นเบ็ด" ที่จะทำงานเมื่อkill-emacs-hookมีการประเมินผลดังนั้นการปฏิบัติหน้าที่เหล่านั้น แก้ไข? แล้วก็

(add-hook 'text-mode-hook 'auto-fill-mode)

กำลังเพิ่มauto-fill-modeในรายการที่ระบุโดยtext-mode-hookนอกเหนือจากสิ่งที่มีอยู่แล้ว ดี. ตอนนี้

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

text-mode-hookที่ดูเหมือนว่าเรามีทั้งการสร้างหรือการเปลี่ยนแปลง defcustomฉันสับสนในขณะนี้เป็นลักษณะของตะขอและความสัมพันธ์ของพวกเขาด้วย ทางเลือกเชิงตรรกะของฉันคือว่ารหัสนี้คือการสร้างตัวแปรtext-mode-hookซึ่งเป็นของ "ประเภท" (ไม่ทราบว่าสิ่งที่มีความหมายตามประเภทใน hookElisp) อันนี้จริง ๆ แล้วควรจะเป็นการเริ่มต้นของ hook text-mode-hookหรือไม่ ถ้าเป็นเช่นนั้นจะเกิดอะไรขึ้นกับ "ตัวเลือก" นั่นคือฟังก์ชั่น hook ที่ควรจะเป็นหรืออย่างอื่น?


1
จากลิงค์ของคุณ: « The: คีย์เวิร์ด options ระบุรายการค่าที่แนะนำสำหรับตัวแปร โดยปกติแล้ว: ตัวเลือกจะใช้กับตะขอ รายการนี้เป็นเพียงข้อเสนอแนะ มันไม่ได้ จำกัด เฉพาะ; บุคคลที่ตั้งค่าตัวแปรอาจตั้งค่าเป็นค่าอื่น รายการที่แสดงต่อไปนี้: คำหลักตัวเลือกมีไว้เพื่อเสนอตัวเลือกที่สะดวกสบายให้กับผู้ใช้»
Sidhekin

คำตอบ:


6

ความเข้าใจของคุณเกี่ยวกับความคิดของ Emacs Lisp นั้นถูกต้องอย่างแน่นอน แท้จริงแล้ว hooks“ ปกติ” เป็นเพียงรายการของฟังก์ชั่น (ทุกฟังก์ชั่นไม่รับการโต้แย้งมิฉะนั้นจะไม่เรียกว่า“ hook” หรือ“ hook ปกติ” ใน Emacs Lisp)

-hookที่สุดของตัวแปรเหล่านี้มีชื่อลงท้ายด้วย run-hooksพวกเขาเป็นตะขอปกติที่ดำเนินการโดยวิธีการของ ค่าของ hook ดังกล่าวคือรายการของฟังก์ชัน ฟังก์ชั่นถูกเรียกโดยไม่มีข้อโต้แย้งและค่าของมันจะถูกละเว้นอย่างสมบูรณ์ add-hookวิธีที่แนะนำให้ใส่ฟังก์ชั่นใหม่บนเช่นเบ็ดคือการโทร

ตัวแปรที่ชื่อลงท้ายด้วย-functionshooks ผิดปกติ (บางรหัสเก่าอาจใช้-hooksคำต่อท้ายที่เลิกใช้แล้ว); ค่าของมันคือรายการของฟังก์ชั่น แต่ฟังก์ชั่นเหล่านี้เรียกว่าในลักษณะพิเศษ (พวกเขาจะผ่านการขัดแย้งหรือใช้ค่าตอบแทนของพวกเขา) ตัวแปรที่ชื่อลงท้ายด้วย-functionฟังก์ชั่นเดียวเป็นค่าของพวกเขา

อินเตอร์เฟซการปรับแต่งเป็นสิ่งที่แตกต่าง ความแตกต่างระหว่าง defvarและdefcustomคือสิ่งหลังช่วยให้ผู้ใช้สามารถแก้ไขตัวแปรผ่านอินเตอร์เฟซ "ปรับแต่ง" อินเตอร์เฟซนี้สามารถอำนวยความสะดวกในการแก้ไขของบางประเภทของข้อมูลดังนั้นสำหรับตัวอย่างเช่นถ้าคุณกำลังจะบอกว่า:typeของ text-mode-hookเป็นhookแล้วการปรับแต่งอินเตอร์เฟซที่ทำให้แน่ใจว่า text-mode-hookอยู่เสมอรายชื่อของฟังก์ชั่น นอกจากนี้คุณสามารถระบุตัวเลือกที่แนะนำพร้อม:optionsอาร์กิวเมนต์

ดังนั้นความเข้าใจของคุณนั้นถูกต้องและdefcustomตัวเลือกต่าง ๆ เป็นเพียงวิธีสอน Emacs ดังนั้นจึงสามารถช่วยเหลือผู้ใช้ได้ดีขึ้นเมื่อเขา / เธอใช้อินเตอร์เฟส "ปรับแต่ง"


แต่ตัวอย่างของ a defcustomนี้ไม่ยอดเยี่ยมเพราะtext-mode-hookมีอยู่แล้ว มันรวมอยู่แล้ว ขวา? ตอนนี้ถ้าฉันเขียนโหมดของตัวเองแล้วต้องการปรับแต่งฉันจะทำ ความสับสนของฉันคือตัวอย่างนี้กำลังสร้างขึ้นจริงๆtext-mode-hookไม่ใช่การเปลี่ยนแปลง นั่นคือความเข้าใจที่ถูกต้องหรือไม่ และถ้าเป็นจริงสร้างใหม่text-mode-hookที่:optionsจะนำเสนอทั้งสองทำหน้าที่เป็นตัวเลือกที่จะทำadd-hookในรายการใช่มั้ย?
147 น.

@ 147pm ตัวอย่างนี้จะแสดงให้คุณเห็นว่าบางส่วนของโค้ดที่มีอยู่ของ Emacs กำหนดตัวแปรที่ปรับแต่งได้ซึ่งแสดงถึงตะขอ สรุปdefcustomกำหนดตัวแปรใหม่ ในตัวอย่างนี้โดยเฉพาะอย่างยิ่งถูกสร้างขึ้นและค่าเริ่มต้นของมันคือtext-mode-hook nilอินเตอร์เฟซที่ปรับแต่งยังบอกว่าค่าแนะนำให้มีในรายการนี้และturn-on-auto-fill flyspell-modeอย่างไรก็ตามคุณสามารถตั้งค่าtext-mode-hookเป็นสิ่งที่คุณชอบโดยทางโปรแกรมเป็นตัวแปรปกติ คุณสามารถใช้add-hookกับฟังก์ชั่นอื่น ๆ ได้เช่นกัน
Mark Karpov

@ 147 กล่าวอีกนัยหนึ่งอาร์กิวเมนต์ของคำหลักทั้งหมดเป็นเพียงคำแนะนำสำหรับระบบการปรับแต่งพวกเขาไม่ได้สร้างความแตกต่างใด ๆ (defvar text-mode-hook nil)ไม่มีคำแนะนำที่รหัสจำนวน
Mark Karpov

แต่นี่เป็นdefcustomวิธีการสร้างเบ็ดในตอนแรกหรือไม่ ว่ามันเป็นอย่างไร ในคำอื่น ๆ ตัวอย่างนี้นำมาจากส่วนลึกในบาดาลของ Emacs รหัสบางแห่ง
147 น.

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