繁体   English   中英

如何在Xmonad按键绑定中使用IO String函数?

[英]How to use IO String function in Xmonad key bindings?

我已经将Xmonad配置为启动dmenu_path

((myModMask, xK_p), spawn (sHOME ++ "/.xmonad/dmenu_path"))

spawn运行脚本, dmenu_path运行dmenu并执行命令。

〜/ .xmonad / dmenu_path

eval "exec $(dmenu)"

我想用haskell函数替换脚本。 我在〜/ .xmonad / xmonad.hs中编写了一个简单的'IO String'函数( fDmenuPath :: IO String )。 我想做类似的事情:

((myModMask, xK_p), spawn (fDmenuPath))

运行xmonad --recompile显示此错误:

xmonad.hs:130:35
    Couldn't match type `IO String' with `[Char]'
    Expected type: String
      Actual type: IO String
....

我是Haskell的新手。 我不知道如何使用该函数来检索结果字符串,并将其传递给spawn

有什么建议吗?

这是fDmenuPath的代码:

pdmpCmd1 p = proc "echo" [p]
pdmpCmd2 = proc "tr" [":","\\n"]
pdmpCmd3 = proc "uniq" []
pdmpCmd4 = proc "sed" ["s|$|/|"]
pdmpCmd5 = proc "xargs" ["ls","-lu","--time-style=+%s"]
pdmpCmd6 = proc "awk" ["/^(-|l)/ { print $6, $7 }"]
pdmpCmd7 = proc "sort" ["-rn"]
pdmpCmd8 = proc "cut" ["-d ","-f","2"]
pdmpCmd9 = proc "dmenu" ["-fn","-*-terminus-*-r-normal-*-*-120-*-*-*-*-iso8859-*","-nb","#000000","-nf","#839496","-sb","#859900"]

fDmenuPath :: IO String
fDmenuPath = do
    sPATH <- getEnv "PATH"
    (_, Just ho1, _, hp1) <- createProcess (pdmpCmd1 sPATH)
                    { std_out = CreatePipe }
    (_, Just ho2, _, hp2) <- createProcess pdmpCmd2
                    { std_in = UseHandle ho1 ,
                      std_out = CreatePipe }
    (_, Just ho3, _, hp3) <- createProcess pdmpCmd3
                    { std_in = UseHandle ho2 ,
                      std_out = CreatePipe }
    (_, Just ho4, _, hp4) <- createProcess pdmpCmd4
                    { std_in = UseHandle ho3 ,
                      std_out = CreatePipe }
    (_, Just ho5, _, hp5) <- createProcess pdmpCmd5
                    { std_in = UseHandle ho4 ,
                      std_out = CreatePipe }
    (_, Just ho6, _, hp6) <- createProcess pdmpCmd6
                    { std_in = UseHandle ho5 ,
                      std_out = CreatePipe }
    (_, Just ho7, _, hp7) <- createProcess pdmpCmd7
                    { std_in = UseHandle ho6 ,
                      std_out = CreatePipe }
    (_, Just ho8, _, hp8) <- createProcess pdmpCmd8
                    { std_in = UseHandle ho7 ,
                      std_out = CreatePipe }
    (_, Just ho9, _, hp9) <- createProcess pdmpCmd9
                    { std_in = UseHandle ho8 ,
                      std_out = CreatePipe }
    sOut <- hGetContents ho9
    ec1 <- waitForProcess hp1
    ec2 <- waitForProcess hp2
    ec3 <- waitForProcess hp3
    ec4 <- waitForProcess hp4
    ec5 <- waitForProcess hp5
    ec6 <- waitForProcess hp6
    ec7 <- waitForProcess hp7
    ec8 <- waitForProcess hp8
    ec9 <- waitForProcess hp9
    return $ sOut

谢谢

您正在寻找的两个部分是

liftIO :: IO a -> X a
(>>=) :: X a -> (a -> X b) -> X b

结合起来,

liftIO fDmenuPath >>= spawn :: X ()

暂无
暂无

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

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