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 emacsclient
lo 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 --daemon
proceso 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 -a
realidad funciona mucho mejor, excepto por este problema que describiré a continuación:
Usando open -a
así:
$ 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 --args
interruptor 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 open
comunica 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 Messages
bú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!
emacsclient
nuevamente, y comenzarlo con (server-start)
mi init.el
parece estar funcionando mejor que emacs --daemon
en el arranque, que es lo que había intentado la primera vez que lo intenté emacsclient
.
find-file
y luego lo estableceríadebug-on-error
en t y verificaría el seguimiento de la pila para obtener alguna pista sobre cómo se invoca Emacs. Agregar un error afind-file
podría ser tan simple como copiar la definición de la función al búfer scratch de lisp y agregarle una llamadaerror
(p(error "cause stack trace")
. Ej . NUNCA CAMBIE EL ARCHIVO DE FUENTESfind-file
- ¡siempre haga esto en un scratch bufer!