通过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
窗口移动到不同的工作区,它将不再可见。