Можете ли вы активировать / (вывести на передний план) emacs, используя нативный elisp? (например, при работе в другой программе)

16

Я хочу заставить 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
Лев Уфимцев
источник
4
Попробуй raise-frame.
Том Тромей
Спасибо за предложениеg. Понижение рамки работает, но поднятие рамки по какой-то причине не поднимает ее?
Лев Уфимцев
Я считаю, что @TomTromey правильно. Вы можете проверить следующим образом. Во- первых, создать таймер простоя: (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 не появится ... Мысли?
Лев Уфимцев
1
Я использую версию Emacs для Gui? (не версия терминала), вы также использовали графический интерфейс?
Лев Уфимцев

Ответы:

16

Если вы используете оконную систему, вы можете использовать ее x-focus-frame.

Замечания:

  • x-focus-frame работает как для Windows, так и для Linux
  • до Emacs 23.1 используйте w32-focus-frameв Windows.
TaylanUB
источник
Да, в самом деле. (x-focus-frame nil) вызывает окно emacs. Ухоженная!
Лев Уфимцев
1

Либо (x-focus-frame nil)или (other-frame 0)сделаем это. Я не уверен, есть ли разница в поведении между ними.

Брайан З
источник