我非常喜欢xmonad,但有一点会很棒:
如果我打开一个文件gvim -p --remote-tab-silent my-file
,它在vim中打开,它始终打开workspace 1
,我想自动切换到workspace 1
.
我刚刚发现了viewShift
-trick,但这只会在gvim
生成新内容时更改工作区,因此只是部分地解决了我的问题.
感谢Daniel Wagner的评论,我能够做一些研究:
我找到了一个小程序来设置和取消紧急提示:设置.而且xwininifo
我可以获得gvim的窗口ID.经过一些试验和错误后,我xprop
向我展示了提示标志实际设置了.
GVIMWINID=`xwininfo -tree -root | grep GVIM | cut -d ' ' -f6`
seturgent $GVIMWINID 1
xprop -id $GVIMWINID | grep urgency
Run Code Online (Sandbox Code Playgroud)
现在我补充道
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 {..}
Run Code Online (Sandbox Code Playgroud)
对我来说.xmonad.hs
,并xmonad --recompile && xmonad --restart
没有错误,但没有打击mod4 + x
没有做任何事情,虽然xprop
确实报告了紧急提示设置.
感谢 Daniel Wagner 和 Joachim Breitner 的评论,我可以解决这个问题,至少部分解决。
如果 gvim 未打开,则自动切换到 gvim,但只需添加到 `myManageHooks 即可
myManageHook = composeAll [.., className =? "Gvim"--> viewShift "^ vim",..]
Run Code Online (Sandbox Code Playgroud)如果 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
Run Code Online (Sandbox Code Playgroud)现在,如果我生成一个新的 gv,窗口就会设置紧急提示,我可以切换到它。但我想自动切换到窗口 - 所以至少如果我通过键盘生成 gvim 我想自动切换。所以我添加myKeys
到xmonad.hs
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),..]
Run Code Online (Sandbox Code Playgroud)
该spawn "notify-send .."
行充当时间缓冲区,因为生成+设置紧急提示似乎需要一些时间并且focusUrgent
调用得太早。
唯一未解决的问题是我是否gv
从终端调用我的 -script 来切换到 gvim 的工作区。