Emacs như daemon trên OS X với hệ thống cửa sổ


13

Tôi đang chạy gnu emacs 23.3.1 bản dựng ca cao trên OS X 10.6.
Tôi đã thêm phần sau vào ~ / Library / LaunchAgents / gnu.emacs.daemon.plist để nó sẽ khởi động một daemon và tự động khởi động lại emacs nếu tôi vô tình giết nó.

<?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>

Loại này hoạt động nhưng tôi nhận thấy rằng chủ đề màu sắc của tôi không hoạt động đúng. Sau đó, tôi nhớ rằng tôi đã thêm sau đây vào tập tin init của tôi:

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

Khi bắt đầu như một hệ thống cửa sổ daemon rõ ràng là sai và điều đó có ý nghĩa, tuy nhiên lý do tôi thêm vào là vì tôi thỉnh thoảng muốn bắt đầu xây dựng emacs bình thường trong một thiết bị đầu cuối từ ssh vv và sơ đồ màu này hoàn toàn không thể đọc được trong iTerm, do đó (khi hệ thống cửa sổ ...). Có cách nào để buộc emacs bắt đầu chế độ cửa sổ khi bắt đầu với --daemon không?

Một vấn đề khác tôi nhận thấy là khi tôi chạy nhấn sw (xóa khung hình) ở chế độ dameon, tôi không gặp lỗi khi xóa khung hình có thể nhìn thấy hoặc được biểu tượng hóa và emacs tiếp tục chạy trong nền. Tôi thích điều này trong hầu hết các phần, tuy nhiên tôi đã nhận thấy rằng một khi khung hình cuối cùng bị giết, tôi không thể mở lại các emacs từ tài liệu và mặc dù các emacs sẽ kích hoạt và các menu được hiển thị chúng không hoạt động và tôi không thể tạo một khung hình mới ngoại trừ bằng cách sử dụng emacsclient từ dòng lệnh. Bất cứ ai khác có vấn đề này và hoặc khuyến nghị về cách giải quyết? có lẽ tôi có thể liên kết sw để phát hiện nếu khung hình cuối cùng và biểu tượng hóa khung hình thay thế, nhưng không chắc tại sao nó nghĩ rằng nó không phải là cửa sổ cuối cùng và cho phép tôi giết nó ngay từ đầu.

CẬP NHẬT:

Tôi đã tìm thấy một nhận xét trên blog sau đây của Steve Purcell với một bản sửa lỗi cho một vấn đề rất giống nhau: http://emacs-fu.blogspot.com/2009/03/color-theming.html

Bí mật có vẻ là sử dụng hook các hàm chức năng sau khi tạo khung để thiết lập khung vừa tạo và cũng để (setq color-theme-is-global nil) để mỗi khung có thể có chủ đề màu riêng. Vì vậy, các phần có liên quan của init của tôi bây giờ trông như thế này:

(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)))

Tuy nhiên, tôi vẫn gặp vấn đề trong đó khung xóa sẽ đóng khung cuối cùng khi emacs được khởi động dưới dạng daemon và không cho phép tôi tạo khung mới khác sau đó bằng cách sử dụng emacsclient.

CẬP NHẬT:

Nếu tôi eval (frame-list)thấy có 2 khung được liệt kê mặc dù chỉ có một khung nhìn thấy được. Tôi nhận thấy rằng điều này không xảy ra nếu tôi khởi động Emacs với open /Applications/Emacs.appthay vì emacsclient. Tôi thường bắt đầu emacs từ dòng lệnh với bí danh e='emacsclient -c -n 'là thứ tạo ra khung thứ hai. Tôi dường như chỉ có thể gắn vào khung khác bằng cách bắt đầu emacs bằng lệnh mở. Nếu tôi dùng thử emacsclient -n somefile mà không -cnhận được gì, và nếu tôi chạy emacsclient -n -e '(frame-list)'tôi thấy có một khung hình không thể nhìn thấy cho đến khi tôi sử dụng -cđể tạo khung mới hoặc mở emacs từ thư mục ứng dụng.


Đây không giống như một câu hỏi Emacs.
ceving

Câu trả lời:


1

Chạy một tiến trình hoặc ứng dụng như một daemon launchd cung cấp cho nó một môi trường rất khác với việc chạy nó bình thường hoặc trên dòng lệnh. Tôi tự hỏi nếu nó có thể không hoạt động tốt hơn để thay vào đó sử dụng một kịch bản shell làm mục đăng nhập.

Ví dụ:

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

Tập lệnh này sẽ cần được lưu vào một tệp có .commandphần mở rộng và 755 quyền ( chmod 0755 myemacsscript.command) và sau đó được thêm vào ngăn Tùy chọn hệ thống: Đăng nhập: Mục Đăng nhập.

Khi bạn đăng nhập, Terminal sẽ khởi chạy và chạy tập lệnh này. Bạn có thể sẽ muốn thiết lập một cấu hình thiết bị đầu cuối mặc định loại trừ thiết bị đầu cuối khỏi việc nhắc thoát khỏi tập lệnh cụ thể này, để nó không giữ bạn khi bạn đăng xuất.

Tôi không biết điều này có khắc phục được các sự cố cụ thể với Emacs.app hay không, nhưng ít nhất nó có thể cung cấp một môi trường gần hơn với những gì Emacs.app mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.