Emacsdaemon ed Emacsclient su Mac


25

Sistema operativo: 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) del 03-04-2014 su Rainers-MacBook-Pro-3.local

Ho installato emacs tramite homebrew di railwaycat e funziona bene - nessuna lamentela. Non utilizzo emacs nel termoinale e di solito lo avvio tramite l'applicazione.

Come ho già detto, sono felice finora.

Ho solo una cosa che non sono riuscito a fare bene (che prima funzionava bene su Linux), che è:

  1. ottenere il demone emacs a partire dal login
  2. usando emacsclient per aprire
  3. chiudi emacsdaemon e salva tutti i file alla disconnessione

Qualche ricetta di lavoro che potrebbe aiutarmi a configurarlo?

Informazioni aggiunte

Per avviare un demone emacs al momento dell'accesso

Ho creato un'applicazione Automator eseguendo il comando bash

/usr/local/bin/emacs --daemon

e l'ho aggiunto agli elementi di accesso che funzionano bene.

Utilizzo del demone dal terminale

Posso usare il demone emacs usando

emacsclient .bashrc

che apre .bashrc in una sessione di terminale emacs.

Utilizzando dalla GUI

Ora rimane la domanda: come posso utilizzarlo dalla GUI?

Quando capisco l'emacsclient, non posso aprire un emacsclient a meno che non specifichi un file da aprire.

Vorrei aprire una GUI emacsclient e aprire tutti i file precedentemente aperti ? È possibile?

Ho scoperto che posso usare

emacsclient -c

in un terminale per fare quello che voglio - ma posso fare lo stesso per la GUI?


Non capisco cosa significhi "dalla GUI" qui. Potrebbe significare "doppio clic su un file nel Finder" o qualcos'altro completamente.
tarsius,

Utilizzo dell'App Launcher (ad es. Tramite Spotlight)
Rainer,

Avvio applicazioni consente di selezionare i file (che vengono quindi aperti utilizzando l'applicazione predefinita per il tipo di file)? O solo "App"? emacsclientnon è un'app per quanto riguarda OS X, lo Emacsè solo (e solo se è stata installata in questo modo). Perché non usi semplicemente i collegamenti dei tasti di sistema per selezionare un'applicazione / finestra aperta? (Non funzionerà se Emacs è stato avviato in modalità demone e non ci sono ancora frame ("finestra")).
tarsius,

Ho definito un'app chiamata Emacsclient che avvia l'emacsclient, quindi l'app Emacsclient è lì. Ovviamente potrei passare a un'istanza di emacs in esecuzione - ma questo è oltre al punto, guardando il flusso di lavoro sopra descritto.
Rainer,

1
Questa domanda è quasi più utile delle sue risposte :)
Roy Truelove,

Risposte:


6

Non mi dispiace che Emacs.app sia sempre in esecuzione, ma il fatto che non potessi chiudere la finestra senza uccidere accidentalmente il server Emacs era fastidioso. E anche se fai del tuo meglio per uccidere l'ultimo fotogramma, non ti consente ancora: "Tenta di eliminare l'unico fotogramma visibile o iconizzato". ... Quindi imbrogliamo.

Questa soluzione nasconde Emacs (come Command+ h) quando si tenta di chiudere l'ultima finestra facendo clic sul pulsante Chiudi.

Aggiungi quanto segue al tuo init Emacs da qualche parte:

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

Aggiungi Emacs a "Utenti e gruppi> Elementi di accesso" e fai clic sulla casella di controllo "Nascondi".

Il tuo init Emacs deve anche chiamare (start-server)da qualche parte.

Sto usando questo emacsclientwrapper per portare Emacs in primo piano:

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

Problemi:

  • Attivare / scoprire Emacs porta tutte le finestre in primo piano. Questo è leggermente fastidioso.
  • Facendo clic sull'icona Emacs nel Dock a volte sembra creare casualmente una nuova finestra. Ma non sempre.
  • TODO: Forse make Command+ wnell'ultimo fotogramma nasconde anche Emacs?
  • NOVITÀ con modifica: facendo clic sull'icona del dock quando tutte le finestre sono ridotte a icona non ne massimizza automaticamente una.

Questo si basa sulla risposta di @ noaham che suggerisce di minimizzare Emacs e questa risposta spiega come agganciare il tentativo di chiudere l'ultima finestra.

MODIFICARE:

Cercando attraverso la fonte, ho trovato il "key binding" per ilmac-apple-event-map quale chiama mac-ae-reopen-application. mac-ae-reopen-applicationsembra verificare la presenza di frame visibili e iconizzati e deve in qualche modo mancare a quello nascosto. Questo è probabilmente un bug.

La soluzione semplice è semplicemente disabilitare l'associazione dei tasti nel tuo init:

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

Questo introduce un nuovo bug minore: fare clic sull'icona del dock quando tutte le finestre sono ridotte a icona non ne massimizza automaticamente una. La correzione corretta sarebbe riscrivere mac-ae-reopen-application, ma conosco a malapena emacs ed elisp.


Se qualcuno capisce come fermare la nuova finestra casuale (punto due), per favore dimmelo. È forse l'unica cosa rimasta che mi infastidisce ancora per questa configurazione.
parent5446

@ parent5446, fatto! Proprio come hacky come la prima correzione, ma funziona.
bburky

Grazie! La parte di hack non mi disturba dal momento che la maggior parte delle volte non avvio Emacs dal dock comunque.
parent5446,

4

Il porto di emacs Yamamoto Mitsuharu non supporta purtroppo multi-tty (vedi questo numero ). Ciò significa che non è possibile avviare il demone emacs dal terminale e avviare una finestra della GUI con emacsclient.

Ecco cosa faccio: Nel mio init.el ho (server-start)e lancio Emacs.app al login. Il fastidio qui è che questo fa apparire una finestra che devo minimizzare manualmente.

Ho quindi uno script bash chiamato emacsccon il seguente

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

Quindi creo un'app con applecript che contiene quanto segue

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

È importante passare il -nflag a emacsclient, altrimenti sarai in grado di utilizzare l'app emacsc solo per aprire un client alla volta. L'impostazione della variabile path assicura che OS X possa trovare la versione corretta di emacsclient.

Dire a Emacs di "attivare" garantisce che la finestra del client venga avviata in primo piano.

Come ho detto, il fastidio è che devi minimizzare manualmente la finestra di emacs al momento del login e poi averla seduta nel dock. Un modo per evitarlo è quello di "nascondere" automaticamente Emacs dopo il login, ma dopo averlo attivato lo farà scoprire.


2

Non sono sicuro di come Emacs railwaycat sia diverso dalla normale formula della birra fatta in casa, ma con quest'ultimo lo faresti ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, che verrebbe eseguito emacs --daemonal login.

Il plist è incluso come documento HERE nella formula . Tutto ciò di cui hai bisogno per adottarlo è cambiare il percorso della tua app emacs nella linea <string>#{opt_bin}/emacs</string>.

A proposito, puoi anche ottenere Emacs come app OS X con Homebrew Emacs se lo installi con l' --cocoaopzione. (Dovresti anche correre in brew linkappsseguito, collegarlo /Applicationso creare tu stesso il collegamento.


1

Su Mac i demoni sono, il 90% delle volte, gestiti usando launchd . Può eseguirli su molti trigger, incluso il login / logout dell'utente. Esiste una bella applicazione Mac chiamata Lingon per visualizzare e modificare le varie cose che Launchd sta gestendo. La wiki di emacs ha alcune menzioni di questo, incluso ed esempio file di configurazione . Ma sembra che non affronti le tue preoccupazioni, cioè come spegnere il demone al logout.


0

Crea un'applicazione AppleScript come questa:

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

Potrebbe essere necessario regolare il percorso o potrebbe essere possibile abbandonare completamente il percorso. Puoi anche usare qualcosa di più elaborato con avvia il demone se non è ancora in esecuzione.


@Rainer Hai successo con questo? Potresti anche voler cercare un'implementazione più elaborata che avvii anche il demone, se necessario, prima di collegarti ad esso usando l'emacsclient. "applecript emacsclient" offre buoni risultati con la ricerca su Google.
Tarsius,

Stai ancora aspettando una risposta migliore o sarebbe possibile accettarla?
tarsius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.