¿Se puede activar / (traer al frente) emacs usando elisp nativo? (por ejemplo, cuando trabaja en otro programa)

16

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
Leo Ufimtsev
fuente
44
Tratar raise-frame.
Tom Tromey
Gracias por la sugerencia. bajar el marco funciona, pero subir el marco no lo vuelve a subir por alguna razón?
Leo Ufimtsev
Creo que @TomTromey es correcto. Puede probar de la siguiente manera. En primer lugar, crear un temporizador de inactividad: (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.
Dan
Bueno, funciona si usted (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?
Leo Ufimtsev
1
Estoy usando la versión Gui de emacs? (no la versión del terminal), ¿estabas usando la interfaz gráfica de usuario también?
Leo Ufimtsev

Respuestas:

16

Si está utilizando un sistema de ventanas, es posible que pueda usarlo x-focus-frame.

Nota:

  • x-focus-frame funciona tanto para Windows como para Linux
  • antes de Emacs 23.1, use w32-focus-frameen Windows.
TaylanUB
fuente
si de hecho. (x-focus-frame nil) abre la ventana de emacs. ¡Ordenado!
Leo Ufimtsev
1

O lo haré (x-focus-frame nil)o (other-frame 0)lo haré. No estoy seguro de si hay alguna diferencia en el comportamiento entre los dos.

Brian Z
fuente