2011-12-27 105 views
5

我有一個使用xmonad的XMonad.Prompt.Input的新想法。我認爲這真的很酷,如果可以製作一個簡單的計算器來計算用戶輸入的內容並將結果返回到下一個提示的文本中,當用戶按下escape時結束......問題是,我沒有很知道如何處理同類型...xmonad提示中的簡單計算器

到目前爲止,我有這樣的:

不工作。我得到:

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字符串的事實,我需要一個正常的字符串inputPrompt進口XMonad.Prompt.Input包括在內。但我不知道如何處理...

非常感謝您的幫助!

編輯: 現在我有這樣的:

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。

最近編輯: 最後解決。我小小的計算片段的最終代碼是在我自己的答案:)謝謝大家。

回答

2

您應該使用XMonad.Util.Run中的可用函數,該函數負責一些特定於xmonad的細節(我認爲有些信號處理)。

+0

工作正常。非常感謝! – 2011-12-27 17:24:03

1

XMonadIO實例,因此

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

應該工作,我想。

+0

非常感謝。它現在編譯好了。但是,它不能按預期工作。我將「calc」替換爲「echo」,根據我的想法,應該將用戶的值推回到另一個calcPromt,並且新的calcPrompt應該顯示上一個輸入的值。但是,下一個提示從不顯示。執行runAndGetOutput中的命令(我嘗試使用「touch」)雖然... – 2011-12-27 11:50:09

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已安裝。我認爲這是相當方便的一小部分,因爲它不僅僅是一個計算器,你基本上可以調用任何產生一些短輸出的可執行文件:計算器,字典,無論你喜歡什麼......