繁体   English   中英

xmonad io绑定不起作用

[英]xmonad io binding not working

~/.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

重写cycleKLayouts使其类型为X ()并使用spawn运行命令,这肯定会有所帮助。 我猜问题出在cycleKLayouts运行命令的方式上。 结果可能是setxkbmap无法访问您的环境变量,或者被分叉然后终止。

如果您发布cycleKLayouts的来源,我大概可以给出更具体的答案。

更新:

好吧,我刚刚尝试将其添加到我的配置中:

((modMask, xK_a), liftIO (readProcess "setxkbmap" ["-print"] "" >>= putStrLn))

每当我按Ma ,都会出现错误消息“ waitForProcess:不存在(没有子进程)”。 我无法真正解释其原因,但我想它与Xmonad产生键绑定动作的方式有关(可能是潜在的错误)。

但是,将readProcess替换为runProcessWithInput (来自Xmonad.Util.Run )可以完全解决问题:

 ((modMask, xK_a), liftIO (runProcessWithInput "setxkbmap" ["-print"] "" >>= putStrLn))

尝试执行此操作以确保我们发现了相同的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM