Emacsdaemon dan Emacsclient di Mac

25

OS: OS X 10.9.5, Mavericks

GNU Emacs 24.3.1 (x86_64-apple-darwin13.1.0, Carbon Version 1.6.0 AppKit 1265.19) dari 2014-04-03 tentang Rainers-MacBook-Pro-3.local

Saya menginstal emacs melalui homebrew dari railcat dan bekerja dengan baik - tidak ada keluhan. Saya tidak menggunakan emacs dalam termoinal, dan saya biasanya memulainya melalui Aplikasi.

Seperti yang saya katakan - saya senang sejauh ini.

Saya hanya punya satu hal yang saya tidak berhasil melakukannya dengan benar (yang bekerja dengan baik di linux sebelumnya), yaitu:

  1. dapatkan daemon emacs mulai saat login
  2. menggunakan emacsclient untuk membuka
  3. tutup emacsdaemon dan simpan file al setelah logoff

Adakah resep yang bisa membantu saya mengaturnya?

Informasi tambahan

Untuk memulai daemon emacs saat login

Saya membuat Aplikasi Automator yang menjalankan perintah bash

/usr/local/bin/emacs --daemon

dan menambahkannya ke Item Login yang berfungsi dengan baik.

Memanfaatkan daemon dari terminal

Saya dapat menggunakan daemon emacs dengan menggunakan

emacsclient .bashrc

yang membuka .bashrc di sesi terminal emacs.

Memanfaatkan dari GUI

Sekarang tetap menjadi pertanyaan: bagaimana saya bisa menggunakannya dari GUI?

Karena saya mengerti emacsclient, saya tidak bisa membuka emacsclient kecuali saya menentukan file untuk dibuka.

Saya ingin membuka GUI emacsclient dan membuka semua file yang sebelumnya dibuka ? Apakah ini mungkin?

Saya menemukan bahwa saya dapat menggunakan

emacsclient -c

di terminal untuk melakukan apa yang saya inginkan - tetapi bisakah saya melakukan hal yang sama untuk GUI?

Rainer
sumber
Saya tidak mengerti apa artinya "dari GUI" di sini. Ini bisa berarti "mengklik dua kali pada file di Finder" atau sesuatu yang lain sama sekali.
tarsius
Menggunakan Peluncur Aplikasi (mis. Via Spotlight)
Rainer
Apakah Peluncur Aplikasi mengizinkan pemilihan file (yang kemudian dibuka menggunakan aplikasi default untuk jenis file). Atau hanya "Aplikasi"? emacsclientbukan App sejauh menyangkut OS X, hanya Emacs(dan hanya jika telah diinstal seperti itu). Mengapa Anda tidak menggunakan ikatan kunci sistem untuk memilih aplikasi / jendela yang terbuka? (Tidak akan berfungsi jika Emacs dimulai dalam mode daemon dan belum ada bingkai ("jendela")).
tarsius
Saya mendefinisikan sebuah aplikasi bernama Emacsclient yang meluncurkan emacsclient - jadi ada aplikasi Emacsclient. Saya jelas bisa beralih ke instance emacs yang sedang berjalan - tapi ini intinya, melihat alur kerja yang dijelaskan di atas.
Rainer
1
Pertanyaan ini hampir lebih membantu daripada jawabannya :)
Roy Truelove

Jawaban:

6

Saya benar-benar tidak keberatan Emacs.app selalu berjalan, tetapi kenyataan bahwa saya tidak bisa menutup jendela tanpa sengaja membunuh server Emacs itu menjengkelkan. Dan bahkan jika Anda berusaha sangat keras untuk membunuh frame terakhir, itu masih tidak membiarkan Anda: "Mencoba untuk menghapus satu-satunya frame yang terlihat atau ikon". ... Jadi kami curang.

Solusi ini hanya menyembunyikan Emacs (seperti Command+ h) ketika Anda mencoba untuk menutup jendela terakhir dengan mengklik tombol tutup.

Tambahkan yang berikut ini ke Emacs Anda di suatu tempat:

(defadvice handle-delete-frame (around my-handle-delete-frame-advice activate)
  "Hide Emacs instead of closing the last frame"
  (let ((frame   (posn-window (event-start event)))
        (numfrs  (length (frame-list))))
    (if (> numfrs 1)
      ad-do-it
      (do-applescript "tell application \"System Events\" to tell process \"Emacs\" to set visible to false"))))

Dan tambahkan Emacs ke "Pengguna & Grup> Item Masuk", dan klik kotak centang "Sembunyikan".

Init Emacs Anda juga perlu menelepon ke (start-server)suatu tempat.

Saya menggunakan emacsclientpembungkus ini untuk membawa Emacs ke depan terlebih dahulu:

#!/bin/sh
osascript -e 'tell application "Emacs" to activate'
exec emacsclient "$@"

Masalah:

  • Mengaktifkan / unhiding Emacs membawa semua jendela ke depan. Ini sedikit mengganggu.
  • Mengklik ikon Emacs di Dock tampaknya membuat jendela baru secara acak. Tapi tidak selalu.
  • TODO: Mungkin membuat Command+ wpada frame terakhir juga menyembunyikan Emacs?
  • BARU dengan edit: mengklik ikon dok ketika semua jendela diperkecil tidak secara otomatis memaksimalkan salah satunya.

Ini didasarkan pada jawaban @ noaham yang menyarankan untuk meminimalkan Emacs, dan jawaban ini menjelaskan cara mengait mencoba menutup jendela terakhir.

EDIT:

Mencari melalui sumber, saya menemukan "kunci yang mengikat" untukmac-apple-event-map panggilan mana mac-ae-reopen-application. mac-ae-reopen-applicationtampaknya memeriksa bingkai yang terlihat dan ditandai dan entah bagaimana harus kehilangan yang tersembunyi kami. Ini mungkin bug.

Cara mudah memperbaikinya adalah dengan menonaktifkan kunci yang mengikat di init Anda:

(define-key mac-apple-event-map [core-event reopen-application] nil)

Ini memperkenalkan bug minor baru: mengeklik ikon dok ketika semua jendela diperkecil tidak secara otomatis memaksimalkan salah satunya. Perbaikan yang benar adalah menulis ulang mac-ae-reopen-application, tetapi saya hampir tidak tahu emacs dan elisp.

kurang ajar
sumber
Jika ada yang tahu cara menghentikan jendela baru acak (poin kedua), tolong beri tahu saya. Mungkin satu-satunya yang tersisa yang masih mengganggu saya tentang pengaturan ini.
parent5446
@ parent5446, selesai! Sama seperti hacky sebagai perbaikan pertama, tetapi ia bekerja.
bburky
Terima kasih! Bagian hack itu tidak mengganggu saya karena sebagian besar waktu saya tidak memulai Emacs dari dermaga.
parent5446
4

Sayangnya, port emacs Yamamoto Mitsuharu tidak mendukung multi-tty (lihat masalah ini ). Ini berarti Anda tidak dapat memulai daemon emacs dari terminal dan meluncurkan jendela gui dengan emacsclient.

Inilah yang saya lakukan: Di init.el saya miliki (server-start)dan saya meluncurkan Emacs.app saat login. Gangguan di sini adalah bahwa ini memunculkan jendela yang harus saya perkecil secara manual.

Saya kemudian memiliki skrip bash yang disebut emacscdengan berikut ini

#!/bin/bash                                                                          
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
emacsclient -n -c

Saya kemudian membuat aplikasi dengan applescript yang berisi yang berikut ini

tell application "Emacs"
    activate
end tell
do shell script "~/bin/emacsc"

Penting untuk meneruskan -nflag ke emacsclient jika tidak, Anda hanya akan dapat menggunakan aplikasi emacsc untuk membuka satu klien pada satu waktu. Mengatur variabel path memastikan bahwa OS X dapat menemukan versi emacsclient yang benar.

Memberitahu Emacs untuk "mengaktifkan" memastikan bahwa jendela klien Anda akan diluncurkan di latar depan.

Seperti yang saya katakan gangguannya adalah Anda harus meminimalkan secara manual jendela emacs saat login dan kemudian membuatnya duduk di dok. Salah satu cara untuk menghindarinya adalah dengan secara otomatis "menyembunyikan" Emacs setelah login tetapi kemudian mengaktifkannya akan menyebabkannya tidak terlihat.

noaham
sumber
2

Saya tidak yakin bagaimana railcat Emacs berbeda dari formula home-brew biasa, tetapi dengan yang terakhir yang akan Anda lakukan ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, yang akan berjalan emacs --daemonsaat login.

Plist dimasukkan sebagai dokumen DI SINI dalam formula . Yang Anda perlukan untuk mengadopsinya adalah mengubah jalur ke aplikasi emacs Anda di baris tersebut <string>#{opt_bin}/emacs</string>.

BTW, Anda juga bisa mendapatkan Emacs sebagai aplikasi OS X dengan Homebrew Emacs jika Anda menginstalnya dengan --cocoaopsi. (Anda juga perlu menjalankannya brew linkappssetelah itu, menautkannya /Applications, atau membuat tautannya sendiri.

Davor Cubranic
sumber
1

Pada mac daemon, 90% dari waktu, dikelola menggunakan launchd . Itu dapat menjalankannya di banyak pemicu, termasuk pengguna login / logout. Ada Aplikasi Mac yang cantik bernama Lingon untuk melihat dan mengedit berbagai hal yang dikelola launchd. Wiki emacs memiliki beberapa menyebutkan hal ini, termasuk dan contoh file konfigurasi . Tapi sepertinya itu tidak mengatasi masalah Anda, yaitu cara mematikan daemon saat keluar.

Ben Hyde
sumber
0

Buat aplikasi AppleScript seperti ini:

tell application "Terminal"
do shell script "/usr/local/bin/emacsclient -c"
endtell

Anda mungkin harus menyesuaikan jalur, atau Anda mungkin dapat meninggalkan jalur sepenuhnya. Anda juga bisa menggunakan sesuatu yang lebih menarik dengan memulai daemon jika belum berjalan.

tarsius
sumber
@Rainer. Berhasil dengan ini? Anda mungkin juga ingin mencari implementasi yang lebih menarik yang bahkan memulai daemon jika perlu sebelum menghubungkannya menggunakan emacsclient. "applescript emacsclient" memberikan hasil yang baik dengan pencarian google.
tarsius
Apakah Anda masih menunggu jawaban yang lebih baik atau apakah mungkin menerima jawaban ini?
tarsius