Emacs sebagai daemon pada OS X dengan sistem jendela


13

Saya menjalankan gnu emacs 23.3.1 cocoa build di OS X 10.6.
Saya menambahkan yang berikut ke ~ / Library / LaunchAgents / gnu.emacs.daemon.plist sehingga akan memulai daemon dan secara otomatis me-restart emacs jika saya secara tidak sengaja membunuhnya.

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

Jenis ini berfungsi tetapi saya perhatikan bahwa tema warna saya tidak berfungsi dengan baik. Kemudian saya ingat saya telah menambahkan yang berikut ini ke file init saya:

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

Ketika dimulai sebagai sistem jendela daemon adalah palsu ternyata dan itu masuk akal, namun alasan saya menambahkan ini adalah karena saya kadang-kadang ingin memulai emacs normal yang dibangun di terminal dari ssh dll dan skema warna ini benar-benar tidak dapat dibaca di iTerm sehingga (ketika sistem jendela ...). Apakah ada cara untuk memaksa emacs untuk memulai mode jendela saat memulai dengan --daemon?

Masalah lain yang saya perhatikan adalah ketika saya menjalankan tekan sw (delete-frame) dalam mode dameon, saya tidak mendapatkan upaya kesalahan untuk menghapus satu-satunya bingkai yang terlihat atau ikon dan emacs terus berjalan di latar belakang. Saya suka ini untuk sebagian besar tetapi saya perhatikan bahwa setelah frame terakhir terbunuh saya tidak bisa lagi membuka kembali emacs dari doc dan walaupun emacs akan aktif dan menu ditampilkan mereka tidak berfungsi dan saya tidak dapat membuat bingkai baru kecuali dengan menggunakan emacsclient dari commandline. Adakah orang lain yang memiliki masalah dan atau rekomendasi tentang penyelesaian ini? mungkin saya dapat mengikat sw untuk mendeteksi apakah frame terakhir dan iconify-frame sebagai gantinya, tetapi tidak yakin mengapa ia berpikir itu bukan jendela terakhir dan memungkinkan saya untuk membunuhnya di tempat pertama.

MEMPERBARUI:

Saya menemukan komentar di blog berikut oleh Steve Purcell dengan perbaikan untuk masalah yang sangat mirip: http://emacs-fu.blogspot.com/2009/03/color-theming.html

Rahasianya tampaknya adalah menggunakan 'after-make-frame-functions hook untuk mengatur frame yang baru dibuat dan juga untuk (setq color-theme-is-global nil) sehingga setiap frame dapat memiliki tema warna sendiri. Jadi bagian yang relevan dari init saya sekarang terlihat seperti ini:

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

Namun, saya masih memiliki masalah di mana delete-frame menutup frame terakhir ketika emacs dimulai sebagai daemon dan tidak mengizinkan saya untuk membuat bingkai baru selain menggunakan emacsclient.

MEMPERBARUI:

Jika saya eval (frame-list)melihat ada 2 frame terdaftar meskipun hanya satu yang terlihat. Saya perhatikan bahwa ini tidak terjadi jika saya memulai Emacs dengan terbuka, /Applications/Emacs.appbukan emacsclient. Saya biasanya memulai emacs dari commandline dengan alias e='emacsclient -c -n 'yang membuat frame kedua. Saya hanya bisa melampirkan frame lain dengan memulai emacs dengan perintah terbuka. Jika saya mencoba emacsclient -n seseorang tanpa -csaya tidak mendapatkan apa-apa, dan jika saya menjalankan emacsclient -n -e '(frame-list)'saya melihat ada bingkai yang tidak terlihat sampai saya gunakan -cuntuk membuat bingkai baru atau membuka emacs dari folder aplikasi.


Ini tidak terlihat seperti pertanyaan Emacs.
ceving

Jawaban:


1

Menjalankan proses atau aplikasi sebagai daemon launchd memberikannya lingkungan yang sangat berbeda dari menjalankannya secara normal atau pada baris perintah. Saya ingin tahu apakah itu mungkin tidak bekerja lebih baik daripada menggunakan skrip shell sebagai item masuk.

Sebagai contoh:

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

Script ini perlu disimpan ke file dengan .commandekstensi dan 755 izin ( chmod 0755 myemacsscript.command) dan kemudian ditambahkan ke System Preferences: Login: panel Item Login.

Saat Anda masuk, Terminal akan meluncurkan dan menjalankan skrip ini. Anda mungkin ingin mengatur profil terminal default yang mengecualikan terminal dari meminta berhenti untuk skrip khusus ini, sehingga tidak menahan Anda ketika Anda logout.

Saya tidak tahu apakah ini akan memperbaiki masalah khusus dengan Emacs.app, tetapi setidaknya dapat memberikan lingkungan yang lebih dekat dengan apa yang diharapkan Emacs.app.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.