El emacsclient
programa permite una marca --no-wait
(abreviada como -n
) que hará que el servidor emacs visite el archivo especificado y regrese de inmediato.
emacsclient -n ~/.bashrc
Si proporciono un editor alternativo, esto seguirá funcionando en los casos en que no se esté ejecutando el servidor Emacs
emacsclient -n -a "/usr/local/bin/emacs" ~/.bashrc
Sin embargo, esto me da un comportamiento inconsistente porque en los casos en que el servidor se está ejecutando, esta llamada volverá de inmediato. En los casos en que no hay ningún servidor en ejecución y se utiliza el editor alternativo, la llamada se convierte en una llamada de bloqueo y no volverá hasta que salga de Emacs.
¿Hay alguna manera de decir emacs
(en lugar de emacsclient
) crear un nuevo marco y luego regresar?
emacsclient
server
nispio
fuente
fuente
-a ''
opción "iniciar el demonio Emacs y volver a intentar emacsclient"?-a ''
iniciará un demonio en lugar de un servidor. Luego intenta abrir un terminal Emacs, pero debido a que he proporcionado la-n
opción, no permanece abierto. Simplemente rebota de vuelta al caparazón.Respuestas:
Descripción
El comportamiento predeterminado al invocar emacsclient es un poco conservador. Mira este comentario de emacsclient.c :
Según su descripción y comentarios, parece que está intentando iniciar el servidor Emacs a pedido mientras también usa la
-n
bandera. El comentario "por ejemplo" aquí es por quéemacsclient -n -a '' FILE
no satisface lo que está buscando cuando no se está ejecutando ningún servidor.-a ''
lógica inicia un demonio.emacsclient
le dice que cree un nuevo marco de terminal, porque ese es el valor predeterminado a menos que esté evaluando elisp.-n
lógica mata inmediatamente ese nuevo marco de terminal.Si pudieras cambiar el Paso 2 para crear un nuevo marco gráfico por defecto, entonces
emacsclient -n -a '' FILE
harías lo que quieras.Solución Elisp
Puede hacer que Emacs cree un nuevo marco gráfico de forma predeterminada si aconseja la función de esta
server-process-filter
manera:Pon eso en tu archivo de inicio, entonces, como se dijo,
emacsclient -n -a '' FILE
y Bob es tu tío.Comparar con la solución Shell
Por un lado, puedo señalar algunas ventajas de usar este enfoque de desajuste en comparación con el uso del script sugerido por Archenoth
como el editor alternativo. Con el defadvice:
save-buffers-kill-terminal
(C-x C-c
por defecto) se comporta de manera consistente en todos los cuadros. Nunca mata el proceso de Emacs, porque cada marco es siempre un marco de cliente.find-grep
ese se envían a procesos externos se comportan mejor cuando la terminal tonta está allí. Al menos, experimento menos dolores de cabeza relacionados con escapar de la concha.Por otro lado ... sí.
Conclusión
Tal vez hay un compromiso? Esto es lo mejor que se me ocurrió. Lo configuras como tu $ EDITOR.
fuente
No estoy seguro de cómo hacerlo estrictamente dentro de Emacs, pero afortunadamente hay otras formas de obtener lo que usted describe.
Si no tiene algo
.emacs
para iniciar un servidor, siempre puede hacer un pequeño script que inicie Emacs con el archivo que desea editar e inicie el servidor bifurcado.Algo como:
Y luego pasa eso a
-a
.Sin embargo ...
Si tiene el servidor iniciado en su
.emacs
, realmente no necesita crear un script; tienes una opción un poco más concisa:El ampersand pondrá en segundo plano el proceso y le devolverá instantáneamente su caparazón, incluso cuando Emacs se inicie por primera vez.
Es posible que deba realizar
disown
el proceso si bash mata los trabajos al salir. Si ese es el caso, simplemente agregue undisown
al final:En Windows, el equivalente más cercano sería el "
start
" comando ...Entonces, al igual que la sugerencia de script anterior, es probable que tenga que crear un archivo por lotes que contenga algo como:
Y luego apunta el
-a
argumento.Eso debería ejecutar el archivo por lotes y regresar inmediatamente después de iniciar Emacs con el archivo apropiado.
fuente
&
fue lo primero que pensé en probar. Desafortunadamente, el siguiente texto se envía astderr
: y luego los bloques de terminales esperan a que finalice el proceso:emacsclient: can't find socket; have you started the server? To start the server in Emacs, type "M-x server-start".
supongo que lasemacsclient
bifurcaciones pasan a un segundo plano, pero luego invoca loemacs
que se abre en primer plano.emacs --eval '(server-start)' $* &
tal vez? De esa forma, el servidor se inicia, obtienes tu terminal yemacsclient
tiene un servidor al que puede conectarse.emacs
normalmente. Me doy cuenta de que la mayoría de las personas probablemente no tendrían esa configuración, así que esa es ahora la primera parte de la respuesta. Espero eso ayude..!