Haskell 如何在xmonad键绑定中使用readProcess的输出?
好的,前一段时间我在考虑根据我的盒子上的脚本输出,在我的xmonad中建立一个键绑定的效果。我最终决定不这样做是因为一些无关的原因,但我最近确实尝试做了一些类似的事情,只是作为学习哈斯克尔的练习 因此,考虑到函数:Haskell 如何在xmonad键绑定中使用readProcess的输出?,haskell,xmonad,Haskell,Xmonad,好的,前一段时间我在考虑根据我的盒子上的脚本输出,在我的xmonad中建立一个键绑定的效果。我最终决定不这样做是因为一些无关的原因,但我最近确实尝试做了一些类似的事情,只是作为学习哈斯克尔的练习 因此,考虑到函数: test = readProcess "echo" ["-n", "gvim"] [] 这是因为测试返回IO字符串,而spawn需要一个字符串 ((modm, xK_y), spawn ("xmessage " ++ test)) 嗯。那很酷。我明白IO操作是不可预测的,所以它们
test = readProcess "echo" ["-n", "gvim"] []
这是因为测试返回IO字符串,而spawn需要一个字符串
((modm, xK_y), spawn ("xmessage " ++ test))
嗯。那很酷。我明白IO操作是不可预测的,所以它们应该分开。好的所以我在网上做了一些探索,得出了这个结论(放弃了xmessage,只想自己通过测试的输出):
这更糟。它进行了令人烦恼的编译,但在我尝试绑定时什么也没发生。(我还用just spawn“xmessage test”替换了它,这很有效)
所以,我想“也许我的函数有问题”,所以我回复了它,但从GCHi我得到了正确的“gvim”。然后我将其写入haskell文件:
main = test >>= putStrLn
test = readProcess "echo" ["-n", "gvim"] []
也可以正常工作
那么,我哪里做错了
编辑:解决方案是使用runProcessWithInput
而不是readProcess
。
相关链接:更新 显然,解决方案(见下面的注释)是使用
readProcessWithInput
原始答案
你说:
liftIO test >>= spawn
不起作用,但是:
liftIO test >>= (\m -> spawn ("xmessage " ++ m))
还要注意,readProcess
返回的字符串结尾可能会有一个换行符,这可能会影响一些事情
在这方面,还有一些事情需要尝试:
return "gvim" >>= (\m -> spawn ("xmessage " ++ m))
import Data.Char
do { m <- liftIO test; spawn ("xmessage " ++ (filter isAlpha m)) }
/tmp/report
可执行/tmp/report
并验证/tmp/output
spawn”/tmp/report设置为“
。通过查看预期行是否附加到/tmp/output
来测试操作liftIO (readProcess "/tmp/report" ["B"] "") >> spawn "/tmp/report A"
(注意我们在这里使用的是>
,而不是>=
)当您触发操作时,您应该会看到B
调用的报告行,以及a
调用的报告行根据您在文件
/tmp/output
中看到的内容,您应该能够确定readProcess
命令是否正在执行,以及spawn
命令是否正在触发。不幸的是,没有区别。添加了一些新的想法进行尝试。我编辑了我的问题,但在当前示例中,带有-n的echo似乎没有返回换行符,至少当我在独立程序上尝试时是这样。尝试其他建议。没有乐趣:-/第一个建议确实成功,但第二个建议对我的绑定没有任何响应。添加了更多要尝试的内容。
#!/bin/sh
( date; echo "/tmp/report was called with args" "$@") >> /tmp/output
liftIO (readProcess "/tmp/report" ["B"] "") >> spawn "/tmp/report A"