我非常喜欢 xmonad,但有一件事会很棒:
如果我通过 gvim -p --remote-tab-silent my-file
打开一个文件,并且它在始终位于 workspace 1
上的 vim 中打开,我想要自动切换到工作区 1
。
我刚刚发现了viewShift
-trick ,但这只会在生成新的 gvim
时更改工作区,因此部分解决了我的问题。
编辑:
感谢 Daniel Wagner 的评论,我得以进行一些研究:
我发现了一个小程序来设置和取消设置紧急提示:seturgency 。通过 xwininifo 我可以获得 gvim 的窗口 id。经过一番尝试和错误后,我 xprop
告诉我提示标志实际上已设置。
GVIMWINID=`xwininfo -tree -root | grep GVIM | cut -d ' ' -f6`
seturgent $GVIMWINID 1
xprop -id $GVIMWINID | grep urgency
现在我添加了
import XMonad.Hooks.UrgencyHook
..
myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
[..
, ((mod4Mask , xK_x ), focusUrgent)
..]
..
main = do¬
xmproc <- spawnPipe "/usr/bin/xmobar"¬
xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig {..}
给我的.xmonad.hs
,并且 xmonad --recompile && xmonad --restart
没有错误,但没有点击 mod4 + x
没有任何反应,尽管 xprop
确实报告了紧急情况提示已设置。
最佳答案
感谢 Daniel Wagner 和 Joachim Breitner 的评论,我可以解决这个问题,至少部分解决。
如果 gvim 未打开,则自动切换到 gvim,但只需添加到 `myManageHooks
myManageHook = composeAll [.., className =? "Gvim"--> viewShift "^ vim",..]
如果 gvim 已经打开,情况就有点棘手了,我编写了一个 shell 脚本来获取 gvim 的窗口 id 并查看是否传递了参数。
#! /usr/bin/zsh GVIMWINID=`xwininfo -tree -root |grep GVIM | cut -d ' ' -f6` if [[ -n $GVIMWINID ]]; then #echo gvim is running #echo $GVIMWINID if [[ -n $@ ]]; then #echo there are args gvim -p --remote-tab-silent $@ else #echo no args gvim --remote-send ":tabnew<cr>" fi else #echo gvim is not yet running #echo $GVIMWINID gvim -p $@ fi seturgent $GVIMWINID 1
现在,如果我生成一个新的 gv,窗口就会设置紧急提示,我可以切换到它。
但我想自动切换到窗口 - 所以至少如果我通过键盘生成 gvim 我想自动切换。所以我添加到 xmonad.hs
myKeys
myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
[.., ((mod4Mask, xK_F1),
spawn "gv" >>
spawn "notify-send -t 500 -i /usr/share/pixmaps/vim-32.xpm gVim" >>
focusUrgent),..]
其中 spawn“notify-send ..”
行充当时间缓冲区,因为生成+设置紧急提示似乎需要一些时间,并且 focusUrgent
调用得太早。
唯一 Unresolved 问题是我是否从终端调用我的 gv
脚本以切换到 gvim 的工作区。
关于haskell - xmonad自动切换到应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11250034/