Pouvez-vous activer / (mettre en avant) emacs en utilisant elisp natif? (par exemple lorsque vous travaillez dans un autre programme)

16

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
Leo Ufimtsev
la source
4
Essayez raise-frame.
Tom Tromey
Merci pour la suggestiong. l'abaissement du cadre fonctionne, mais le fait de le relever ne le ré-élève pas pour une raison quelconque?
Leo Ufimtsev
Je pense que @TomTromey est correct. Vous pouvez tester comme suit. Tout d' abord, créer une minuterie de veille: (defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame)))). Suspendez le cadre avec M-x (suspend-frame). Dans 5 secondes, cette image réapparaîtra.
Dan
Eh bien, cela fonctionne si vous (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?
Leo Ufimtsev
1
J'utilise la version Gui d'emacs? (pas la version du terminal), utilisiez-vous également l'interface graphique?
Leo Ufimtsev

Réponses:

16

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 Linux
  • avant Emacs 23.1, utilisez w32-focus-framesur Windows.
TaylanUB
la source
Oui en effet. (x-focus-frame nil) ouvre la fenêtre emacs. Soigné!
Leo Ufimtsev
1

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.

Brian Z
la source