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.
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 0
sul mio sistema.