Configuración básica del servidor Emacs bajo OSX

9

Recientemente compré mi primera Mac en una década y estoy en el proceso de configurarla. Soy un usuario de Emacs y he determinado que solo quiero Emacs normales, no Aquamacs, para poder usar mi configuración existente desde otros sistemas operativos. He intentado seguir muchos procedimientos que he encontrado en línea (como este , este y este del sitio desde el que descargué Emacs ), y he intentado combinar las piezas de varias maneras, pero nunca metí las cosas en un estado que incluso se acercaba a lo que estoy acostumbrado / esperando:

  1. Un demonio de Emacs comienza a ejecutarse en el inicio o tan pronto como lo necesite ; Cualquiera esta bien. Cualquier nuevo marco 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 emacs que se ejecuta en segundo plano en lugar de iniciar una nueva instancia y abrir una nueva ventana. ( punta de sombrero )
  4. Cuando ejecuto Emacs desde una terminal, la terminal se ocupa de sus asuntos sin esperar a que termine con Emacs (a menos que use '-nw')
  5. AFAIK en ningún momento durante las operaciones descritas anteriormente debería terminar Emacs en un estado ("¿modo de edición del servidor?") Donde está esperando que escriba C-x #, aunque no tengo un conocimiento profundo de este.
  6. (Consideraría esto como una bonificación). Hay alguna forma de invocar Emacs desde un 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 hacer 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 de bash, etc. y no estoy seguro que quiero decirle al Finder que use para abrir archivos de texto.

¡Gracias!

R. @lawlist pregunta: "¿Se abre un nuevo marco de forma predeterminada cuando abre un nuevo archivo desde el terminal a pesar de que hay un marco existente?" La respuesta es que si inicio un servidor al inicio como se describe aquí , abro un marco y luego abro 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: "¿Desea que el demonio se ejecute al iniciar sesión, o sería suficiente cargar Emacs manualmente después del inicio de sesión?" Correr manualmente estaría bien.

kuzzooroo
fuente
¿Puede numerarlos por favor, 1, 2, 3, 4, 5, 6 y quizás 7 y 8. Además, se abre un nuevo marco de forma predeterminada cuando abre un nuevo archivo desde el terminal a pesar de que hay un marco existente ? Conozco algunas de las respuestas, pero no todas, por lo que los números de las preguntas serían útiles. ¿Desea que el demonio se ejecute al iniciar sesión, o sería suficiente cargar Emacs manualmente después del inicio de sesión?
leyes el
@Lauri Ranta tiene una buena respuesta. M-x server-startiniciará manualmente el servidor para que emacsclientpueda comunicarse con él. He colocado (server-start)en mi init.elarchivo en lugar de utilizar un demonio al iniciar sesión; sin embargo, muchas personas prefieren la opción de inicio de sesión del demonio. Y, por supuesto, el .emacsarchivo sería un lugar adecuado para (server-start).
leyes el
Con respecto a la apertura de archivos desde Finder, supongo que está más allá de la etapa de necesitar algo como esto: dummies.com/how-to/content/… Entonces, suponiendo que eso esté fuera del camino, entonces probablemente va a ir para estar bien con ns-find-file- que se activa automáticamente cuando un archivo está asociado con Emacs.app. La función de mi archivo de intercepción en los enlaces anteriores también modifica ns-find-filesi eso es algo que le interesa. Por supuesto, necesitas construir Emacs --with-ns.
leyes el

Respuestas:

10

Para hacer que Emacs.app abra archivos en un marco existente en lugar de un nuevo marco, 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 filesí.

Asegúrese de usar el emacsclientbinario incluido con la versión de Emacs que usa, 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 esta lista 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é las personas asocian 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

Puede usar Platypus para guardar el script como una aplicación:

Acabo de comenzar a usar Emacs, pero tengo una configuración completamente diferente. Hice mi propia aplicación Emacs haciendo una copia de iTerm.app, cambiando el CFBundleIdentifier en Info.plist para que la aplicación use un archivo de preferencias diferente y estableciendo el comando predeterminado en /usr/local/bin/emacs. He añadido (server-start)a ~/.emacsy abra la aplicación Emacs personalizada al iniciar la 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.

Lri
fuente
2

La solución de Lauri combinada con las sugerencias de los comentarios han abordado en gran medida mis problemas. He pegado debajo de un 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 asociarse 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
kuzzooroo
fuente