繁体   English   中英

如何在xmonad键盘绑定中使用readProcess的输出?

[英]How do I use the output of readProcess in an xmonad keybinding?

好的,所以前段时间,我正在考虑根据框上脚本的输出,在xmonad中建立键绑定的效果。 我最终出于不相关的原因决定不这样做,但是最近我确实尝试做类似的事情,就像学习Haskell的练习一样。

因此,给定功能:

test = readProcess "echo" ["-n", "gvim"] []

由于测试返回IO String并生成一个String,所以抛出该错误。

((modm, xK_y), spawn ("xmessage " ++ test))

好。 这很酷。 我知道IO操作是不可预测的,因此应将其分开。 精细。 所以我在网上做了一些探索(删除了xmessage,只是想自己通过测试的输出):

((modm, xK_y), liftIO test >>= spawn)

这更糟。 它烦人地编译,但是当我尝试绑定时什么也没有发生。 (我也将其替换为仅生成“ xmessage test”,并且有效)

因此,我当时以为“我的功能也许有问题”,所以我将其替换,但是从GCHi中我得到了“ gvim”,这是正确的。 因此,我将其写入haskell文件:

main = test >>= putStrLn
test = readProcess "echo" ["-n", "gvim"] []

也可以正常工作。

那么,我哪里出错了?

编辑:解决方案是使用runProcessWithInput而不是readProcess 相关链接: https: //ghc.haskell.org/trac/ghc/ticket/5212 xmonad io绑定不起作用

更新资料

显然,解决方案(请参阅下面的注释)是使用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)) }

第一个应该成功,因为它等效于spawn "xmessage grim" 第二个将从test的输出中删除所有换行符(实际上,任何非字母)。

其他一些事情可能会揭示正在发生的事情:

  1. 使用以下内容创建一个名为/tmp/report的脚本:

     #!/bin/sh ( date; echo "/tmp/report was called with args" "$@") >> /tmp/output 
  2. 使/tmp/report可执行。

  3. 运行/tmp/report并验证两行是否附加到/tmp/output
  4. 在您的monad配置中,使动作spawn "/tmp/report A" 通过查看预期行是否附加到/tmp/output来测试操作。
  5. 尝试执行monad操作:

     liftIO (readProcess "/tmp/report" ["B"] "") >> spawn "/tmp/report A" 

    (请注意,我们使用>>这里,不是>>= )。当你触发动作,你应该可以看到一个报告线B呼叫,还一个是A电话。

根据您在文件/tmp/output看到的内容,您应该能够确定readProcess命令是否正在执行以及spawn命令是否正在触发。

暂无
暂无

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

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