pages/sphinx/emacs29/doc/build/CapConSecciones/40_EmacsComoServ.html

35 KiB
Raw Blame History

<html class="writer-html5" lang="es" data-content_root="../"> <head> </head>
GNU/Emacs 29.1
Traducción Revisón: 1.70
GNU/Emacs 29.1

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 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 M-x server-start, o ponga la expresión (server-start) en su fichero init (vea El fichero 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 Opciones Iniciales. Cuando Emacs se inicia de esta forma, llama a server-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 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 servicio systemd crea un socket y escucha conexiones en él; cuando emacsclient se conecta a él por primera vez, systemd puede lanzar el servidor Emacs y pasarle el socket para que atienda las conexiones de emacsclient. 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 desde emacsclient; 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 Opciones de emacsclient), dependiendo de si el servidor usa o no un socket TCP (ver Servidor TCP Emacs).

Si quiere ejecutar múltiples demonios Emacs (vea 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 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 con C-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.

  1. Algunos programas utilizan una variable de entorno diferente; por ejemplo, para que TeX utilice “emacsclient”, establezca la variable de entorno TEXEDIT en “emacsclient +%d %s”.

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 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 Marcos y Pantallas Gráficas). Entonces puedes 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 Opciones de emacsclient). Si el proceso Emacs no tiene ningún marco existente-lo que puede ocurrir si se inició como demonio (ver Usando 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 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 Subshell Interactivo) 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 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 Usando Búferes Múltiples). El programa emacsclient sale una vez que todos los ficheros especificados han terminado (es decir, una vez que se haya tecleado 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 mensaje 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 Argumentos de Acción.

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 ejecuta emacsclient 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 variable initial-buffer-choice (vea Entrando 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 Parámetros del 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 Servidor Emacs TCP) 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 fichero 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 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 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 es “0”, que significa esperar indefinidamente.

parent-id=id

Permite abrir un marco emacsclient como marco cliente en la ventana X padre con id 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 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 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 Ficheros remotos) usando TRAMP (ver El Manual de Tramp en El Manual de Tramp). Esto es sobre todo útil en combinación con el uso del servidor Emacs sobre TCP (ver Servidor Emacs TCP). 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” y “remoto”, 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 crees a partir de un marco de cliente también se considera un marco de cliente. Si escribe 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 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 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 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”.


© Derechos de autor 2023, Tano.

Compilado con Sphinx usando un tema proporcionado por Read the Docs.
</html>