Come ottimizzare il mio script, uno script per l'apertura di 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). Partiamo dal presupposto che un demone emacs è 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" (utilizzato 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 su una scorciatoia 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 digito "emacs" sotto i riflettori, la transizione è immediata, quindi vorrei rimuovere quell'attesa non necessaria.

Dal momento che odio quel tempo di attesa (sembra molto breve ma quando è necessario navigare in molte applicazioni, diventa imbarazzante) per ora sto facendo quanto segue: ho rimosso il deamon di emacs, ogni volta che eseguo l'accesso avvio emacs.app , quando devo chiudere l'app emacs non uso CMD + Q ma CMD + H, quando devo richiamare emacs lancio semplicemente emacs.app (tramite un collegamento Alfred 3) in modo da ottenere la concentrazione di 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 aver lanciato un'istanza di emacs aprendo emacs.app, ma il vero motivo è che l'utilizzo di questo metodo se digito "emacsclient -t myFile" nel terminale e quindi chiudo il buffer tornando al terminale, le finestre di emacs (emacs.app) avranno lo stato attivo, anche se non gliel'ho dato. Questo è davvero imbarazzante.

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

EDIT: ho ottenuto prestazioni perfette usando questo strumento gratuito https://sabi.net/nriley/software/#appswitch Ora c'è ancora un po 'di ritardo ma è dovuto al resto del codice.


Ho studiato, l'apertura di una nuova istanza è immediata, ciò che richiede tempo è aperto - un Emacs, vedi la modifica
Nisba

Hai detto " ciò che richiede tempo è aperto - un Emacs " e sul mio sistema open -a Emacsè istantaneo. Il emacsWindowsCount.scpt è dove vedo il grande ritardo, se Emacs non è aperto ci vogliono dai 6 ai 7 secondi affinché ritorni 0sul mio sistema.
user3439894,

Quale app Emacs GUI stai usando? Dove l'hai acquisito?
user3439894,

@ user3439894 Ho scaricato questa versione emacsformacosx.com
Nisba

Risposte:


3

Di solito corro e basta

emacsclient -a emacs FILE

o

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

e lasciamo emacsclientcapire il resto.


@ user3439894 quindi SHELL-SCRIPT-WHICH-STARTS-EMACS-WITH-PARAMETERS può usare open -a Emacsper far rotolare le cose :-)
nohillside

-1

È lo script osa che richiede tempo?

Uso un approccio simile a te, ma eseguo tutte le elaborazioni in bash. Ecco la funzione 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
}

dà errore su pgrep, dopo proverò a modificarlo. Per il momento grazie
Nisba,

Ho installato pgrep con brew install proctoolsma il codice non funziona per me, continuo a provare
Nisba

@Nisba, pgrepfa già parte di macOS, è la versione BSD e tutto ciò di cui hai bisogno è pgrep Emacs, per la versione GUI, restituirla PID, se è in esecuzione.
user3439894,

Scusa, era solo il comando -c che non funzionava. Ho trovato una soluzione accettabile, vedi la modifica, ma se riesci a far funzionare il tuo codice su macOS, sarei felice.
Nisba,

1
@patrix La formattazione è un po 'incasinata (lo modificherò per correggerlo). È una singola e commerciale perché voglio eseguire emacs in background.
Woolfie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.