假设我shell-command
从emacs
例如打电话(shell-command "evince")
。是否可以将evince
以此方式启动的应用程序(在本示例中)自动移动5
到xmonad
.
答案1
答案2
纯 xmonad 配置可以实现这一点。在你的程序中,.xmonad/xmonad.hs
你需要为此设置一个manageHook。我故意加入了不止一条“规则”。
theManageHook = composeAll [
-- send applications to the right workspace
className =? "Evince" --> doShift "5",
className =? "Pidgin" --> doShift "4"
--- more settings ...
]
main = do
xmonad $ gnomeConfig {
manageHook = theManageHook <+> manageHook gnomeConfig
}
xprop
您可以通过单击所需的窗口来查看给定窗口的类名称。 className 指的是 xprop 输出中的第二个条目。如果您只想要一些 xproperties,xprop
请接受它们作为参数:
~ $ xprop WM_CLASS WM_NAME
WM_CLASS(STRING) = "evince", "Evince"
WM_NAME(STRING) = "Document Viewer"
更多相关内容可以在Xmonad 常见问题解答。
答案3
这是一种方法,用于xdotool
更改窗口的类,然后您可以5
使用XMonad
或 Devil's pie 将其移动到桌面。
#!/bin/sh
$1 &
NEW_WINDOW_PID=$!
WINDOW_EXISTENCE=$(xdotool search --pid ${NEW_WINDOW_PID} 2> /dev/null) #is empty if the window hasn't finished opening.
COUNTER=0
while [[ -z $WINDOW_EXISTENCE && $COUNTER < 6 ]] #waits for the window to open
do
WINDOW_EXISTENCE=$(xdotool search --pid ${NEW_WINDOW_PID} 2> /dev/null)
sleep 1
(( COUNTER++ ))
done
if [ $COUNTER != "6" ]; then
NEW_WINDOW_ID=$(xdotool search --onlyvisible --pid ${NEW_WINDOW_PID}) #finds the window that was just opened
xdotool set_window --class yay ${NEW_WINDOW_ID}; #change the class of the window to yay
fi
然后在emacs中写一个函数
(defun window-in-desktop-5 (cmd)
"start shell command on desktop 5"
(interactive "sshell-command: ")
(shell-command (concat "/path/to/xdotoolscript " cmd)))
每当您通过 emacs 函数调用程序时,只要窗口的 PID 与调用它的函数相同,它就会更改窗口的类名,否则脚本将在六秒后超时。