我的~/.xmonad/xmonad.hs文件中的一个关键绑定是:
((modMask .|. shiftMask, xK_q), io (exitWith ExitSuccess))所以,我试着用这个模式来做一个绑定,这个绑定会在键盘布局中循环。我有cycleKLayouts :: IO (),它在从ghci运行时工作得很好。然后,我写道:
((modMask, xK_minus), io cycleKLayouts)这编译得很好,但是当我尝试键时,唯一会发生的事情是,当前的终端和鼠标所用的终端(都是术语)隐约闪现。这与使用未绑定键发生的情况不同,该键只是将字母传递给应用程序。
我也尝试过liftIO,而不是io,具有相同的结果。我还有一个直接的spawn绑定:
((modMask, xK_equal), spawn "setxkbmap -v gb -variant colemak")这是可行的,但提供了一种不同的行为。(cycleKLayouts在某个时候运行setxkbmap )。
编辑:cycleKLayouts的定义
module Keyboards where
import System.Process
import Control.Applicative
kLayouts = [("gb(colemak)", "UK-CO")
,("gb", "UK-QW")
,("us(colemak)", "US-CO")
,("us", "US-QW")]
getKLayout :: IO String
getKLayout = f . (!! 4) . lines <$> readProcess "setxkbmap" ["-print"] []
where
f ('+':cs) = g cs
f (_:cs) = f cs
f _ = ""
g ('+':_) = ""
g (c:cs) = c:g cs
g _ = ""
getNextKLayout :: IO String
getNextKLayout = do
l <- getKLayout
let kLayoutNames = map fst kLayouts
let f (x:y:xs) = if x == l then y else f (y:xs)
f _ = head kLayoutNames
return $ f kLayoutNames
setKLayout :: String -> IO ()
setKLayout l = readProcess "setxkbmap" ["-v", l] [] >> return ()
cycleKLayouts :: IO ()
cycleKLayouts = setKLayout =<< getNextKLayout发布于 2014-10-25 13:50:53
重写cycleKLayouts,使其具有X ()类型并使用spawn运行您的命令,肯定会有所帮助。我想问题在于cycleKLayouts运行命令的方式。结果可能是setxkbmap无法访问您的环境变量,或者分叉,然后终止。
如果你贴出cycleKLayouts的来源,我可能会给出更具体的答案。
更新:
好吧,我只是尝试把这个添加到我的配置中:
((modMask, xK_a), liftIO (readProcess "setxkbmap" ["-print"] "" >>= putStrLn))每当我按M-a时,都会收到一条错误消息"waitForProcess: not (不存在子进程)“。我无法真正解释原因,但我想这与Xmonad生成键绑定操作的方式有关(可能是一个潜在的错误)。
然而,将readProcess替换为runProcessWithInput (从Xmonad.Util.Run)完全解决了这个问题:
((modMask, xK_a), liftIO (runProcessWithInput "setxkbmap" ["-print"] "" >>= putStrLn))试试这个,以确保我们解决了同样的问题。
https://stackoverflow.com/questions/26562522
复制相似问题