Ich möchte Emacs zwingen, aktiviert zu werden, gekauft zu werden, um unter bestimmten Umständen den Fokus zu stehlen. ZB wenn ich eine Org-Pomodoro beende oder während einer wichtigen Terminerinnerung.
Jetzt suche ich nach einem "nativen" Weg, um externe Abhängigkeiten zu reduzieren. (Nur Linux ist in Ordnung für mich, Cross-Plattform wäre besser).
Ist das technisch aus Emacs heraus möglich?
[bearbeiten] Lösung:
Wenn Sie die GUI verwenden, funktioniert dies gut:
(x-focus-frame nil)
[Aus historischen Gründen ...] Ich habe versucht:
Rahmensichtbarkeit (funktioniert nicht)
(make-frame-visible)
Und auch:
(make-frame-invisible)
(make-frame-visible)
Diese scheinen aber nur zu funktionieren, wenn Emacs bereits aktiviert ist.
Frame Raise (funktioniert nicht)
Das Absenken des Rahmens scheint tatsächlich Emacs zu verbergen.
(lower-frame)
Das Erhöhen des Rahmens von einem Timer tut dies jedoch nicht. Dh nichts passiert.
(raise-frame)
Es scheint, dass ein Aktivierungs-Emac fehlt, bevor er ausgelöst wird.
[HINWEIS zur externen Lösung]
Momentan verwende ich als (Workaround / Lösung?) Ein bisschen elisp:
(call-process "activateEmacs")
Und das entsprechende Bash-Skript: (Möglicherweise müssen Sie zuerst xdotool auf Ihrem System installieren.)
#!/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))))
. Hängen Sie den Rahmen mit aufM-x (suspend-frame)
. In 5 Sekunden wird dieser Frame wieder angezeigt.(suspend-frame)
warten, ohne in ein anderes Fenster zu klicken. Wenn Sie den Frame jedoch anhalten und in einer anderen Anwendung arbeiten, wird der Emacs nicht wieder angezeigt. Zumindest nicht auf meinem System (Fedora 21 mit Mate-Desktop). Ein einfaches Beispiel hierfür ist:: (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))
Führen Sie this und alt-tab in einer anderen Anwendung aus. Die Nachricht wird im Puffer angezeigt, aber der Emacs wird nicht ausgelöst ... Gedanken?Antworten:
Wenn Sie ein Windows-System verwenden, können Sie möglicherweise verwenden
x-focus-frame
.Hinweis:
x-focus-frame
funktioniert sowohl für Windows als auch für Linuxw32-focus-frame
unter Windows verwenden.quelle
Entweder
(x-focus-frame nil)
oder(other-frame 0)
wird es tun. Ich bin mir nicht sicher, ob es einen Unterschied im Verhalten zwischen den beiden gibt.quelle