Come ottimizzare il mio script, uno script per aprire una nuova istanza di emacs solo se non è presente alcuna istanza

1

Uso emacs e ho scritto uno script che è metà in bash e metà in AppleScript per fare quanto segue (prima scrivo il codice e poi lo pseudocodice). Supponiamo che un demone emacs sia in esecuzione.

pseudocodice:

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)

codice per "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

codice per "emacsWindowsCount.scpt" (usato nello script precedente, ho compilato il codice con osacompile per le prestazioni)

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    

Ho mappato switchToEmacs.sh a un collegamento usando Alfred 3 e fa quello che mi aspetto che faccia, ma è lento! Non estremamente lento ma l'interruttore non è immediato e devo aspettare circa 0,3 secondi. Al contrario, se ho una finestra di emacs aperta e scrivo "emacs" sotto i riflettori, la transizione è immediata, quindi vorrei rimuovere quell'attesa inutile.

Dato che odio quel tempo di attesa (sembra molto breve ma quando devi navigare tra le varie applicazioni diventa imbarazzante) per ora sto facendo quanto segue: Ho rimosso il demone emacs, ogni volta che accedo avvio emacs.app, quando ho bisogno di chiudere l'app emacs non uso CMD + Q ma CMD + H, quando ho bisogno di richiamare emacs lancer semplicemente emacs. app (tramite una scorciatoia di Alfred 3), così ottengo il focus su emacs. Con questa soluzione alternativa, la transizione a emacs è immediata, ma preferirei il mio script per due motivi: primo, con lo script in modo da poter usare emacs dal terminale prima di lanciare un'istanza di emacs aprendo emacs.app, ma il vero motivo è che usando questo metodo se digito "emacsclient -t myFile" nel terminale e poi chiudo il buffer che ritorna al terminale, quindi le finestre emacs (emacs.app) otterranno il focus, anche se non l'ho dato a questo. Questo è davvero imbarazzante.

MODIFICA IMPORTANTE: Ho notato che l'apertura di una nuova istanza è immediata, ciò che richiede tempo è aperto: Emacs. Ho provato a sostituirlo con tell application "Emacs" to activate window 1 (compilato) ma è ancora lento. Qualche idea?

EDIT: Ho raggiunto prestazioni perfette utilizzando questo strumento gratuito link Ora c'è ancora un piccolo ritardo ma è dovuto al resto del codice.

    
posta Nisba 12.07.2017 - 15:33
fonte

2 risposte

3

Di solito eseguo solo

emacsclient -a emacs FILE

o

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

e lascia che emacsclient calcoli il resto.

    
risposta data 12.07.2017 - 17:16
fonte
-1

È lo script di osa che sta prendendo il tempo?

Uso un approccio simile a te, ma eseguo tutto il processo in bash. Ecco la funzione di bash che uso (in Linux, non sono vicino al mio Mac per verificare la portabilità al 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
}
    
risposta data 12.07.2017 - 15:51
fonte

Leggi altre domande sui tag