首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmonad io绑定不工作

xmonad io绑定不工作
EN

Stack Overflow用户
提问于 2014-10-25 12:45:24
回答 1查看 449关注 0票数 1

我的~/.xmonad/xmonad.hs文件中的一个关键绑定是:

代码语言:javascript
复制
((modMask .|. shiftMask, xK_q), io (exitWith ExitSuccess))

所以,我试着用这个模式来做一个绑定,这个绑定会在键盘布局中循环。我有cycleKLayouts :: IO (),它在从ghci运行时工作得很好。然后,我写道:

代码语言:javascript
复制
((modMask, xK_minus), io cycleKLayouts)

这编译得很好,但是当我尝试键时,唯一会发生的事情是,当前的终端和鼠标所用的终端(都是术语)隐约闪现。这与使用未绑定键发生的情况不同,该键只是将字母传递给应用程序。

我也尝试过liftIO,而不是io,具有相同的结果。我还有一个直接的spawn绑定:

代码语言:javascript
复制
((modMask, xK_equal), spawn "setxkbmap -v gb -variant colemak")

这是可行的,但提供了一种不同的行为。(cycleKLayouts在某个时候运行setxkbmap )。

编辑:cycleKLayouts的定义

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2014-10-25 13:50:53

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

如果你贴出cycleKLayouts的来源,我可能会给出更具体的答案。

更新:

好吧,我只是尝试把这个添加到我的配置中:

代码语言:javascript
复制
((modMask, xK_a), liftIO (readProcess "setxkbmap" ["-print"] "" >>= putStrLn))

每当我按M-a时,都会收到一条错误消息"waitForProcess: not (不存在子进程)“。我无法真正解释原因,但我想这与Xmonad生成键绑定操作的方式有关(可能是一个潜在的错误)。

然而,将readProcess替换为runProcessWithInput (从Xmonad.Util.Run)完全解决了这个问题:

代码语言:javascript
复制
 ((modMask, xK_a), liftIO (runProcessWithInput "setxkbmap" ["-print"] "" >>= putStrLn))

试试这个,以确保我们解决了同样的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26562522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档