Чи можете ви активувати / (вивести на фронт) 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)

Здається, перед тим, як підняти його, існує відсутність "активувати-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)))запустіть цю та вкладку alt на іншу програму. Повідомлення з’явиться в буфері, але emacs не піднімається ... Думки?
Лев Уфімцев

1
Я використовую версію emacs Gui? (не термінальна версія), чи використовували ви також gui?
Лев Уфімцев

Відповіді:


16

Якщо ви використовуєте віконну систему, ви можете використовувати її x-focus-frame.

Примітка:

  • x-focus-frame працює як для Windows, так і для Linux
  • до Emacs 23.1, використовуйте w32-focus-frameв Windows.

так, справді. (x-focus-frame nil) піднімає вікно emacs. Акуратно!
Лев Уфімцев

1

Або (x-focus-frame nil)чи (other-frame 0)буде робити це. Я не впевнений, чи є різниця в поведінці між ними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.