[英]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.