40 Usar Emacs Como Servidor
Varios programas pueden invocar su elección de editor para modificar una parte concreta del texto. Por ejemplo, los programas de control de versiones invocan a un editor para introducir registros de control de versiones (ver 29.1 Control de Versiones), y la utilidad de correo de Unix invoca a un editor para introducir un mensaje a enviar. Por convención, su elección de editor se especifica mediante la variable de entorno EDITOR
. Si establece EDITOR
a emacs
, el editor Emacs será invocado, pero de una manera poco práctica, iniciando un nuevo proceso Emacs. Esto es inconveniente porque el nuevo proceso Emacs no comparte búferes, historial de comandos u otro tipo de información con ningún proceso Emacs existente.
Puede resolver este problema configurando Emacs como servidor de edición, de forma que «escuche» las peticiones de edición externas y actúe en consecuencia. Hay varias formas de iniciar un servidor Emacs:
Ejecute el comando
server-start
en un proceso Emacs existente: escriba Alt-xserver-start
(M-x server-start
), o ponga la expresión (server-start
) en su fichero init (vea 50.4. El Archivo de Inicialización de Emacs). El proceso Emacs existente es el servidor; cuando salga de Emacs, el servidor morirá con el proceso Emacs.Ejecute Emacs como demonio, usando una de las opciones de línea de comandos
--daemon
. Ver C.2 Opciones Iniciales. Cuando Emacs se inicia de esta forma, llama aserver-start
después de la inicialización y no abre un marco inicial. Entonces espera las peticiones de edición de los clientes.Ejecute el comando
emacsclient
con la opción de línea de comandos--alternate-editor=""
. Esto inicia un demonio Emacs sólo si no hay ningún demonio Emacs en ejecución.Si su sistema operativo utiliza systemd para gestionar el arranque, puede iniciar automáticamente Emacs en modo demonio cuando inicie sesión utilizando el archivo de unidad de proceso systemd suministrado. Para activarlo:
systemctl --user enable emacs(Si su Emacs se instaló en una ubicación no estándar, puede que tenga que copiar el archivo
emacs.service
a un directorio estándar como~/.config/systemd/user/
).Un proceso externo puede invocar al servidor Emacs cuando se produce un evento de conexión sobre un socket especificado y pasar el socket al nuevo proceso del servidor Emacs. Un ejemplo de esto es la funcionalidad de socket de
systemd
: el serviciosystemd
crea un socket y escucha conexiones en él; cuandoemacsclient
se conecta a él por primera vez,systemd
puede lanzar el servidor Emacs y pasarle el socket para que atienda las conexiones deemacsclient
. Una configuración para usar esta funcionalidad podría ser:
~/.config/systemd/user/emacs.socket:
[Socket] ListenStream=/path/to/.emacs.socket DirectoryMode=0700 [Install] WantedBy=sockets.target(El fichero
emacs.service
descrito anteriormente también debe estar instalado).La ruta
ListenStream
será la ruta en la que Emacs escucha las conexiones desdeemacsclient
; es un archivo de su elección.
Una vez iniciado un servidor Emacs, puedes usar un comando de shell llamado emacsclient
para conectar con el proceso Emacs y decirle que visite un archivo. A continuación, puede establecer la variable de entorno EDITOR
en emacsclient
, de modo que los programas externos utilicen el proceso Emacs existente para la edición. [23]
Puede ejecutar múltiples servidores Emacs en la misma máquina dando a cada uno un nombre de servidor único, usando la variable nombre-servidor. Por ejemplo, M-x set-variable RET
nombre-servidor RET
foo RET
establece el nombre del servidor a foo. El programa emacsclient
puede especificar un servidor por nombre, usando la opción -s
o -f
(ver 40.3 Opciones de emacsclient), dependiendo de si el servidor usa o no un socket TCP (ver 40.1 Servidor TCP Emacs).
Si quiere ejecutar múltiples demonios Emacs (vea C.2 Opciones Iniciales), puede dar a cada demonio su propio nombre de servidor de esta forma:
emacs --daemon=foo
Opcionalmente, el servidor Emacs puede detenerse automáticamente cuando se cumplen ciertas condiciones. Para hacer esto, llama a la función server-stop-automatically
en su archivo init (ver 50.4. El Archivo de Inicialización de Emacs), con uno de los siguientes argumentos:
Con el argumento
empty
, el servidor se detiene cuando ya no tiene clientes, ni búferes de visita de archivos sin guardar, ni procesos en ejecución.Con el argumento
delete-frame
, cuando se está cerrando la última trama de cliente, se pregunta si se debe guardar cada búfer de visita de archivo no guardado y si se puede detener cada proceso no finalizado, y en caso afirmativo, se detiene el servidor.Con el argumento
kill-terminal
, cuando se cierra la última trama de cliente conC-x C-c
(save-buffers-kill-terminal
), se pregunta si se debe guardar cada búfer visitante de fichero no guardado y si se puede detener cada proceso no finalizado, y en caso afirmativo, se detiene el servidor.
Si ha definido un servidor con un nombre de servidor único, es posible conectarse al servidor desde otra instancia de Emacs y evaluar expresiones Lisp en él, usando la función server-eval-at
. Por ejemplo, (server-eval-at
foo '(+ 1 2)
) evalúa la expresión (+ 1 2)
en el servidor foo, y devuelve 3
. (Si no hay ningún servidor con ese nombre, se indica un error.) Actualmente, esta función es útil sobre todo para desarrolladores.
Si el entorno de escritorio de su sistema operativo es compatible con freedesktop.org (que es el caso de la mayoría de GNU/Linux y otras GUIs recientes tipo Unix), puede usar la entrada de menú Emacs (Cliente)
para conectarse a un servidor Emacs con emacsclient
. El demonio se inicia si no se está ejecutando ya.
40.1 Servidor TCP Emacs
Un servidor Emacs normalmente escucha conexiones en un socket local de dominio Unix. Algunos sistemas operativos, como MS-Windows, no soportan sockets locales; en ese caso, el servidor usa sockets TCP en su lugar. En algunos casos es útil que el servidor escuche en un socket TCP incluso si soporta sockets locales, por ejemplo, si necesita contactar con el servidor Emacs desde una máquina remota. Puede establecer server-use-tcp
a no nil
para que Emacs escuche en un socket TCP en lugar de un socket local. Este es el valor por defecto si su sistema operativo no soporta sockets locales.
Si el servidor Emacs está configurado para usar TCP, escuchará por defecto en un puerto aleatorio de la interfaz localhost. Esto puede cambiarse a otra interfaz y/o a un puerto fijo usando las variables server-host
y server-port
.
Un socket TCP no está sujeto a los permisos del sistema de archivos. Para mantener cierto control sobre qué Usuarios pueden hablar con un servidor Emacs a través de sockets TCP, el programa emacsclient
debe enviar una clave de autorización al servidor. Esta clave es normalmente generada aleatoriamente por el servidor Emacs. Este es el modo de operación recomendado.
Si es necesario, puede establecer la clave de autorización a un valor estático estableciendo la variable server-auth-key
. La clave debe consistir en 64 caracteres ASCII imprimibles excepto el espacio (esto significa caracteres desde !
hasta ~
, o desde el código decimal 33 hasta el 126). Puede utilizar M-x server-generate-key
para obtener una clave aleatoria.
Cuando se inicia un servidor TCP Emacs, éste crea un fichero de servidor que contiene la información TCP que usará emacsclient
para conectarse al servidor. La variable server-auth-dir
especifica el directorio por defecto que contiene el archivo del servidor; por defecto, es ~/.emacs.d/server/
. En ausencia de un socket local con permisos de archivo, los permisos de este directorio determinan qué Usuarios pueden hacer que sus procesos emacsclient
hablen con el servidor Emacs. Si nombre-servidor es un nombre de fichero absoluto, este se creara donde especifique dicho nombre de archivo.
Para decirle a emacsclient
que se conecte al servidor sobre TCP con un fichero servidor específico, use la opción -f
o --server-file
, o establezca la variable de entorno EMACS_SERVER_FILE
(vea 40.3 Opciones de emacsclient). Si server-auth-dir
se establece a un valor no estándar, o si server-name
se establece a un nombre de archivo absoluto, emacsclient
necesita un nombre de archivo absoluto para el archivo del servidor, ya que el server-auth-dir
por defecto está codificado en emacsclient
para ser usado como el directorio para resolver nombres de archivo relativos.
40.2 Ejecutar emacsclient
La forma más sencilla de usar el programa emacsclient
es ejecutar el comando de shell emacsclient archivo
, donde archivo es un nombre de archivo. Esto se conecta a un servidor Emacs, y le dice a ese proceso Emacs que visite archivo en uno de sus marcos existentes, ya sea un marco gráfico, o uno en un terminal de texto (ver 22 Marcos y Pantallas Gráficas). Entonces puede seleccionar ese marco para empezar a editar.
Si no hay servidor Emacs, el programa emacsclient
se detiene con un mensaje de error ( puede evitar que esto ocurra usando la opción --alternate-editor=""
de emacsclient
, vea 40.3 Opciones de emacsclient). Si el proceso Emacs no tiene ningún marco existente, lo que puede ocurrir si se inició como demonio (ver 40 Usar Emacs Como Servidor) entonces Emacs abre un marco en el terminal en el que llamó a emacsclient
.
También puede forzar a emacsclient
a abrir un nuevo marco en una pantalla gráfica usando la opción -c
, o en una terminal de texto usando la opción -t
. Ver 40.3 Opciones de emacsclient.
Si está ejecutando en un único terminal de texto, puede cambiar entre el shell de emacsclient
y el servidor Emacs usando uno de dos métodos: (i) ejecuta el servidor Emacs y emacsclient
en diferentes terminales virtuales, y cambia al terminal virtual del servidor Emacs después de llamar a emacsclient
; o (ii) llama a emacsclient
desde dentro del propio servidor Emacs, usando el modo Shell (ver 39.2 Subshell Interactiva) o el modo Term (ver Modo Term); emacsclient
bloquea sólo el subshell bajo Emacs, y puede seguir usando Emacs para editar el archivo.
Cuando termine de editar el archivo en el servidor Emacs, escriba Ctrl-x # (C-x #
, server-edit
) en su buffer. Esto guarda el archivo y envía un mensaje de vuelta al programa emacsclient
, diciéndole que salga. Los programas que usan EDITOR
normalmente esperan a que el editor -en este caso emacsclient
- salga antes de hacer otra cosa.
Si desea abandonar la edición, utilice el comando M-x server-edit-abort
. Esto envía un mensaje de vuelta al programa emacsclient
, diciéndole que salga con un estado de salida anormal, y no guarda ningún búfer.
También puede llamar a emacsclient
con múltiples argumentos de nombre de archivo: emacsclient archivo1 archivo2 ...
le dice al servidor Emacs que visite archivo1, archivo2, y así sucesivamente. Emacs selecciona el búfer que visita archivo1, y entierra los otros búferes al final de la lista de búferes (ver 20 Uso de Varios Búferes). El programa emacsclient
sale una vez que todos los ficheros especificados han terminado (es decir, una vez que se haya tecleado Ctrl-x # (C-x #
) en cada búfer del servidor).
Terminar con un buffer del servidor también mata el buffer, a menos que ya existiera en la sesión de Emacs antes de que se pidiera al servidor que lo creara. Sin embargo, si establece server-kill-new-buffers
a nil
, entonces se usa un criterio diferente: terminar con un búfer del servidor lo mata si el nombre del fichero coincide con la expresión regular server-temp-file-regexp
. Esto se hace para distinguir ciertos archivos temporales.
Cada C-x #
comprueba si hay otras peticiones externas pendientes para editar varios archivos, y selecciona el siguiente archivo de este tipo. Puede cambiar a un buffer de servidor manualmente si lo desea; no tiene que llegar a él con C-x #
. Pero C-x #
es la forma de decirle a emacsclient
que ha terminado.
Si establece el valor de la variable server-window
a una ventana o a un marco, C-x #
siempre muestra el siguiente búfer del servidor en esa ventana o en ese marco.
Cuando emacsclient
se conecta, el servidor normalmente mostrará un mensaje que dice como salir del frame cliente. Si server-client-instructions
se establece a nil
, este kmensaje se inhibe.
40.3 Opciones de emacsclient
Puede pasar algunos argumentos opcionales al programa emacsclient
, como:
emacsclient -c +12 arhivo1 +4:3 arhivo2
Los argumentos +línea
o +línea:columna
especifican números de línea, o números de línea y columna, para el siguiente argumento de archivo. Se comportan como los argumentos de línea de comandos del propio Emacs. Ver C.4.1 Variables Generales.
Los otros argumentos opcionales reconocidos por emacsclient
se listan a continuación:
-a comando
--alternate-editor=comando
Especifica un comando shell a ejecutar si
emacsclient
falla al contactar con Emacs. Esto es útil cuando se ejecutaemacsclient
en un script. El comando puede incluir argumentos, que pueden ser entrecomillados «así». Actualmente, no es posible escapar las comillas.Como excepción especial, si comando es la cadena vacía, entonces emacsclient inicia Emacs en modo demonio (como
emacs --daemon
) y luego intenta conectarse de nuevo.La variable de entorno
ALTERNATE_EDITOR (EDITOR_ALTERNO)
tiene el mismo efecto que la opción-a
. Si ambas están presentes, la segunda tiene prioridad.
-c
--create-frame
Crea un nuevo marco gráfico cliente, en lugar de usar un marco Emacs existente. Ver más abajo el comportamiento especial de
C-x C-c
en un marco cliente. Si Emacs no puede crear un nuevo marco gráfico (por ejemplo, si no puede conectarse al servidor X), intenta crear un marco de cliente de terminal de texto, como si hubiera especificado la opción-t
en su lugar.En MS-Windows, una única sesión de Emacs no puede mostrar marcos tanto en terminales gráficos como de texto, ni en múltiples terminales de texto. Por lo tanto, si el servidor Emacs se está ejecutando en un terminal de texto, la opción
-c
, al igual que la opción-t
, crea un nuevo marco en el terminal de texto actual del servidor. Ver Cómo Arrancar Emacs en MS-Windows.Si omite un argumento de nombre de archivo al suministrar la opción
-c
, el nuevo marco muestra el buffer*scratch*
por defecto. Puede personalizar este comportamiento con la variableinitial-buffer-choice
(vea 6 Entrar en Emacs).
-r
--reuse-frame
Crea un nuevo marco gráfico de cliente si no existe, en caso contrario utiliza un marco Emacs existente.
-F alist
--frame-parameters=alist
Configura los parámetros de un marco gráfico recién creado (véase 22.11 Parámetros de Marco).
-d display
--display=pantalla
Indica a Emacs que abra los archivos dados en la pantalla X (suponiendo que haya más de una pantalla X disponible).
-e
--eval
Le dice a Emacs que evalúe algún código Emacs Lisp, en lugar de visitar algunos archivos. Cuando se da esta opción, los argumentos a
emacsclient
se interpretan como una lista de expresiones a evaluar, no como una lista de archivos a visitar.
-f servidor-arhivo
--server-file=servidor-arhivo
Especifica un archivo de servidor (ver 40.1 Servidor TCP Emacs) para conectarse a un servidor Emacs vía TCP. Alternativamente, puede establecer la variable de entorno
EMACS_SERVER_FILE
para que apunte al fichero del servidor. (La opción de la línea de comandos anula la variable de entorno).Un servidor Emacs normalmente usa un socket local para escuchar conexiones, pero también soporta conexiones sobre TCP. Para conectarse a un servidor Emacs TCP,
emacsclient
necesita leer un archivo de servidor que contenga los detalles de conexión del servidor Emacs. El nombre de este fichero se especifica con esta opción, bien como un nombre de archivo relativo a~/.emacs.d/servidor
o como un nombre de archivo absoluto. Véase 40.1 Servidor TCP Emacs.
-n
--no-wait
Deja que
emacsclient
salga inmediatamente, en lugar de esperar hasta que todos los búferes del servidor hayan terminado. Puede tomarse todo el tiempo que quiera para editar los búferes del servidor dentro de Emacs, y no son matados cuando escriba Ctrl-x # (C-x #
) en ellos.
-w
--timeout=N
Espera una respuesta de Emacs durante N segundos antes de abandonar. Si no hay respuesta en ese tiempo,
emacsclient
mostrará una advertencia y saldrá. El valor por defecto es0
, que significa esperar indefinidamente.
--parent-id=id
Permite abrir un marco
emacsclient
como marco cliente en la ventana X padre con número de identificador id, a través del protocolo XEmbed. Actualmente, esta opción es útil principalmente para desarrolladores.
-q
--quiet
No permite que emacsclient muestre mensajes sobre la espera de Emacs o la conexión a sockets de servidores remotos.
-u
--suppress-output
No permite que
emacsclient
muestre los resultados devueltos por el servidor. Muy útil en combinación con-e
cuando la evaluación realizada es de efecto secundario en lugar de resultado.
-s nombre-servidor
--socket-name=nombre-servidor
Conecta con el servidor Emacs llamado nombre-servidor. (Esta opción no está soportada en MS-Windows.) El nombre del servidor viene dado por la variable nombre-servidor en el servidor Emacs. Si se omite esta opción, emacsclient se conecta al socket por defecto. Si establece nombre-servidor del servidor Emacs a un nombre de fichero absoluto, dé el mismo nombre de archivo absoluto que nombre-servidor a esta opción para indicar a emacsclient que se conecte a ese servidor. Necesita usar esta opción si inició Emacs como demonio (vea C.2 Opciones Iniciales) y especificó el nombre para el servidor iniciado por el demonio.
Alternativamente, puede establecer la variable de entorno
EMACS_SOCKET_NAME
para que apunte al socket del servidor. (La opción de línea de comandos anula la variable de entorno).
-t
--tty
-nw
Crea un nuevo marco de cliente en el terminal de texto actual, en lugar de utilizar un marco Emacs existente. Esto se comporta igual que la opción
-c
, descrita anteriormente, excepto que crea un marco de terminal de texto (ver 22.21 Terminales sin Ventana).En MS-Windows,
-t
se comporta igual que-c
si el servidor Emacs está usando la pantalla gráfica, pero si el servidor Emacs se está ejecutando en un terminal de texto, crea un nuevo marco en el terminal de texto actual.
-T tramp-prefix
--tramp-prefix=tramp-prefix
Establece el prefijo a añadir a los nombres de fichero para que Emacs localice ficheros en máquinas remotas (ver 19.5 Reversión Automática: Mantener los Búferes Actualizados Automáticamente) usando TRAMP (ver El Manual de Tramp). Esto es sobre todo útil en combinación con el uso del servidor Emacs sobre TCP (ver 40.1 Servidor TCP Emacs). Reenviando por ssh el puerto de escucha y haciendo que archivo-servidor esté disponible en una máquina remota, los programas en la máquina remota pueden usar emacsclient como valor para las variables de entorno EDITOR y similares, pero en lugar de hablar con un servidor Emacs en la máquina remota, los archivos serán visitados en la sesión Emacs local usando TRAMP.
Establecer la variable de entorno
EMACSCLIENT_TRAMP
tiene el mismo efecto que usar la opción-T
. Si se especifican ambas, la opción de la línea de comandos tiene preferencia.Por ejemplo, asume dos hosts,
local
yremoto
, y que el Emacs local escucha en el puerto tcp 12345. Supongamos además que/home
está en un sistema de ficheros compartido, de modo que el fichero del servidor~/.emacs.d/server/server
es legible en ambos hosts.local$ ssh -R12345:localhost:12345 remot0 remote$ export EDITOR="emacsclient \ --server-file=servidor \ --tramp=/ssh:remoto:" remote$ $EDITOR /tmp/foo.txt #Debería abrirse en emacs local.
Los nuevos marcos de terminal gráficos o de texto creados por las opciones -c
o -t
se consideran marcos de cliente. Cualquier nuevo marco que cree a partir de un marco de cliente también se considera un marco de cliente. Si escribe Ctrl-x Ctrl-c (C-x C-c
, save-buffers-kill-terminal
) en un marco de cliente, ese comando no mata la sesión de Emacs como hace normalmente (ver 7 Cómo Salir de Emacs). En su lugar, Emacs borra el marco del cliente; además, si el marco del cliente tiene un emacsclient
esperando para recuperar el control (es decir, si no proporcionó la opción -n
), Emacs borra todos los demás marcos del mismo cliente, y marca los buffers del servidor del cliente como terminados, como si hubiera tecleado Ctrl-x # (C-x #
) en todos ellos. Si resulta que no quedan marcos después de borrar el marco o marcos del cliente, la sesión de Emacs finaliza.
Como excepción, cuando Emacs se inicia como demonio, todos los marcos se consideran marcos cliente, y C-x C-c
nunca mata Emacs. Para matar un demonio de sesión, teclee Alt-x kill-emacs
(M-x kill-emacs
).
Tenga en cuenta que las opciones -t
y -n
son contradictorias: -t
dice que tome el control del terminal de texto actual para crear una nueva trama cliente, mientras que -n
dice que no tome el control del terminal de texto. Si proporciona ambas opciones, Emacs visita los archivos especificados en un marco existente en lugar de un nuevo marco de cliente, anulando el efecto de -t
.