如何唯一标识不同的 GVim 实例?

如何唯一标识不同的 GVim 实例?

通过gnome-terminal,我可以使用--role命令行参数使新的终端窗口能够被窗口管理器或其他应用程序唯一识别,例如:

gnome-terminal --role=irc

这会将 X 窗口角色设置为“irc”,如下所示xprop

WM_WINDOW_ROLE(STRING) = "foo"

有没有办法用 GVim 做同样的事情?我已经梳理gvim --help并谷歌搜索无济于事。

答案1

您可以使用xdotool设置窗口的WM_WINDOW_ROLE属性:

$ xdotool set_window --role <ROLE_STRING> <WINDOW_ID>

您可以WINDOW_ID通过以下方式查找PID

$ xdotool search --onlyvisible --pid <PID>

xdotool 2.x请注意,使用此方法时会打印一条无害的错误消息:

$ xdotool search --onlyvisible --pid 16076
Can't consume 1 args; are only 0 available. This is a bug.
23068675

您可以使用xdotool 3.x摆脱这个错误。

话虽如此,人们可以创建一个自定义包装器来启动一个gvim实例,等待一个窗口显示并在其上设置一个新的角色字符串。它可能看起来像这样:

#!/bin/sh

role="$1"
shift

gvim --nofork "$@" &
pid="$!"
window_id=

while true; do
    window_id=$(xdotool search --onlyvisible --pid "$pid" 2>&1 | tail -1)
    case $window_id in
    ''|*[!0-9]*) continue ;;
    *) break ;;
    esac
done

xdotool set_window --role "$role" "$window_id"

用法:

$ ./gvim.sh FANTASTIC-NEW-ROLE <FILENAME> <OTHER-GVIM-PARAMS> <...>

这行:

window_id=$(xdotool search --onlyvisible --pid "$pid" 2>&1 | tail -1)

xdotool 2.x与和都能很好地配合3.x。从启动gvim进程到显示窗口需要一些时间,因此像这里这样的 while 循环或是sleep()必要的。--nofork需要选项才能获取gvim实例 PID。检查变量是否包含复制自的数字的便携式方法这个答案

如果您已经在新创建的窗口上使用某种挂钩,例如魔鬼间谍该代码可能不适合您。xdotool必须与 with 一起使用,--onlyvisible因为 的新实例gvim将创建 2 个窗口,但只有一个可见。devilspie例如,如果将gvim窗口移动到不同的工作区,它将不再可见。

相关内容