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
raise-frame
.(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.(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?Odpowiedzi:
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 Linuxw32-focus-frame
w systemie Windows.źródło
Albo
(x-focus-frame nil)
czy(other-frame 0)
to zrobi. Nie jestem pewien, czy jest jakaś różnica w zachowaniu między nimi.źródło