您可以使用本机elisp激活/(启用)emacs吗?(例如,在另一个程序中工作时)


16

我想强迫emacs激活,在某些情况下被收购,以“窃取”焦点。例如,当我完成org-Pomodoro或重要的约会提醒时。

现在,我正在寻找一种“本机”方式来这样做,只是为了减少外部依赖性。(只要Linux对我来说可以,跨平台会更好)。

从emacs内部技术上可行吗?

[编辑]解决方案:

如果使用GUI,则效果很好:

(x-focus-frame nil)

[出于历史原因...]我尝试过:

框架可见性(无效)

(make-frame-visible)

并且:

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

但是这些似乎仅在Emacs已被激活时才起作用。

框架抬起(无效)

降低帧似乎实际上隐藏了emacs。

(lower-frame)

但是,从定时器提高帧数却没有。即,什么都没有发生。

(raise-frame)

似乎在提高它之前缺少“ activate-emacs”。

[关于外部解决方案的注意事项]

当前,作为一种(解决方法/解决方案?),我使用了一些elisp:

(call-process "activateEmacs")

以及相应的bash脚本:(您可能需要先在系统上安装xdotool)

#!/bin/sh 
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate

4
尝试raise-frame
Tom Tromey 2015年

谢谢你的建议。降低框架的效果,但是出于某种原因升高框架不会重新升高吗?
Leo Ufimtsev'3

我相信@TomTromey是正确的。您可以进行如下测试。首先,创建一个空闲计时器:(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))。用悬挂框架M-x (suspend-frame)。5秒钟后,该帧将重新出现。

好吧,如果您在这里(suspend-frame)等待而无需单击另一个窗口,那么它将起作用。但是,如果您暂停框架并在另一个应用程序中工作,那么emacs不会重新出现。至少在我的系统上没有(带有Mate桌面的Fedora 21)。一个简单的例子是:: (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))在另一个应用程序上运行并运行alt-tab。该消息将显示在缓冲区中,但不会引发emacs ...有什么想法吗?
Leo Ufimtsev'3

1
我正在使用Gui版本的emacs吗?(不是终端版本),您是否也在使用gui?
Leo Ufimtsev

Answers:


16

如果您使用的是窗口系统,则可以使用x-focus-frame

注意:

  • x-focus-frame 适用于Windows和Linux
  • 在Emacs 23.1之前的版本,请w32-focus-frame在Windows上使用。

确实是的。(x-focus-frame nil)会引发emacs窗口。整齐!
Leo Ufimtsev 2015年

1

无论是(x-focus-frame nil)(other-frame 0)将做到这一点。我不确定两者之间的行为是否有差异。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.