讓 wmctrl 與多個 Emacs 視窗一起工作
我正在嘗試編寫一個將焦點切換到 Emacs 的腳本。這就是我所擁有的:
#!/bin/bash wmctrl -a 'emacs@pat-ubuntu-desktop'
當只打開一個 Emacs 視窗(或 Emacs 術語中的“框架”)打開時,它可以正常工作,但是當打開多個 Emacs 視窗時,它不會做任何事情。問題似乎是打開第二個視窗時視窗標題會發生變化。當打開一個視窗時,它的名稱是
emacs@pat-ubuntu-desktop
:➜ ~ wmctrl -l 0x05c000a3 0 pat-ubuntu-desktop emacs@pat-ubuntu-desktop
但是當我打開第二個視窗時,視窗標題會發生變化:
➜ ~ wmctrl -l 0x05c000a3 0 pat-ubuntu-desktop *scratch* 0x05c00921 0 pat-ubuntu-desktop *scratch*
編輯:以下問題是虛幻的,因為我的網路瀏覽器的標題中有“emacs”(因為我正在搜尋有關我的第一個問題的資訊)。
另一個問題(可能相關,也可能不相關)是,即使只打開一個 Emacs 視窗,該命令
wmctrl -a 'emacs'
也不起作用,但wmctrl -a 'emacs@'
(或wmctrl -a 'emacs@pat-ubuntu-desktop'
)起作用。為什麼必須@
包括在內?
視窗標題的匹配不是很可靠。例如,如果您在瀏覽器中查看此問題,則
wmctrl -a 'emacs'
可能會啟動您的瀏覽器。您可以使用 自定義框架標題格式
frame-title-format
。我用(multiple-frames "%b" ("" invocation-name "@" system-name))
. 但我不建議在你的腳本中依賴它。您可以使用選項告訴
wmctrl
按類查找視窗-x
。這既簡單又可靠。wmctrl -x -a Emacs
或者,您可以讓 Emacs 完成這項工作。當有多個活動幀時,這使您有更好的機會選擇“最佳”幀。
如果你只是想切換焦點,為什麼不使用 emacsclient 呢?
emacsclient --eval '(select-frame-set-input-focus (selected-frame))'
如果你想同時打開一個文件,你甚至可以使用
emacsclient -n FILE
如果您出於其他原因需要使用 wmctrl,我想您可以通過 emacsclient 獲取
(emacs-pid)
、(frame-parameter frame 'display)
、(frame-parameter frame 'window-id)
等,然後將它們提供給wmctrl
.