ネイティブelispを使用してemacsをアクティブ化(前面に移動)できますか?(たとえば、別のプログラムで作業している場合)


16

特定の状況で、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

4
試してくださいraise-frame
トムトロミー

ご提案ありがとうございます。フレームを下げることはできますが、フレームを上げることは何らかの理由でそれを再上げしませんか?
レオUfimtsev

@TomTromeyは正しいと思います。次のようにテストできます。まず、アイドルタイマーを作成します(defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame))))。でフレームを一時停止しM-x (suspend-frame)ます。5秒後に、そのフレームが再表示されます。
ダン

まあ、それはあなた(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は発生しません...
レオUfimtsev

1
Guacバージョンのemacsを使用していますか?(端末バージョンではありません)、GUIも使用していましたか?
レオUfimtsev

回答:


16

Window Systemを使用している場合、を使用できる場合がありますx-focus-frame

注意:

  • x-focus-frame Linuxと同様にWindowsでも動作します
  • Emacs 23.1より前はw32-focus-frame、Windows で使用します。

はい、確かに。(x-focus-frame nil)emacsウィンドウを上げます。きちんとした!
レオウフィムツェフ

1

どちらか(x-focus-frame nil)またはそれ(other-frame 0)を行います。この2つの動作に違いがあるかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.