เรียกใช้คำสั่งเมื่อเปิดไฟล์ประเภทไฟล์เฉพาะ


14

ฉันพยายามรับ lisp script เพื่อเรียกใช้คำสั่งบางอย่างสำหรับฉันเมื่อฉันเปิดไฟล์ประเภทไฟล์เฉพาะ ฉันรู้ว่าฉันกำลังทำงานในไฟล์ init ที่ถูกต้องเพราะถ้าฉันลบธีมออก emacs ไม่มีธีมเมื่อฉันเริ่มต้นทำงาน

นี่คือสคริปต์ที่ฉันใช้ซึ่งใช้งานไม่ได้ (ไม่มีข้อผิดพลาดหรืออะไร):

(defun my-project-hook (filename)
  (when (string= (file-name-extension filename) "ts")
    ((typescript-mode)
     (tss-setup-current-buffer))
  ) 
)

(add-hook 'after-load-functions 'my-project-hook)

ในบริบทนี้ "load" หมายถึง "load as lisp code" ฉันคิดว่าคุณต้องการ find-file-hook แทน (โปรดทราบว่าสิ่งเหล่านี้ไม่ได้ถูกเรียกด้วยอาร์กิวเมนต์! ใช้ buffer-file-name แทน) คุณอาจต้องการใช้โหมดอัตโนมัติ - alist และกำหนดโหมดหลักของคุณเอง
YoungFrog

3
ที่จริงแล้วดูเหมือนว่าคุณต้องการเบ็ดโหมด
ด่าน

คุณยังไม่ได้รับปัญหาเนื่องจากฟังก์ชั่นของคุณไม่ทำงาน แต่เมื่อใดที่คุณรู้ว่าข้อมูลข้างต้นไม่ถูกต้อง เนื้อหาการwhenโทรของคุณมีรูปแบบไม่ถูกต้อง การเรียกฟังก์ชันทั้งสองไม่สามารถล้อมรอบด้วยวงเล็บเหมือนที่เป็น สังเกตความแตกต่างระหว่างรหัสของคุณกับ @ sds's
Jordon Biondo

คำตอบ:


16

ในคำศัพท์ของ Emacs นี่เป็นสองขั้นตอนที่แตกต่างกัน:

  • ไฟล์ที่เชื่อมโยงกับ.tsส่วนขยายที่มีโหมดที่สำคัญ typescript-mode
  • เรียกใช้ฟังก์ชันtss-setup-current-bufferเมื่อโหมด typescript เริ่มต้น

ในการเลือกโหมดที่สำคัญในการใช้auto-mode-alistชื่อไฟล์บางเพิ่มรายการให้กับตัวแปร วางบรรทัดต่อไปนี้ในไฟล์ init ของคุณ:

(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))

\.ts\'เป็นนิพจน์ทั่วไปที่ตรงกับชื่อไฟล์ที่มี.tsนามสกุล

เมื่อต้องการเรียกใช้ฟังก์ชั่นtss-setup-current-bufferเมื่อใดก็ตามที่โหมด typescript เริ่มต้น (ผมเข้าใจว่าคุณต้องการที่จะทำงานได้แม้สำหรับไฟล์โหมด typescript ที่ไม่ได้มี.tsส่วนขยาย) เพิ่มไปยัง typescript เริ่มต้นโหมดเบ็ด

(add-hook 'typescript-mode-hook 'tss-setup-current-buffer)

ทั้งนี้ขึ้นอยู่กับวิธีการติดตั้งtypescript.elและtss.elคุณอาจต้องประกาศว่าฟังก์ชั่นtypescript-modeและtss-setup-current-bufferจะต้องโหลดจากไฟล์เหล่านั้น วิธีนี้จะช่วยหลีกเลี่ยงการโหลดtypescript.elและtss.elทันทีที่ Emacs เริ่มทำงานพวกเขาจะถูกโหลดตามต้องการเมื่อคุณเปิด.tsไฟล์ครั้งแรกหรือเรียกใช้typescript-modeอย่างชัดเจน

(autoload 'typescript-mode "Major mode for typescript files" t)
(autoload 'tss-setup-current-buffer "Set up the current file for TSS" t)

9

สิ่งที่คุณกำลังมองหาคือfind-file-hook:

(add-hook 'find-file-hook 'my-project-hook)
(defun my-project-hook ()
  (when (string= (file-name-extension buffer-file-name) "ts")
    (typescript-mode)
    (tss-setup-current-buffer)))

4
ในขณะที่ใช้งานได้ควรชี้ให้เห็นว่านี่ไม่ใช่วิธีที่ถูกต้องในการเริ่มต้นโหมดหลักเมื่อค้นหาไฟล์หรือตั้งค่าการปรับแต่งสำหรับโหมดหลัก auto-mode-alistควรจะใช้เพื่อกำหนดเวลาที่จะเริ่มต้น typescript โหมดและควรจะใช้ในการทำงานtypescript-mode-hook tss-setup-current-buffer
Jordon Biondo

การใช้(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode))และ(add-hook 'typescript-mode-hook 'tss-setup-current-buffer)จะเป็นวิธีปกติในการทำ
Jordon Biondo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.