我正在尝试编写一个将焦点切换到 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'
) 起作用。为什么必须@
包括在内?
答案1
如果你只是想切换焦点,为什么不使用 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
.
答案2
窗口标题的匹配不太可靠。例如,如果您在浏览器中查看此问题,则wmctrl -a 'emacs'
可能会激活您的浏览器。
您可以使用以下命令自定义框架标题格式frame-title-format
。我用(multiple-frames "%b" ("" invocation-name "@" system-name))
。但我不建议在您的脚本中依赖于此。
您可以wmctrl
使用选项按类别查找窗口-x
。这既简单又可靠。
wmctrl -x -a Emacs
或者,您可以让 Emacs 完成这项工作。当存在多个活动帧时,这使您有更好的机会选择“最佳”帧。