Emacs เป็น daemon บน OS X พร้อมระบบหน้าต่าง


13

ฉันใช้ gnu emacs 23.3.1 cocoa build บน OS X 10.6
ฉันเพิ่มสิ่งต่อไปนี้ใน ~ / Library / LaunchAgents / gnu.emacs.daemon.plist เพื่อที่จะเริ่ม daemon และรีสตาร์ท emacs โดยอัตโนมัติถ้าฉันฆ่ามันโดยไม่ตั้งใจ

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
 <plist version="1.0">
  <dict> 
    <key>Label</key>
    <string>gnu.emacs.daemon</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Applications/Emacs.app/Contents/MacOS/Emacs</string>
      <string>--daemon</string>
    </array>
   <key>RunAtLoad</key>
   <true/>
   <key>KeepAlive</key>
   <true/>
   <key>ServiceDescription</key>
   <string>Gnu Emacs Daemon</string>
  </dict>
</plist>

sorta นี้ใช้งานได้ แต่ฉันสังเกตเห็นว่าชุดรูปแบบสีของฉันทำงานไม่ถูกต้อง จากนั้นฉันจำได้ว่าฉันได้เพิ่มสิ่งต่อไปนี้ในไฟล์ init ของฉัน:

(when window-system 
  (require 'alpha)
  (require 'color-theme-ir-black)
  (modify-frame-parameters (selected-frame) '((alpha . 85)))
  (color-theme-ir-black))

เมื่อเริ่มเป็นหน้าต่างระบบภูตเป็นเท็จอย่างเห็นได้ชัดและที่เหมาะสม แต่เหตุผลที่ฉันเพิ่มนี้เป็นเพราะบางครั้งฉันต้องการเริ่มต้น emacs ปกติสร้างใน terminal จาก ssh ฯลฯ และรูปแบบสีนี้ไม่สามารถอ่านได้อย่างสมบูรณ์ใน iTerm ดังนั้น (เมื่อระบบหน้าต่าง ... ) มีวิธีบังคับให้ emacs เริ่มโหมดหน้าต่างเมื่อเริ่มต้นด้วย --daemon หรือไม่?

ปัญหาอื่นที่ฉันสังเกตเห็นคือเมื่อฉันเรียกใช้กด sw (ลบเฟรม) ในโหมด dameon ฉันไม่ได้รับข้อผิดพลาดในการพยายามลบเฟรมที่มองเห็นได้ แต่เพียงผู้เดียวหรือเป็นไอคอนและ emacs ยังคงทำงานในพื้นหลัง ฉันชอบสิ่งนี้เป็นส่วนใหญ่ แต่ฉันสังเกตเห็นว่าเมื่อเฟรมสุดท้ายถูกฆ่าฉันจะไม่สามารถเปิด emacs จาก doc อีกต่อไปและแม้ว่า emacs จะเปิดใช้งานและเมนูจะปรากฏขึ้นพวกเขาไม่ทำงานและฉันไม่สามารถสร้างเฟรมใหม่ได้ ยกเว้นโดยใช้ emacsclient จาก commandline ใครมีปัญหานี้และหรือคำแนะนำในการแก้ปัญหา? บางทีฉันสามารถผูก sw เพื่อตรวจสอบว่าเฟรมสุดท้ายและ iconify-frame แทน แต่ไม่แน่ใจว่าทำไมมันถึงคิดว่าไม่ใช่หน้าต่างสุดท้ายและอนุญาตให้ฉันฆ่ามันในตอนแรก

UPDATE:

ฉันพบความคิดเห็นในบล็อกต่อไปนี้โดย Steve Purcell ด้วยการแก้ไขปัญหาที่คล้ายกันมาก: http://emacs-fu.blogspot.com/2009/03/color-theming.html

ความลับที่ดูเหมือนคือการใช้ 'after-make-frame-function hook เพื่อตั้งค่าเฟรมที่สร้างขึ้นใหม่และ (setq color-theme-is-global-nil) เพื่อให้แต่ละเฟรมสามารถมีธีมสีของตัวเอง ดังนั้นส่วนที่เกี่ยวข้องของ init ของฉันตอนนี้จะเป็นดังนี้:

(defvar after-make-console-frame-hooks '()
"Hooks to run after creating a new TTY frame")
(defvar after-make-window-system-frame-hooks '()
"Hooks to run after creating a new window-system frame")

(defun run-after-make-frame-hooks (frame)
"Selectively run either `after-make-console-frame-hooks' or
`after-make-window-system-frame-hooks'"
  (select-frame frame)
  (run-hooks (if window-system
               'after-make-window-system-frame-hooks
               'after-make-console-frame-hooks)))

(add-hook 'after-make-frame-functions 'run-after-make-frame-hooks)
(add-hook 'after-init-hook (lambda ()
  (run-after-make-frame-hooks (selected-frame))))


(setq color-theme-is-global nil)

(add-hook 'after-make-window-system-frame-hooks
          '(lambda ()
             (require 'alpha)
             (require 'color-theme-ir-black)
             (modify-frame-parameters (selected-frame) '((alpha . 85)))
             (color-theme-ir-black)
             (global-set-key (kbd "s-w") 'delete-frame)))

อย่างไรก็ตามฉันยังคงมีปัญหาที่การลบเฟรมปิดเฟรมสุดท้ายเมื่อ emacs เริ่มเป็น daemon และไม่อนุญาตให้ฉันสร้างเฟรมใหม่โดยใช้ emacsclient

UPDATE:

ถ้าฉันeval (frame-list)เห็นว่ามี 2 เฟรมอยู่ในรายการถึงแม้ว่าจะมีเพียงเฟรมเดียวที่มองเห็นได้ ฉันสังเกตว่าสิ่งนี้จะไม่เกิดขึ้นหากฉันเปิด Emacs ด้วยการเปิด/Applications/Emacs.appแทนที่จะเป็น emacsclient ปกติฉันจะเริ่ม emacs จาก commandline ด้วยนามแฝงe='emacsclient -c -n 'ซึ่งเป็นสิ่งที่สร้างเฟรมที่สอง ฉันดูเหมือนจะแนบไปกับเฟรมอื่นโดยเริ่มต้น emacs ด้วยคำสั่ง open ถ้าฉันลอง emacsclient -n somefile โดยที่-cฉันไม่ได้รับอะไรเลยและถ้าฉันรันemacsclient -n -e '(frame-list)'ฉันจะเห็นว่ามีเฟรมที่มองไม่เห็นจนกว่าฉัน-cจะใช้เพื่อสร้างเฟรมใหม่หรือเปิด emacs จากโฟลเดอร์แอปพลิเคชัน


นี่ไม่ใช่คำถามของ Emacs
เซเว่น

คำตอบ:


1

การรันโปรเซสหรือแอ็พพลิเคชันเป็น launchd daemon ให้สภาพแวดล้อมที่แตกต่างจากการรันตามปกติหรือบนบรรทัดรับคำสั่ง ฉันสงสัยว่ามันอาจจะทำงานได้ไม่ดีกว่าถ้าใช้ shell script แทนไอเท็มล็อกอิน

ตัวอย่างเช่น:

#!/bin/bash
while true
do
  open -W /Applications/Emacs.app
done

สคริปต์นี้จะต้องถูกบันทึกลงในไฟล์ที่มี.commandนามสกุลและการอนุญาต 755 ( chmod 0755 myemacsscript.command) จากนั้นเพิ่มในการตั้งค่าระบบ: ล็อกอิน: บานหน้าต่างรายการเข้าสู่ระบบ

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

ฉันไม่รู้ว่าจะแก้ไขปัญหาเฉพาะกับ Emacs.app ได้หรือไม่ แต่อย่างน้อยมันก็อาจมอบสภาพแวดล้อมที่ใกล้เคียงกับสิ่งที่ Emacs.app คาดไว้

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