Quiero forzar la activación de emacs, ser comprado en fronde y 'robar' el foco en ciertas circunstancias. Por ejemplo, cuando termino un org-Pomodoro o durante un recordatorio de cita importante.
Ahora, estoy buscando una forma 'nativa' de hacerlo, solo para reducir las dependencias externas. (solo Linux está bien para mí, multiplataforma sería mejor).
¿Es esto técnicamente posible desde dentro de emacs?
[editar] Solución:
Si usa la GUI, esto funciona bien:
(x-focus-frame nil)
[Por razones históricas ...] He intentado:
Visibilidad del marco (no funciona)
(make-frame-visible)
Y también:
(make-frame-invisible)
(make-frame-visible)
Pero parece que solo funcionan si Emacs ya está activado.
Levantamiento de marco (no funciona)
Bajar el marco parece ocultar realmente emacs.
(lower-frame)
Pero elevar el marco desde un temporizador no lo hace. Es decir, no pasa nada.
(raise-frame)
Parece que falta un 'active-emacs' antes de subirlo.
[NOTA sobre la solución externa]
Actualmente, como (¿solución / solución?), Uso un poco de elisp:
(call-process "activateEmacs")
Y el script bash respectivo: (es posible que primero necesite instalar xdotool en su sistema)
#!/bin/sh
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))
. Suspender el marco con M-x (suspend-frame)
. En 5 segundos, ese cuadro volverá a aparecer.
(suspend-frame)
y espera allí sin hacer clic en otra ventana. Pero si suspende el marco y trabaja en otra aplicación, emacs no vuelve a aparecer. Al menos no en mi sistema (fedora 21 con escritorio Mate). Un ejemplo simple es este: : (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))
ejecute esto y alt-tab en otra aplicación. El mensaje aparecerá en el búfer, pero emacs no aparece ... ¿Pensamientos?
raise-frame
.