Emacs abre archivos en un nuevo marco cuando se abre con "open -a"

20

Quiero poder invocar Emacs desde la línea de comandos, y comenzar Emacs gráficos si no se está ejecutando o visitar un archivo en un Emacs que ya se está ejecutando. Intenté hacer esto con emacsclientlo que sé que es la forma "correcta" de hacerlo, pero tuve muchos problemas con él en OS X, se bloqueó al azar o el emacs --daemonproceso se bloqueó durante el apagado o reinicio de la máquina, y descamación general. Si bien me gustaría que eso funcione, en este momento en open -arealidad funciona mucho mejor, excepto por este problema que describiré a continuación:

Usando open -aasí:

$ open -a Emacs file.txt

iniciará Emacs si no se está ejecutando y visitará el archivo. Pero si hago esto cuando el búfer actual no es *scratch*el archivo se abre en un nuevo marco (es decir, una nueva ventana del sistema).

Aquí hay una sesión de ejemplo:

$ open -a Emacs file.txt

Esto inicia Emacs y abre file.txt, por lo que hay un solo marco con este búfer. Si cambio al *scratch*búfer y hago esto:

$ open -a Emacs file1.txt

Abre este archivo en el mismo marco. Ahora hay un solo marco con este archivo abierto, y si hago esto:

$ open -a Emacs file2.txt 

Abre un nuevo marco, lo que resulta en dos marcos abiertos a la vez.

Intenté jugar con args de línea de comandos para Emacs usando el --argsinterruptor a open, pero esto no parece funcionar para llamadas posteriores, por ejemplo:

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

Esto solo imprime "foo" en el búfer de mensajes ... la segunda vez que Emacs se pone en primer plano pero no se imprime ningún mensaje.

No estoy seguro de cómo se opencomunica con las aplicaciones que ya se están ejecutando, ¿alguien sabe cómo podría averiguarlo? ¿O hay alguna forma de obtener un registro mucho más detallado de lo que está sucediendo que el Messagesbúfer? No se imprime nada interesante en ese búfer durante la sesión anterior, así que no sé cómo podría hackear algunos Emacs Lisp para hacer lo que quiero ...

¡Gracias!

michiakig
fuente
No sé nada sobre OSX, así que no puedo proporcionar nada concreto. Sin embargo, si tuviera que depurar esto, arrojaría algún error de sintaxis find-filey luego lo establecería debug-on-erroren t y verificaría el seguimiento de la pila para obtener alguna pista sobre cómo se invoca Emacs. Agregar un error a find-filepodría ser tan simple como copiar la definición de la función al búfer scratch de lisp y agregarle una llamada error(p (error "cause stack trace"). Ej . NUNCA CAMBIE EL ARCHIVO DE FUENTES find-file- ¡siempre haga esto en un scratch bufer!
Joe Casadonte
@ Joe Gracias! Esa es una muy buena idea, lo tendré en cuenta para el futuro. De hecho, terminé tratando de usarlo emacsclientnuevamente, y comenzarlo con (server-start)mi init.elparece estar funcionando mejor que emacs --daemonen el arranque, que es lo que había intentado la primera vez que lo intenté emacsclient.
michiakig

Respuestas:

26

La respuesta está aquí: variable emacs para "abrir con" en el marco original

Es un cambio en la configuración predeterminada en las versiones más recientes de emacs. Añadir:

(setq ns-pop-up-frames nil)

al archivo .emacs.

Muy feliz de haber encontrado esto.

Colin
fuente
Esto fue muy útil! ¡Junto con un alias las open -a /Applications/Emacs.app $1cosas parecen funcionar bien! Tenga en cuenta que inicio el servidor en mi init, para tener emacs disponibles para git, por ejemplo.
Dror