让 wmctrl 与多个 Emacs 窗口一起使用

让 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') 起作用。为什么必须@包括在内?

答案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.

另请查看: https://github.com/tkf/emacs-wmctrl

答案2

窗口标题的匹配不太可靠。例如,如果您在浏览器中查看此问题,则wmctrl -a 'emacs'可能会激活您的浏览器。

您可以使用以下命令自定义框架标题格式frame-title-format。我用(multiple-frames "%b" ("" invocation-name "@" system-name))。但我不建议在您的脚本中依赖于此。

您可以wmctrl使用选项按类别查找窗口-x。这既简单又可靠。

wmctrl -x -a Emacs

或者,您可以让 Emacs 完成这项工作。当存在多个活动帧时,这使您有更好的机会选择“最佳”帧。

相关内容