Czy możesz aktywować / (przenieść na przód) emacsa używając natywnego elisp? (np. podczas pracy w innym programie)

16

Chcę zmusić emacsa do aktywacji, kupienia go do frondowania i „kradzieży” skupienia w określonych okolicznościach. Np. Kiedy kończę orgę Pomodoro lub podczas ważnego przypomnienia o spotkaniu.

Teraz szukam „natywnego” sposobu, aby to zrobić, tylko w celu zmniejszenia zależności zewnętrznych. (tylko Linux jest dla mnie ok, lepiej byłoby korzystać z wielu platform).

Czy jest to technicznie możliwe od wewnątrz emacsa?

[edytuj] Rozwiązanie:

Jeśli używasz GUI, działa to dobrze:

(x-focus-frame nil)

[Z przyczyn historycznych ...] Próbowałem:

Widoczność ramki (nie działa)

(make-frame-visible)

I również:

(make-frame-invisible)
(make-frame-visible)

Ale wydaje się, że działają one tylko wtedy, gdy Emacs jest już aktywowany.

Podnoszenie ramek (nie działa)

Opuszczanie ramki wydaje się faktycznie ukrywać emacsa.

(lower-frame)

Ale podniesienie klatki od timera tak nie jest. Tj. Nic się nie dzieje.

(raise-frame)

Wygląda na to, że przed podniesieniem brakuje zaginięcia „aktywuj-emacsa”.

[UWAGA dotycząca rozwiązania zewnętrznego]

Obecnie jako (obejście / rozwiązanie?) Używam trochę elisp:

(call-process "activateEmacs")

I odpowiedni skrypt bash: (może być konieczne najpierw zainstalowanie xdotool w systemie)

#!/bin/sh 
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
Lew Ufimcew
źródło
4
Spróbować raise-frame.
Tom Tromey
Dziękuję za sugestię opuszczanie ramki działa, ale podnoszenie ramki nie podnosi jej z jakiegoś powodu?
Leo Ufimcew
Uważam, że @TomTromey ma rację. Możesz przetestować w następujący sposób. Najpierw utwórz bezczynności stoper: (defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame)))). Zawiesić ramkę za pomocą M-x (suspend-frame). Za 5 sekund ramka pojawi się ponownie.
Dan
Cóż, działa, jeśli (suspend-frame)i czekasz tam bez klikania w inne okno. Ale jeśli zawiesisz ramkę i przejdziesz do pracy w innej aplikacji, emacs nie pojawi się ponownie. Przynajmniej nie w moim systemie (fedora 21 z pulpitem Mate). Prosty przykład jest następujący: : (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))uruchom tę i Alt-Tab w innej aplikacji. Komunikat pojawi się w buforze, ale emacs nie zostanie podniesiony ... Myśli?
Leo Ufimcew
1
Korzystam z emacs w wersji GUI? (nie w wersji terminalowej), czy używałeś również GUI?
Leo Ufimcew

Odpowiedzi:

16

Jeśli korzystasz z systemu Windows, możesz być w stanie z niego korzystać x-focus-frame.

Uwaga:

  • x-focus-frame działa zarówno w systemie Windows, jak i Linux
  • przed Emacs 23.1, użyj w32-focus-framew systemie Windows.
TaylanUB
źródło
w rzeczy samej. (x-focus-frame zero) podnosi okno emacsa. Schludny!
Leo Ufimcew
1

Albo (x-focus-frame nil)czy (other-frame 0)to zrobi. Nie jestem pewien, czy jest jakaś różnica w zachowaniu między nimi.

Brian Z
źródło