Я хочу заставить emacs быть активированным, быть купленным на ветку и «красть» фокус при определенных обстоятельствах. Например, когда я заканчиваю орг-помодоро или во время важного напоминания о встрече.
Теперь я ищу «родной» способ сделать это, просто чтобы уменьшить внешние зависимости. (просто Linux мне подходит, кроссплатформенность была бы лучше).
Это технически возможно изнутри Emacs?
[править] Решение:
Если вы используете графический интерфейс, это работает хорошо:
(x-focus-frame nil)
[По историческим причинам ...] Я пытался:
Видимость кадра (не работает)
(make-frame-visible)
А также:
(make-frame-invisible)
(make-frame-visible)
Но, похоже, они работают, только если Emacs уже активирован.
Поднятие кадра (не работает)
Опускающаяся рамка, кажется, на самом деле скрывает emacs.
(lower-frame)
Но поднять кадр из таймера нет. Т.е. ничего не происходит.
(raise-frame)
Кажется, перед его поднятием пропущен «activ-emacs».
[ПРИМЕЧАНИЕ по внешнему решению]
В настоящее время в качестве (обходного пути / решения?) Я использую немного elisp:
(call-process "activateEmacs")
И соответствующий скрипт bash: (вам может понадобиться сначала установить xdotool в вашей системе)
#!/bin/sh
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))
. Приостановить раму с M-x (suspend-frame)
. Через 5 секунд этот кадр появится снова.
(suspend-frame)
и ждете там, не нажимая в другое окно. Но если вы приостановите работу фрейма и начнете работать в другом приложении, emacs больше не появится. По крайней мере, не в моей системе (Fedora 21 с рабочим столом Mate). Простой пример: : (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))
запустите this и alt-tab в другое приложение. Сообщение появится в буфере, но emacs не появится ... Мысли?
raise-frame
.