Können Sie Emacs mit nativem Elisp aktivieren / (nach vorne bringen)? (zB wenn Sie in einem anderen Programm arbeiten)


16

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

4
Versuchen Sie es raise-frame.
Tom Tromey

Vielen Dank für den Vorschlag. Das Senken des Rahmens funktioniert, aber das Anheben des Rahmens hebt ihn aus irgendeinem Grund nicht erneut an?
Leo Ufimtsev

Ich glaube, @TomTromey ist richtig. Sie können wie folgt testen. Erstellen Sie zunächst einen Leerlaufzeitgeber: (defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame)))). Hängen Sie den Rahmen mit auf M-x (suspend-frame). In 5 Sekunden wird dieser Frame wieder angezeigt.
Dan

Nun, es funktioniert, wenn Sie dort (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?
Leo Ufimtsev

1
Ich benutze die Gui-Version von Emacs? (nicht die Terminalversion), haben Sie die GUI auch benutzt?
Leo Ufimtsev

Antworten:


16

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 Linux
  • Vor Emacs 23.1 w32-focus-frameunter Windows verwenden.

ja in der Tat. (x-focus-frame nil) öffnet das Emacs-Fenster. Ordentlich!
Leo Ufimtsev

1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.