Je veux forcer les emacs à être activés, achetés à frond et à "voler" la concentration dans certaines circonstances. Par exemple, lorsque je termine un org-Pomodoro ou lors d'un rappel de rendez-vous important.
Maintenant, je cherche une façon «native» de le faire, juste pour réduire les dépendances externes. (juste Linux est ok pour moi, multiplateforme serait mieux).
Est-ce techniquement possible depuis emacs?
[modifier] Solution:
Si vous utilisez l'interface graphique, cela fonctionne bien:
(x-focus-frame nil)
[Pour des raisons historiques ...] J'ai essayé:
Visibilité du cadre (ne fonctionne pas)
(make-frame-visible)
Et aussi:
(make-frame-invisible)
(make-frame-visible)
Mais ceux-ci ne semblent fonctionner que si Emacs est déjà activé.
Relevage de cadre (ne fonctionne pas)
L'abaissement du cadre semble masquer les emacs.
(lower-frame)
Mais relever le cadre d'une minuterie ne le fait pas. C'est à dire, rien ne se passe.
(raise-frame)
Il semble qu'il manque un "activate-emacs" avant de le relever.
[NOTE sur la solution externe]
Actuellement, en tant que (solution / solution?) J'utilise un peu d'élisp:
(call-process "activateEmacs")
Et le script bash respectif: (vous devrez peut-être d'abord installer xdotool sur votre système)
#!/bin/sh
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
raise-frame
.(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))
. Suspendez le cadre avecM-x (suspend-frame)
. Dans 5 secondes, cette image réapparaîtra.(suspend-frame)
attendez sans cliquer dans une autre fenêtre. Mais si vous suspendez le cadre et travaillez dans une autre application, alors emacs ne réapparaît pas. Du moins pas sur mon système (fedora 21 avec bureau Mate). Un exemple simple est le suivant:: (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))
exécutez ceci et alt-tab sur une autre application. Le message apparaîtra dans le tampon mais emacs ne se lève pas ... Réflexions?Réponses:
Si vous utilisez un système de fenêtres, vous pourrez peut-être l'utiliser
x-focus-frame
.Remarque:
x-focus-frame
fonctionne pour Windows ainsi que pour Linuxw32-focus-frame
sur Windows.la source
Soit
(x-focus-frame nil)
ou le(other-frame 0)
fera. Je ne sais pas s'il y a une différence de comportement entre les deux.la source