¿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

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.

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.