2009-10-02 15 views

Respuesta

9

Estás haciendo esto demasiado difícil. Desde la página de la emacsclient(1) hombre:

-a, --alternate-editor = Editor si el servidor de Emacs no se está ejecutando, ejecute el editor especificado en su lugar. Esto también se puede especificar mediante la variable de entorno `ALTERNATE_EDITOR '. Si el valor de EDITOR es la cadena vacía, entonces Emacs se inicia en modo demonio y emacsclient intentará conectarse a él.
+0

Si eso fue cierto alguna vez, ya no es así. – yPhil

+0

Primero, era cierto o no lo habría mencionado. En segundo lugar, todavía lo es. Con 'emacsclient --version' 25.3, el texto de ayuda dice: "-a EDITOR, --alternate-editor = EDITOR Editor al cual recurrir si el servidor no se está ejecutando. Si EDITOR es la cadena vacía, inicie Emacs en modo daemon e intente conectarse de nuevo." –

2

puedo pensar en un par de maneras, ninguno de ellos a toda prueba:

function emacs_server_is_running() 
{ 
    ps -ef | grep emacsserver | grep -v grep > /dev/null 
} 

function emacs_server_is_running() 
{ 
    netstat -a | grep esrv > /dev/null 
} 

O en lugar de configurar esto cuando se inicia el shell (después de todo, el servidor podría morir o el servidor podría comenzará después de que se haya conectado), por qué no hacer la comprobación en el tiempo que necesita para editar algo:

EDITOR=$HOME/emacs_try_client_first 
VISUAL=$HOME/emacs_try_client_first 

donde $HOME/emacs_try_client_first podría ser tan simple como

#!/bin/sh 
# emacs_try_client_first 
emacsclient [email protected] || emacs [email protected] 
+2

No tiene que hacer 'grep -v grep' - puede hacer que su primera imagen se vea así:' grep [e] macsserver' a menudo se hace cuando se almacena la salida de 'ps'. –

+0

@DW ¿Sabes? Todo el mundo siempre se queja de eso '| grep -v grep' idiom, pero ahora, finalmente, alguien ha hecho algo al respecto! – mob

4

Desde un script de shell, se podría hacer algo como esto:

emacsclient -ca false -e '(delete-frame)' 

Esto abrirá una nueva ventana de Emacs a continuación, cierre rápidamente, devolviendo true en caso de éxito. Si no existe ningún servidor emacs, el editor alternativo es/bin/false, que devuelve falso.

0

Aquí está mi configuración

#!/bin/sh 
emacsclient -s IRC -c $* || (emacs --daemon=IRC && emacsclient -s IRC -c --eval "rcirc" $*) 

Se conecta al servidor IRC y abre un bastidor; si el servidor está desactivado, lo inicia, ejecuta el código elisp y luego vuelve a intentarlo.

5

He leído las respuestas, pero nada de esto se ajustaba a mi caso de uso, donde no quería iniciar un servidor si no se ejecuta y también quería evitar el bloqueo para siempre.

En cuanto a la función server-force-stop en emacs, simplemente se borra el archivo del servidor, ya sea en server-auth-dir o server-socket-dir que en mi caso son /tmp/emacs1000/server o ~/.emacs.d/server.

Sabiendo esto, para probar si un servidor está funcionando simplemente podemos hacer:

test -e "/tmp/emacs1000/server" || test -e "~/.emacs.d/server"

+0

¡Exactamente lo que estaba buscando! –

+0

Esto funciona, pero depende (probablemente de forma segura) de esas variables ('server-auth-dir' o' server-socket-dir') que no se han cambiado de sus valores predeterminados. [la respuesta de ocodo] (https://stackoverflow.com/a/28561282/915044) (abajo) es en mi humilde opinión mejor, ya que encontrará los sockets abiertos independientemente de los valores establecidos por el usuario. – TomRoche

1

que tenían el mismo problema. Cuando ejecuto emacs, comprueba si ya hay un servidor. Si esta es la primera instancia de emacs, se inicia en modo servidor. Luego, cuando veo/edito un archivo, quiero conectarme al servidor. De esta forma, el archivo se abre muy rápidamente ya que no se inicia ninguna nueva instancia de emacs.La reutilización de los resultados de @mob anterior, se me ocurrió con la siguiente solución de trabajo:

(1) .emacs

tengo el siguiente fragmento de código en mi archivo .emacs:

;; start emacs-server if not running 
    (add-hook 'after-init-hook 
     (lambda() 
      (require 'server) 
      (unless (server-running-p) 
      (server-start)))) 

Si esta es la primera instancia de emacs, se inicia en modo servidor.

(2) Bashrc vim

######################### 
# START: Emacs settings # 
######################### 
export EDITOR=/home/jabba/Dropbox/home/jabba/bin/emacs_try_client_first 
export VIEWER=$EDITOR 

alias vi=$EDITOR 
alias e=vi # i.e., $EDITOR 
alias em=vi # same as above 

export TERM="xterm-256color" 
####################### 
# END: Emacs settings # 
####################### 

que he usado durante más de 15 años, así que cuando quiero editar un archivo, escribo automáticamente vi file. Como quiero cambiar a emacs, definí este alias :) Los comandos "vim" y "emacs" comienzan una nueva instancia. Usando los alias "vi", "e" y "em" puede conectarse a una instancia de emacs en ejecución (que es el servidor). Si no hay un servidor emacs en ejecución, se abrirá una nueva instancia (en modo servidor).

(3) emacs_try_client_first

#!/usr/bin/env bash 

function emacs_server_is_running() 
{ 
    ps ux | grep "\bemacs\b" | grep -v grep >/dev/null 
} 

if emacs_server_is_running; then 
    emacsclient -n "[email protected]" 2>/dev/null & 
else 
    emacs "[email protected]" 2>/dev/null & 
fi 

También funciona muy bien con Midnight Commander, donde F3 es vista, F4 es de edición. En MC, si desea usar emacs, vaya a Configuración y desactive la vista interna y la edición interna.

Editar: se ha agregado el macro after. Editar # 2: no era necesario después de todo.

0

mi solución está basada en la primera solución expuesta por Jabba, pero usando emacs --script, esto es útil para que yo tenga el estado del servidor emacs (ejecutándose o no) dentro de un script bash. Yo lo uso para múltiples servidores emacs, es por eso que tengo una variable para el nombre del servidor

server_ts="servername" 

tmp_file=`mktemp --tmpdir=/tmp emacs-manager.XXXXXX` 

echo ";; 
(require 'server) 
(progn (setq server-name \"$server_ts\")   
    (if  (server-running-p) 
      (princ \"1\") 
      (princ \"0\"))) 
" > $tmp_file 
isrunning=$(emacs --script $tmp_file 2>/dev/null) 
rm $tmp_file 
echo "is running: $isrunning" 

antes de hacer esto he intentado buscar los archivos de socket, y analizar el resultado del comando ps. El primero falla a veces cuando la computadora falla, los archivos de socket todavía están allí pero no hay proceso de emacs. Esto último no es fácil ya que el servidor de emacs se puede iniciar de varias formas.

1

Pruebe esto.

emacs_server_is_running(){ 
    lsof -c emacs | grep server | tr -s " " | cut -d' ' -f8 
} 
0

tenga oportunidad de redefinir el comando emacs añadiendo lo siguiente a ~/bin/emacs (que debe estar en su ruta):

#!/bin/sh 
# if emacsclient can't connect to the daemon, try to launch it first 
emacsclient -c "[email protected]" || (/usr/bin/emacs --daemon; emacsclient -c "[email protected]") 

Después de esto está en su lugar, uno puede simplemente escribir emacs a Inicie emacs, y un servidor se iniciará automáticamente si es necesario.

Cuestiones relacionadas