特定の状況で、emacsを強制的にアクティブにし、葉状体に購入させ、フォーカスを「盗む」ことを望みます。たとえば、組織-ポモドーロを終えたとき、または重要な予定のリマインダー中。
今、私は外部の依存関係を減らすために、そうするための「ネイティブ」な方法を探しています。(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
ご提案ありがとうございます。フレームを下げることはできますが、フレームを上げることは何らかの理由でそれを再上げしませんか?
—
レオUfimtsev
@TomTromeyは正しいと思います。次のようにテストできます。まず、アイドルタイマーを作成します
—
ダン
(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))
。でフレームを一時停止しM-x (suspend-frame)
ます。5秒後に、そのフレームが再表示されます。
まあ、それはあなた
—
レオUfimtsev
(suspend-frame)
と別のウィンドウをクリックせずにそこで待つ場合に機能します。ただし、フレームを中断して別のアプリケーションで作業を行った場合、emacsは再表示されません。少なくとも私のシステムにはありません(fedora 21 with Mate desktop)。簡単な例は次のとおり: (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))
です。これを実行し、別のアプリケーションでalt-tabを押します。メッセージはバッファに表示されますが、emacsは発生しません...
Guacバージョンのemacsを使用していますか?(端末バージョンではありません)、GUIも使用していましたか?
—
レオUfimtsev
raise-frame
。