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
これはコンパイルされますが、期待どおりに動作しません。プロンプトを開いてテキストを入力すると、シェル コマンドが起動されますが、新しいプロンプト テキストとして使用する代わりに stdo 値が破棄されます。
echo 付きのバージョンでは次のことを期待します: プロンプトを開くと、デフォルトの文字列が表示されます。値を入力して return を押すと、以前に入力した値で別のプロンプトが開きます (取得したものを返すだけの echo のおかげです)。エコーで動作する場合は、エコーをいくつかの bash スクリプトに置き換えて計算を実行し、エコーの代わりに結果を返します。
最近の編集: 最終的に解決されました。私の小さな計算スニペットの最終的なコードは、私の自己回答にあります:)ありがとうございました。