5

我有一个使用 xmonad 的 XMonad.Prompt.Input 的新想法。我认为这真的很酷,如果可以制作一个简单的计算器来计算用户输入的内容并在下一个提示文本中返回结果,当用户按下转义键时完成......问题是,我没有非常知道如何处理类型...

到目前为止,我有这个:

runAndGetOutput cmd = do
    (_, pout, _, phandle) <- runInteractiveCommand cmd
    waitForProcess phandle
    a <- hGetContents pout
    return a 

calcPrompt :: XPConfig -> String -> X () 
calcPrompt c ans =
    inputPrompt c ans ?+ \ next -> 
        calcPrompt c (runAndGetOutput ("calc" ++  next)) 

这是行不通的。我得到:

Couldn't match expected type `[Char]' with actual type `IO String'
Expected type: String
Actual type: IO String
In the return type of a call of `runAndGetOutput'
In the second argument of `calcPrompt', namely
`(runAndGetOutput ("calc" ++ next))'

我确实理解这与 runAndGetOutput 返回 IO 字符串这一事实有关,我需要一个正常的字符串用于从导入 XMonad.Prompt.Input 中包含的 inputPrompt。但我不知道如何处理它......

非常感谢你的帮助!

编辑: 现在我有这个:

runAndGetOutput :: String -> IO String
runAndGetOutput cmd = do
    (_, pout, _, phandle) <- runInteractiveCommand cmd
    a <- hGetContents pout
        waitForProcess phandle
        return a 

calcPrompt :: XPConfig -> String -> X () 
calcPrompt c ans =
    inputPrompt c ans ?+ \next ->
        liftIO (runAndGetOutput ("echo -n " ++ next)) >>= calcPrompt c

哪个编译,但没有按预期工作。我可以打开提示,输入一些文本,然后它会启动 shell 命令,但它只是丢弃 stdo 值而不是将其用作新的提示文本。

我希望带有 echo 的版本执行以下操作:当我打开提示时,会显示一些默认字符串。当我输入一个值并按回车键时,会打开另一个提示,其中包含先前输入的值(感谢 echo,它只返回它所得到的值)。如果它与 echo 一起工作,我会用一些 bash 脚本替换 echo 来执行计算并返回结果而不是 echo。

最近的编辑: 终于解决了。我的小计算片段的最终代码在我的自我回答中:)谢谢大家。

4

3 回答 3

2

您应该使用XMonad.Util.Run中提供的函数,这些函数会处理一些特定于 xmonad 的细节(我认为是一些信号处理)。

于 2011-12-27T16:26:49.673 回答
1

X有一个MonadIO实例,所以

calcPrompt c ans =
    inputPrompt c ans ?+ \next ->
        liftIO (runAndGetOutput ("calc" ++ next)) >>= calcPrompt c

应该工作,我想。

于 2011-12-27T10:50:11.983 回答
0

谢谢你们......你们太棒了:) 现在它可以工作了。我的最终代码很短:

...
import XMonad.Prompt
import XMonad.Prompt.Input
import Data.Char (isSpace)

...    

calcPrompt :: XPConfig -> String -> X () 
calcPrompt c ans =
    inputPrompt c (trim ans) ?+ \input -> 
        liftIO(runProcessWithInput "qalc" [input] "") >>= calcPrompt c 
    where
        trim  = f . f
            where f = reverse . dropWhile isSpace

只是为了其他人:为了使用集成在 xmonad 中的这个小计算,我通过一个像这样的键绑定来调用它:

, ((modm, xK_KP_Multiply), calcPrompt defaultXPConfig "qalc" )

当然你需要安装 qalc。我认为这是一个相当方便的片段,因为它不仅仅是一个计算,你基本上可以调用任何产生一些简短输出的可执行文件:计算器、字典,任何你喜欢的......

于 2011-12-27T17:54:22.497 回答