XMonad中spawnOnOnce执行顺序不一致问题求助
解决XMonad中spawnOnOnce执行顺序不稳定的问题
spawnOnOnce是异步调用系统命令的,操作系统的进程调度会导致两条命令的启动顺序不确定,进而影响窗口在Master/Stack布局中的位置。以下是几种可行的解决方案:
方案1:合并为单个Shell命令强制顺序执行
将两个启动命令合并到同一个shell命令中,利用shell的顺序执行特性确保第一个窗口先启动:
spawnOnOnce "0" "kitty -e vim ~/configuration.org & kitty"
&符号让第一个kitty在后台运行,shell会立即执行第二个kitty命令,保证触发顺序稳定。如果担心第一个窗口未完全创建就启动第二个,可添加短暂延迟:
spawnOnOnce "0" "kitty -e vim ~/configuration.org & sleep 0.2 && kitty"
方案2:在StartupHook中添加延迟
利用Haskell的threadDelay函数给第二个命令添加短暂延迟,确保第一个窗口完全创建后再启动第二个:
首先导入所需模块:
import Control.Concurrent (threadDelay)
修改startupHook:
startupHook = do spawnOnOnce "0" "kitty -e vim ~/configuration.org" threadDelay 300000 -- 延迟0.3秒(单位:微秒,1秒=10^6微秒) spawnOnOnce "0" "kitty"
- 可根据系统响应速度调整延迟时间,0.2-0.5秒区间均可尝试。
方案3:通过ManageHook强制窗口位置
不管启动顺序如何,给第二个kitty窗口标记唯一标识,然后在manageHook中强制它进入栈区(右侧):
- 修改spawn命令,给第二个kitty设置独特类名:
spawnOnOnce "0" "kitty -e vim ~/configuration.org" spawnOnOnce "0" "kitty --class 'secondary-kitty'"
- 在manageHook中添加匹配规则,调整窗口位置:
import qualified XMonad.StackSet as W manageHook = insertPosition End Newer <+> (className =? "secondary-kitty" --> doF W.swapDown) <+> defaultManageHook
W.swapDown会将主窗口位置的窗口切换到栈区,配合已有的insertPosition End Newer规则,该窗口最终会固定在右侧栈区。
内容的提问来源于stack exchange,提问作者Refael Sheinker
相关产品推荐
相关产品推荐

