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

これはコンパイルされますが、期待どおりに動作しません。プロンプトを開いてテキストを入力すると、シェル コマンドが起動されますが、新しいプロンプト テキストとして使用する代わりに stdo 値が破棄されます。

echo 付きのバージョンでは次のことを期待します: プロンプトを開くと、デフォルトの文字列が表示されます。値を入力して return を押すと、以前に入力した値で別のプロンプトが開きます (取得したものを返すだけの echo のおかげです)。エコーで動作する場合は、エコーをいくつかの bash スクリプトに置き換えて計算を実行し、エコーの代わりに結果を返します。

最近の編集: 最終的に解決されました。私の小さな計算スニペットの最終的なコードは、私の自己回答にあります:)ありがとうございました。

4

3 に答える 3

2

XMonad.Util.Runで利用可能な関数を使用する必要があります。これは、いくつかの xmonad 固有の詳細 (いくつかのシグナル処理だと思います) を処理します。

于 2011-12-27T16:26:49.673 に答える
1

XMonadIOインスタンスがあるので、

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 に答える