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.