Configuración básica del servidor Emacs en OSX

Configuración básica del servidor Emacs en OSX

Recientemente compré mi primera Mac en una década y estoy en el proceso de configurarla. Soy usuario de Emacs y he determinado que quierosolo Emacs normalesno Aquamacs para poder usar mi configuración existente de otros sistemas operativos. Intenté seguir muchos procedimientos que encontré en línea (comoÉste,Ésteyeste del sitio desde el que descargué Emacs), y he intentado combinar las piezas de varias maneras, pero nunca he logrado que las cosas lleguen a un estado que se acerque siquiera a lo que estoy acostumbrado o espero:

  1. Un demonio de Emacs comienza a ejecutarseAl iniciootan pronto como lo necesito; Cualquiera esta bien. Cualquier marco nuevo de Emacs está respaldado por el mismo servidor.
  2. Cuando abro un archivo de texto desde el Finder, el archivo se abre en Emacs, en un marco gráfico existente si es posible.
  3. Si ejecuto Emacs.app, el sistema reutiliza el demonio de emacs que se ejecuta en segundo plano en lugar de iniciar una nueva instancia y abrir una nueva ventana. (punta del sombrero)
  4. Cuando ejecuto Emacs desde una terminal, la terminal continúa con sus tareas sin esperar a que termine con Emacs (a menos que use '-nw')
  5. AFAIK, en ningún momento durante las operaciones descritas anteriormente, Emacs debería terminar en un estado ("¿modo de edición de servidor?") donde esté esperando a que escriba C-x #, aunque no tengo un conocimiento profundo de este.
  6. (Consideraría esto como una ventaja) Hay alguna forma de invocar a Emacs desde una terminal para que Emacs reutilice un marco existente si es posible.

¿Cómo podría configurar Emacs para que se comporte así?

Estoy particularmente perplejo al lograr que el Finder abra cosas en Emacs de la manera que quiero (#2), ya que las guías que he encontrado generalmente crean una serie de alias, Applescripts, scripts bash, etc. y no estoy seguro que quiero decirle al Finder que use para abrir archivos de texto.

¡Gracias!

A.@lawlist pregunta: "¿Se abre un nuevo marco de forma predeterminada cuando abres un nuevo archivo desde la terminal aunque ya exista un marco?" La respuesta es que si inicio un servidor al inicio como se describeaquí, abra un marco y luego abra un archivo escribiendo /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n <whatever>, puedo hacer que el archivo se abra en un marco existente. Si no hay ningún marco abierto actualmente, tengo que usar "-nc" o cuando intento abrir un archivo no sucede nada.

B.@lawlist pregunta: "¿Quiere que el demonio se ejecute al iniciar sesión o sería suficiente cargar Emacs manualmente después de iniciar sesión?" Ejecutarlo manualmente estaría bien.

Respuesta1

Para hacer que Emacs.app abra archivos en un marco existente en lugar de un marco nuevo, agréguelo (setq ns-pop-up-frames nil)a un archivo de configuración como ~/.emacs.

Puede abrir un archivo desde una terminal con open -a emacs fileo emacsclient -n file. Si Emacs.app no ​​está abierto pero hay un Emacs --daemonproceso, por alguna razón emacsclient -n fileno funciona pero emacsclient -nc filefunciona.

Asegúrese de utilizar el emacsclientbinario incluido con la versión de Emacs que utiliza, como /Applications/Emacs.app/Contents/MacOS/bin/emacsclient, o /usr/local/bin/emacsclientsi instaló Emacs con Homebrew.

Para iniciar un servidor Emacs al iniciar sesión, por ejemplo, guarde este plist como ~/Library/LaunchAgents/my.emacsdaemon.plist:

<?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>my.emacsdaemon</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/> <!-- run the program again if it terminates -->
</dict>
</plist>

El plist se carga automáticamente la próxima vez que inicie sesión, pero puede cargarlo inmediatamente ejecutando launchctl load ~/Library/LaunchAgents/my.emacsdaemon.plist.

Editar: todavía no sé por qué la gente asocia tipos de archivos con una aplicación AppleScript en lugar de solo Emacs.app. Sin embargo, el script en la respuesta de Kuzzooroo también podría escribirse como un script de shell:

macos=/Applications/Emacs.app/Contents/MacOS
if pgrep -qf 'Emacs.*--daemon'; then
  [[ $($macos/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))') = t ]] && args=-nc || args=-n
else
  $macos/Emacs --daemon
  args=-nc
fi
$macos/bin/emacsclient $args "$@"
open -a /Applications/Emacs.app

Puedes usarOrnitorrincopara guardar el script como una aplicación:

Recién comencé a usar Emacs, pero tengo una configuración completamente diferente. Creé mi propia aplicación Emacs haciendo una copia de iTerm.app, cambiando CFBundleIdentifier en Info.plist para que la aplicación use un archivo de preferencias diferente y configurando el comando predeterminado en /usr/local/bin/emacs. Agregué y (server-start)abro ~/.emacsla aplicación Emacs personalizada al iniciar sesión. Utilicé Platypus para crear una aplicación que se ejecuta emacsclient -n "$@";open -b my.emacsy la convertí en la aplicación predeterminada para archivos de texto.

Respuesta2

La solución de Lauri combinada con las sugerencias de los comentarios han solucionado en gran medida mis problemas. He pegado debajo algo de Applescript que uní a partir de cosas que encontré en línea. El script ayuda a suavizar algunas arrugas restantes, por ejemplo, su comportamiento es un poco mejor si no hay un marco Emacs actual.

EDITAR: el propósito del script es asociarlo con archivos .txt en el Finder.

-- http://superuser.com/questions/457484/how-to-open-emacs-from-macs-finder
-- https://gist.github.com/ambethia/304964#comment-799519
on run {input}
    set filepath to quoted form of POSIX path of input
    tell application "Terminal"
        try
            -- we look for <= 2 because Emacs --daemon seems to always have an entry in visibile-frame-list even if there isn't
            set frameVisible to do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -e '(<= 2 (length (visible-frame-list)))'"
            if frameVisible is "t" then
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n " & filepath
            else
                -- there is a not a visible frame, launch one
                do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n " & filepath
            end if
        on error
            -- daemon is not running, start the daemon and open a frame     
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n"
        end try
    end tell

    -- bring the visible frame to the front
    tell application "Emacs" to activate

    return input
end run

información relacionada