ความแตกต่างระหว่างการตั้งค่าปุ่มโหมดหลักด้วยการเปรียบเทียบกับการเพิ่มลงในแผนผังโหมด


13

สมมติว่าผมได้ดาวน์โหลดโหมดหลักที่เรียกว่าและจะมีรูปแบบแป้นวิเศษของตัวเองที่เรียกว่าmagical-mode magical-mode-mapโหมดนี้ยังมีตะขอmagical-mode-hookที่รันในแต่ละครั้งmagical-modeกลายเป็นโหมดหลักของบัฟเฟอร์ ตอนนี้ฉันต้องการแก้ไขไฟล์ init เพื่อเพิ่มการเชื่อมโยงคีย์แบบกำหนดเองเพื่อใช้ในโหมดนั้น

มันดูเหมือนว่ามี (อย่างน้อย) magical-modeสองวิธีในการตั้งค่าปุ่มลัดที่กำหนดเองสำหรับ สิ่งที่ฉันเห็นบ่อยที่สุดคือ:

(defun my-magical-keys ()
  (local-set-key (kbd "C-i") 'previous-line)
  (local-set-key (kbd "C-k") 'next-line)
  (local-set-key (kbd "C-j") 'backward-char)
  (local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)

แต่ก็เป็นไปได้ที่จะทำเช่นนี้:

(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)

วิธีที่สองดูเหมือนจะสะอาดกว่าสำหรับฉัน มีข้อได้เปรียบใด ๆ ในการทำเช่นนี้มากกว่าอีกทางหนึ่ง?


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

@tarsius การต่อสู้ที่ยากเย็นแสนเข็ญ ฉันได้ไปลงเส้นทางก่อนหน้านั้น แต่ตอนนี้ผมกลับไปที่ดี ol' และC-n C-pตัวอย่างนี้เป็นเพียงรหัสจำลอง ฉันต้องการที่จะเกิดขึ้นกับโหมดตัวอย่างง่าย ๆ บางอย่างและการผูกตัวอย่างอย่างแม่นยำเพื่อให้การเชื่อมโยงตัวเองจะไม่เบี่ยงเบนความสนใจจากวัตถุประสงค์ที่แท้จริงของคำถาม
nispio

คำตอบ:


15

วิธีที่สองเป็นวิธีที่ดีกว่าเพราะจะปรับเปลี่ยนรูปแบบของแผนที่หลักเพียงครั้งเดียว

หากคุณใช้ hook ของโหมดแล้วจะถูกเรียกทุกครั้งที่เปิดใช้งานโหมดในบัฟเฟอร์บางอย่าง การทำเช่นนั้นอีกครั้งโดยปกติแล้วจะไม่มีผลกระทบเนื่องจากคีย์จะผูกไว้กับสิ่งที่ผูกไว้แล้วอีกครั้ง ปุ่มกดโหมดหลักคือ "ภายใน" เป็นโหมดหลักไม่ใช่บัฟเฟอร์แต่ละตัวที่ใช้โหมดนั้นดังนั้นหากคุณเปลี่ยนการเชื่อมในหนึ่งในบัฟเฟอร์เหล่านี้โดยใช้local-set-keyนั่นจะส่งผลกระทบต่อบัฟเฟอร์ทั้งหมดด้วยโหมดหลักเดียวกัน

local-set-keyมีวัตถุประสงค์หลักเพื่อใช้เป็นคำสั่ง เมื่อคุณได้พิจารณาแล้วว่าคุณต้องการทำการเปลี่ยนแปลงแบบถาวรให้ใช้define-keyร่วมกับ keymap ของโหมดเป็นอาร์กิวเมนต์แรก

local-set-keyถ้าคุณใช้ตะขอที่จะปรับเปลี่ยนรูปแบบแป้นซ้ำแล้วซ้ำอีกครั้งแล้วที่อาจขัดแย้งกับวัตถุประสงค์การใช้งานของ สมมติว่าคุณใช้เพราะคุณต้องการทดลองแตกต่างจากที่M-x local-set-key RET C-i fancy-previous-line RET previous-lineถ้าตอนนี้คุณเปิดบัฟเฟอร์ใหม่ซึ่งใช้โหมดหลักเดียวกันแล้วเบ็ดจะวิ่งอีกครั้งและแทนที่คุณชั่วคราวมีผลผูกพันในบัฟเฟอร์ทั้งหมดlocal-set-keyโดยใช้โหมดที่สำคัญรวมทั้งกันชนในที่ที่คุณได้ใช้ก่อนหน้านี้


ฉันชอบคำตอบนี้ แต่ถ้าโหมดโหลดอัตโนมัติ?
เผยแพร่

2
คุณสามารถชะลอการโหลดรหัสใด ๆ (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...))จนกระทั่งหลังจากห้องสมุดบางส่วนได้รับการโหลด:
Tarsius

4

การใช้(define-key my-magical-mode-map …)เป็นวิธีปกติ

เมื่อคุณใช้ตะขอและlocal-set-keyปุ่มจะถูกเพิ่มทุกครั้งที่คุณเข้าสู่โหมด Magical ของฉันในบัฟเฟอร์บางอย่าง สิ่งนี้แปลกเนื่องจากlocal-set-keyมีผลกับบัฟเฟอร์ทั้งหมดที่อยู่ในโหมดเดียวกัน (โดยทั่วไปบัฟเฟอร์ทั้งหมดที่ใช้คีย์แมปเดียวกัน) ดังนั้นหากคุณทำการเปลี่ยนแปลงใด ๆ กับ keymap พวกเขาจะถูกแทนที่ทุกครั้งที่คุณเข้าสู่โหมด Magical ของฉันในบัฟเฟอร์

วิธีที่สองอาจสับสนหากคุณปรับแต่ง keymap ในที่ต่าง ๆ ตะขอจะถูกดำเนินการในลำดับย้อนกลับจากคำสั่งซื้อที่เพิ่มเข้ามาและจนกว่าจะมีการดำเนินการครั้งแรกคุณจะไม่เห็นร่องรอยของการปรับแต่งของคุณ


2

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

เพื่อให้แน่ใจว่าสิ่งที่คุณพูดว่าคุณเห็นบ่อยที่สุดสำหรับสิ่งนี้ไม่ใช่สิ่งที่ใช้โดยทั่วไปเพื่อกำหนด keymap ในโหมดหลัก มันเป็นไม่ได้สิ่งที่คุณพบในซอร์สโค้ด Emacs ตัวอย่างเช่น และไม่ใช่สิ่งที่แนะนำในคู่มือ Elisp (โหนดMajor Mode Conventions)

เพียงแค่ต้องการให้ชัดเจนเพื่อให้ชัดเจนสำหรับผู้อื่น: โดยทั่วไปคุณไม่ต้องการใช้โหมดฮุกเพื่อกำหนดแผนที่หลักของโหมด


สำหรับคำถามของคุณเกี่ยวกับการปรับแต่งรหัสผู้ใช้ -

ไม่local-set-keyว่าในกรณีใดคุณไม่ควรใช้โหมดฮุก เพียงใช้define-keyกับ keymap ของโหมดหลักเหมือนกับในตัวอย่างแรกของคุณ @tarsius ได้อธิบายสิ่งนี้อย่างดีแล้ว

นอกเหนือจากนั้นคำตอบคือ: มันสร้างความแตกต่างเล็ก ๆ น้อย ๆโดยทั่วไปไม่ว่าคุณจะผูกกุญแจ (ใช้define-keyกับแผนที่โหมด) เพียงครั้งเดียวและสำหรับทั้งหมดหรือคุณใช้เบ็ดเพื่อผูกพวกเขาทุกครั้งที่คุณเข้าสู่โหมด

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

นั่นเป็นความแตกต่างเพียงอย่างเดียวที่ฉันสามารถนึกได้ เพื่อให้คุณตัดสินใจได้ว่าเมื่อใดที่คุณพิจารณาถึงความแตกต่างนั้นจะเป็นข้อได้เปรียบของวิธีใดวิธีหนึ่ง FWIW ดูรหัสของตัวเองฉันไม่คิดว่าฉันจะผูกกุญแจบนฮุคโหมด


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

0

การตั้งชื่อของคุณสับสนเล็กน้อย (ฉันคิดว่าคุณควรลบmyในส่วนที่สองของคำถาม)

อย่างไรก็ตามสมมติว่าmy-magical-keysเป็นฟังก์ชั่นการปรับแต่งของผู้ใช้magical-modeฉันเห็นข้อดีอย่างหนึ่งที่เห็นได้ชัด มันง่ายที่จะลบ (โดยremove-hook) ขอเกี่ยวในครั้งเดียว

ข้อได้เปรียบที่สองคือความหมายของฟังก์ชัน ฉันหมายถึงพวกมันสามารถใช้ซ้ำได้ คุณสามารถขอพวกเขาไปที่โหมดอื่น ๆ

แก้ไข:

เนื่องจาก @tarsius ได้ชี้ให้เห็นว่าการเอาฮุกออกจะไม่สามารถเรียกคืนพฤติกรรมดั้งเดิมได้และการเปลี่ยนฟังก์ชั่นเข้าสู่โหมดรองอาจจะดีกว่า


my-magical-modeฉันกำลังปรับแต่งโหมดหลักสมมุติเรียกว่า อย่างไรก็ตามหากการใช้my-คำนำหน้าสับสนฉันสามารถแก้ไขคำถามได้อย่างแน่นอน
nispio

ใช่ว่าจะดีกว่าปกติ (อย่างน้อยที่สุดเท่าที่ฉันเห็นใน wild) my-จะถูกเพิ่มเข้ามาสำหรับฟังก์ชั่นผู้ใช้
kindahero

1
ตกลง ฉันเพิ่งใช้งานmy-เพื่อไม่ให้ใครคิดว่าฉันถามวิธีตั้งค่าโหมดจริงที่เรียกว่าmagical-mode(ถ้ามี)
nispio

1
ไม่การถอดเบ็ดจะไม่คืนค่าการเชื่อมโยงเก่า อย่างน้อยก็จนกว่า Emacs จะไม่ได้ถูกรีสตาร์ทจากนั้นฉันก็ไม่เห็นว่าจะต้องคอมเม้นท์แค่บรรทัดเดียวแทนที่จะเป็นสี่บรรทัดซึ่งเป็นการปรับปรุงครั้งใหญ่
Tarsius

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