Emacsdaemon y Emacsclient en Mac

25

SO: 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 2014-04-03 en Rainers-MacBook-Pro-3.local

Instalé emacs a través de homebrew de railwaycat y funciona bien, no tengo quejas. No uso emacs en el termoinal, y generalmente lo inicio a través de la aplicación.

Como dije, estoy feliz hasta ahora.

Solo tengo una cosa que no logré hacer bien (que funcionó bien en Linux antes), que es:

  1. obtener el demonio de emacs al iniciar sesión
  2. usando emacsclient para abrir
  3. cierre emacsdaemon y guarde todos los archivos al cerrar sesión

¿Alguna receta que pueda ayudarme a configurar esto?

Información agregada

Para iniciar un demonio emacs al iniciar sesión

Creé una aplicación Automator ejecutando el comando bash

/usr/local/bin/emacs --daemon

y lo agregué a los Elementos de inicio de sesión que funciona bien.

Utilizando demonio desde la terminal

Puedo utilizar el demonio emacs usando

emacsclient .bashrc

que abre .bashrc en una sesión de terminal emacs.

Utilizando desde GUI

Ahora sigue siendo la pregunta: ¿cómo puedo utilizarlo desde la GUI?

Según entiendo el emacsclient, no puedo abrir un emacsclient a menos que especifique un archivo para abrir.

Me gustaría abrir una GUI de emacsclient y abrir todos los archivos que se abrieron previamente . es posible?

Descubrí que puedo usar

emacsclient -c

en una terminal para hacer lo que quiero, pero ¿puedo hacer lo mismo para la GUI?

Rainer
fuente
No entiendo qué significa "de la GUI" aquí. Podría significar "hacer doble clic en un archivo en el Finder" o algo completamente diferente.
tarsius
Uso del Lanzador de aplicaciones (por ejemplo, a través de Spotlight)
Rainer
¿El Lanzador de aplicaciones permite seleccionar archivos (que luego se abren utilizando la aplicación predeterminada para el tipo de archivo). ¿O solo "Aplicaciones"? emacsclientno es una aplicación en lo que respecta a OS X, solo lo Emacses (y solo si se ha instalado de esa manera). ¿Por qué no usa las combinaciones de teclas del sistema para seleccionar una aplicación / ventana abierta? (No funcionará si Emacs se inició en modo demonio y todavía no hay un marco ("ventana")).
tarsius
Definí una aplicación llamada Emacsclient que inicia el emacsclient, por lo que la aplicación Emacsclient está allí. Obviamente, podría cambiar a una instancia de emacs en ejecución, pero esto no tiene nada que ver con el flujo de trabajo descrito anteriormente.
Rainer
1
Esta pregunta es casi más útil que sus respuestas :)
Roy Truelove

Respuestas:

6

Realmente no me importa que Emacs.app siempre se ejecute, pero el hecho de que no pudiera cerrar la ventana sin matar accidentalmente el servidor de Emacs fue molesto. E incluso si intenta realmente matar el último fotograma, todavía no le permite: "Intentar eliminar el único fotograma visible o iconificado". ... Así que hacemos trampa.

Esta solución solo oculta Emacs (como Command+ h) cuando intenta cerrar la última ventana haciendo clic en el botón Cerrar.

Agregue lo siguiente a su Emacs init en alguna 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"))))

Y agregue Emacs a "Usuarios y grupos> Elementos de inicio de sesión", y haga clic en la casilla de verificación "Ocultar".

Su Emacs init también necesita llamar a (start-server)alguna parte.

Estoy usando esta emacsclientenvoltura para llevar a Emacs al frente primero:

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

Cuestiones:

  • Activar / mostrar Emacs trae todas las ventanas al frente. Esto es un poco molesto.
  • Al hacer clic en el icono de Emacs en el Dock, a veces parece crear aleatoriamente una nueva ventana. Pero no siempre.
  • TODO: ¿Quizás hacer Command+ wen el último cuadro también oculta Emacs?
  • NUEVO con la edición: al hacer clic en el icono del dock cuando todas las ventanas están minimizadas, no se maximiza automáticamente una de ellas.

Esto se basa en la respuesta de @noaham que sugiere minimizar Emacs, y esta respuesta explica cómo enganchar tratando de cerrar la última ventana.

EDITAR:

Al buscar a través de la fuente, encontré el "enlace de teclas" para elmac-apple-event-map que se realizan llamadas mac-ae-reopen-application. mac-ae-reopen-applicationparece comprobar si hay marcos visibles e iconificados y de alguna manera debe perder nuestro oculto. Esto es posiblemente un error.

La solución fácil es simplemente deshabilitar el enlace de teclas en su init:

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

Esto introduce un nuevo error menor: al hacer clic en el icono del dock cuando todas las ventanas están minimizadas, no se maximiza automáticamente una de ellas. La solución correcta sería reescribir mac-ae-reopen-application, pero apenas conozco emacs y elisp.

bburky
fuente
Si alguien descubre cómo detener la nueva ventana aleatoria (punto dos), dígame. Tal vez sea lo único que me sigue molestando sobre esta configuración.
parent5446
@ parent5446, ¡listo! Tan hacky como la primera solución, pero funciona.
bburky
¡Gracias! La parte de piratear no me molesta, ya que la mayoría de las veces no inicio Emacs desde el muelle de todos modos.
parent5446
4

El puerto Yamamoto Mitsuharu de emacs no es compatible con multi-tty desafortunadamente (vea este número ). Esto significa que no puede iniciar el demonio emacs desde la terminal e iniciar una ventana gui con emacsclient.

Esto es lo que hago: en mi init.el tengo (server-start)y ejecuto Emacs.app al iniciar sesión. La molestia aquí es que esto abre una ventana que tengo que minimizar manualmente.

Luego tengo un script bash llamado emacsccon lo siguiente

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

Luego creo una aplicación con AppleScript que contiene lo siguiente

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

Es importante pasar la -nbandera a emacsclient; de lo contrario, solo podrá usar la aplicación emacsc para abrir un cliente a la vez. Establecer la variable de ruta asegura que OS X pueda encontrar la versión correcta de emacsclient.

Decirle a Emacs que "active" asegura que su ventana de cliente se iniciará en primer plano.

Como dije, la molestia es que debe minimizar manualmente la ventana de emacs al iniciar sesión y luego tenerla sentada en el muelle. Una forma de evitar esto es "ocultar" automáticamente Emacs después de iniciar sesión, pero luego de activarlo hará que se oculte.

noaham
fuente
2

No estoy seguro de cómo Railwaycat Emacs es diferente de la fórmula habitual de elaboración casera, pero con esta última lo haría ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents, que se ejecutaría emacs --daemonal iniciar sesión.

El plist se incluye como un documento AQUÍ en la fórmula . Todo lo que necesita para adoptarlo es cambiar la ruta a su aplicación emacs en la línea <string>#{opt_bin}/emacs</string>.

Por cierto, también puede obtener Emacs como una aplicación OS X con Homebrew Emacs si lo instala con la --cocoaopción. (También deberá ejecutar brew linkappsdespués, vincularlo /Applicationso crear el vínculo usted mismo.

Davor Cubranic
fuente
1

En Mac, los demonios son, el 90% del tiempo, administrados usando launchd . Puede ejecutarlos en muchos desencadenantes, incluido el inicio / cierre de sesión del usuario. Hay una bonita aplicación para Mac llamada Lingon para ver y editar las diversas cosas que está ejecutando launchd. El wiki de emacs tiene algunas menciones de esto, incluido un archivo de configuración de ejemplo . Pero parece que no aborda su preocupación, es decir, cómo cerrar el demonio al cerrar sesión.

Ben Hyde
fuente
0

Cree una aplicación AppleScript como esta:

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

Es posible que tenga que ajustar la ruta, o puede dejar la ruta por completo. También podría usar algo más elegante con el que se inicia el demonio si aún no se está ejecutando.

tarsius
fuente
@Rainer ¿Tienes algún éxito con esto? También es posible que desee buscar una implementación más sofisticada que incluso inicie el demonio si es necesario antes de conectarse a él utilizando el cliente emacs. "applescript emacsclient" da buenos resultados con la búsqueda de google.
tarsius
¿Todavía estás esperando una mejor respuesta o sería posible aceptar esta?
tarsius