Bisakah Anda mengaktifkan / (membawa ke depan) emacs menggunakan elisp asli? (mis. ketika bekerja di program lain)

16

Saya ingin memaksa emacs untuk diaktifkan, dibeli untuk membuat dan 'mencuri' fokus dalam keadaan tertentu. Misalnya ketika saya menyelesaikan org-Pomodoro atau selama pengingat janji penting.

Sekarang, saya mencari cara 'asli' untuk melakukannya, hanya untuk mengurangi ketergantungan eksternal. (hanya Linux yang baik untuk saya, cross-platform akan lebih baik).

Apakah ini secara teknis memungkinkan dari dalam emacs?

[sunting] Solusi:

Jika menggunakan GUI, ini berfungsi dengan baik:

(x-focus-frame nil)

[Karena alasan historis ...] Saya telah mencoba:

Visibilitas bingkai (tidak berfungsi)

(make-frame-visible)

Dan juga:

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

Tetapi ini tampaknya hanya berfungsi jika Emacs sudah diaktifkan.

Peningkatan bingkai (tidak berfungsi)

Menurunkan bingkai tampaknya benar-benar menyembunyikan emacs.

(lower-frame)

Tetapi menaikkan frame dari timer tidak. Yaitu, tidak ada yang terjadi.

(raise-frame)

Sepertinya ada 'aktivasi-emacs' yang hilang sebelum menaikkannya.

[CATATAN tentang solusi eksternal]

Saat ini, sebagai (solusi / solusi?) Saya menggunakan sedikit elisp:

(call-process "activateEmacs")

Dan skrip bash masing-masing: (Anda mungkin perlu menginstal xdotool di sistem Anda terlebih dahulu)

#!/bin/sh 
sleep 0.5
xdotool search --onlyvisible --class emacs windowactivate
Leo Ufimtsev
sumber
4
Coba raise-frame.
Tom Tromey
Terima kasih atas sarannya. menurunkan frame berfungsi, tetapi menaikkan frame tidak menaikkannya kembali karena suatu alasan?
Leo Ufimtsev
Saya percaya @ TomTromey benar. Anda dapat menguji sebagai berikut. Pertama, membuat timer idle: (defvar my-timer (run-with-idle-timer 5 t (lambda () (raise-frame)))). Menangguhkan frame dengan M-x (suspend-frame). Dalam 5 detik, bingkai itu akan muncul kembali.
Dan
Ya, itu berfungsi jika Anda (suspend-frame)dan menunggu di sana tanpa mengklik ke jendela lain. Tetapi jika Anda menangguhkan frame dan mulai bekerja di aplikasi lain, maka emacs tidak muncul kembali. Setidaknya tidak pada sistem saya (fedora 21 dengan desktop Mate). Contoh sederhana adalah ini: : (run-at-time "5 sec" nil '(lambda () (interactive) (message "trying to raise frame") (raise-frame)))jalankan ini dan alt-tab ke aplikasi lain. Pesan akan muncul di buffer tetapi emacs tidak muncul ... Pikiran?
Leo Ufimtsev
1
Saya menggunakan versi Gui dari emacs? (bukan versi terminal), apakah Anda juga menggunakan gui?
Leo Ufimtsev

Jawaban:

16

Jika Anda menggunakan Window System, Anda mungkin dapat menggunakan x-focus-frame.

catatan:

  • x-focus-frame bekerja untuk Windows dan juga untuk Linux
  • sebelum Emacs 23.1, gunakan w32-focus-framedi Windows.
TaylanUB
sumber
ya memang. (x-focus-frame nil) memunculkan jendela emacs. Rapi!
Leo Ufimtsev
1

Entah (x-focus-frame nil)atau (other-frame 0)akan melakukannya. Saya tidak yakin apakah ada perbedaan perilaku di antara keduanya.

Brian Z
sumber