Cómo optimizar mi script, un script para abrir una nueva instancia de emacs solo si no hay una instancia presente

1

Uso emacs y he escrito un script que es mitad en bash y mitad en AppleScript para hacer lo siguiente (primero escribo el código y luego el pseudocódigo). Suponemos que se está ejecutando un demonio emacs.

pseudocódigo:

if (no emacs GUI process is active or a process is active but no window is present)
then 
    open a new emacs window using emacsclient 
    and 
    put that window in foreground
else
    open the app Emacs.app (so no new instance is created and we simply put 
                            the focus on the existing emacs window)

código para "switchToEmacs.sh"

#!/bin/bash
openedWindows=$(/usr/bin/osascript ~/emacsWindowsCount.scpt)
if [ $openedWindows -eq 0 ]; then
    /Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n -c -e  "(select-frame-set-input-focus (selected-frame))"
else
    open -a Emacs   
fi

código para "emacsWindowsCount.scpt" (utilizado en el script anterior, he compilado el código con osacompile para mejorar el rendimiento)

tell application "System Events"
    if exists (process "Emacs") then
    else
        return 0
    end if
    tell application "Emacs"
        set numberOfWindows to (count windows)
    end tell
    return numberOfWindows
end tell    

He asignado switchToEmacs.sh a un acceso directo con Alfred 3 y hace lo que espero que haga, ¡pero es lento! No extremadamente lento, pero el cambio no es inmediato y tengo que esperar unos 0,3 segundos. A la inversa, si tengo una ventana de emacs abierta y escribo "emacs" en el centro de atención, la transición es inmediata, por lo que me gustaría eliminar esa espera innecesaria.

Ya que odio ese tiempo de espera (parece muy corto, pero cuando necesitas navegar mucho por las aplicaciones se vuelve incómodo) por ahora estoy haciendo lo siguiente: He eliminado el emacs deamon, cada vez que inicio sesión, inicio emacs.app, cuando necesito cerrar la aplicación emacs, no uso CMD + Q, pero CMD + H, cuando necesito recuperar emacs, simplemente inicio emacs. aplicación (a través de un atajo de Alfred 3) para obtener emacs focus. Con esta solución, la transición a emacs es inmediata, pero preferiría mi script por dos motivos: primero, con el script para poder usar emacs desde el terminal antes de lanzar una instancia de emacs abriendo emacs.app, pero el motivo real es que este método si escribo "emacsclient -t myFile" en el terminal y luego cierro el búfer que regresa al terminal, entonces las ventanas de emacs (emacs.app) obtendrán el foco, incluso si no se lo he dado. Esto es realmente incómodo.

EDITAR IMPORTANTE: Me di cuenta de que abrir una nueva instancia es inmediato, lo que lleva tiempo está abierto, como Emacs. He intentado reemplazarlo con tell application "Emacs" to activate window 1 (compilado) pero aún es lento. ¿Alguna idea?

EDITAR: He logrado un rendimiento perfecto con esta herramienta gratuita enlace Ahora todavía hay un pequeño retraso, pero se debe al resto del código.

    
pregunta Nisba 12.07.2017 - 15:33

2 respuestas

3

Usualmente solo corro

emacsclient -a emacs FILE

o

emacsclient -a SHELL-SCRIPT-WHICH-STARTS-EMACS-WITH-PARAMETERS FILE

y deje que emacsclient resuelva el resto.

    
respondido por el nohillside 12.07.2017 - 17:16
-1

¿Es el script osa el que se toma el tiempo?

Utilizo un enfoque similar a ti, pero hago todo el procesamiento en bash. Esta es la función de bash que uso (en Linux, no estoy cerca de mi Mac para verificar la portabilidad en este momento):

ec ()
{
    running=$(pgrep -u $USER -c emacs)
    if [ $running -eq 0 ]; then
        emacs --geometry 85 --fullheight $* &
        return 0
    fi
    emacsclient --no-wait $*
    return 0
}
    
respondido por el woolfie 12.07.2017 - 15:51

Lea otras preguntas en las etiquetas