Voglio forzare l'attivazione degli emacs, essere acquistati per frondare e "rubare" l'attenzione in determinate circostanze. Ad esempio quando finisco un org-Pomodoro o durante un importante promemoria dell'appuntamento.
Ora sto cercando un modo "nativo" per farlo, solo per ridurre le dipendenze esterne. (solo Linux è ok per me, multipiattaforma sarebbe meglio).
È tecnicamente possibile dall'interno di Emacs?
[modifica] Soluzione:
Se si utilizza la GUI, funziona bene:
(x-focus-frame nil)
[Per motivi storici ...] Ho provato:
Visibilità frame (non funziona)
(make-frame-visible)
E anche:
(make-frame-invisible)
(make-frame-visible)
Ma questi sembrano funzionare solo se Emacs è già attivato.
Frame raising (non funziona)
Abbassare il frame sembra nascondere effettivamente gli emacs.
(lower-frame)
Ma non alzare il frame da un timer. Cioè, non succede nulla.
(raise-frame)
Sembra che ci sia un 'activ-emacs' mancante prima di sollevarlo.
[NOTA sulla soluzione esterna]
Attualmente, come (soluzione alternativa / soluzione?) Uso un po 'di elisp:
(call-process "activateEmacs")
E il rispettivo script bash: (potrebbe essere necessario installare prima xdotool sul sistema)
#!/bin/sh
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))
. Sospendi il telaio con M-x (suspend-frame)
. In 5 secondi, quel riquadro riapparirà.
(suspend-frame)
e aspetti lì senza fare clic su un'altra finestra. Ma se sospendi il frame e vai a lavorare in un'altra applicazione, allora emacs non riappare. Almeno non sul mio sistema (fedora 21 con desktop Mate). Un semplice esempio è questo: : (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))
esegui questo e alt-tab su un'altra applicazione. Il messaggio apparirà nel buffer ma emacs non viene sollevato ... Pensieri?
raise-frame
.