Descripción
El comportamiento predeterminado al invocar emacsclient es un poco conservador. Mira este comentario de
emacsclient.c :
/* Unless we are certain we don't want to occupy the tty, send our
tty information to Emacs. For example, in daemon mode Emacs may
need to occupy this tty if no other frame is available. */
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.
- La
-a ''
lógica inicia un demonio.
- Luego
emacsclient
le dice que cree un nuevo marco de terminal, porque ese es el valor predeterminado a menos que esté evaluando elisp.
- La
-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:
(defadvice server-process-filter (before prefer-graphical activate)
;; STRING is a sequence of commands sent from emacsclient to the server.
(when (and
;; Check that we're editing a file, as opposed to evaluating elisp.
(string-match "-file" string)
;; Check that there are no frames beyond the Emacs daemon's terminal.
(daemonp)
(null (cdr (frame-list)))
(eq (selected-frame) terminal-frame)
;; Check that we have a graphical display.
;; `display-graphic-p' doesn't work here.
(getenv "DISPLAY"))
(setq string (concat
;; STRING must be all one line, but comes to us
;; newline-terminated. Strip off the trailing newline.
(replace-regexp-in-string "\n$" "" string)
;; Add the commands to create a graphical frame.
"-window-system "
"-display " (getenv "DISPLAY")
;; Add back the newline.
"\n"))))
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
#!/bin/bash
emacs --eval '(server-start)' $* &
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.
- El marco de la terminal del demonio se cuelga. Los comandos como
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í.
- Ese script de shell es maravillosamente simple.
- No es aconsejable el protocolo de comunicación de Emacs.
Conclusión
Tal vez hay un compromiso? Esto es lo mejor que se me ocurrió. Lo configuras como tu $ EDITOR.
#!/bin/sh
emacsclient -e "(frames-on-display-list \"${DISPLAY}\")" 1>/dev/null 2>/dev/null
if [ "$?" = "1" ]; then
emacsclient -c -n -a "" "$@"
else
emacsclient -n "$@"
fi
-a ''
opción "iniciar el demonio Emacs y volver a intentar emacsclient"?