2016-05-11 10 views
0

これまで、私は箱のスクリプトの出力に基づいて、私のxmonadでキーバインディングの効果を考えていました。私は最終的に無関係の理由でそれをしないことに決めましたが、私は最近ハスケルを学ぶ練習と同様のことをやろうとしました。テストはIOの文字列を返し、卵がStringを想定しているためxmonadのキーバインドでreadProcessの出力を使用するにはどうすればよいですか?

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

これは、アップスロー:

ので、機能を与えられました。

((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"] [] 

正しく動作します。

だからどこが間違っていたのですか?

編集:解決策は、readProcessの代わりにrunProcessWithInputを使用することでした。 関連リンク:https://ghc.haskell.org/trac/ghc/ticket/5212xmonad io binding not working

答えて

1

更新

どうやら解決策は、(下記のコメントを参照)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"と同等であるため、最初のものは成功するはずです。 2番目の行は、testの出力から改行(実際には非文字)を取り除きます。

何が起こっているかに光を当てるかもしれないいくつかの更なる事柄:/tmp/report実行可能にします

#!/bin/sh 
(date; echo "/tmp/report was called with args" "[email protected]") >> /tmp/output 
    1. は、これらの内容で/tmp/reportというスクリプトを作成します。

    2. 実行/tmp/reportとは、アクションspawn "/tmp/report A"を行い、2行があなたのモナドの設定では/tmp/output
    3. に追加されたことを確認します。予想される行が/tmp/outputに追加されているかどうかを確認して、アクションをテストします。
    4. はモナドのアクションにこれを作ってみましょう:

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

      (私たちは>>=、ここ>>をいない使用しています。)あなたがアクションをトリガーするときに、Bコールのレポートラインを見てものための1つの必要がありますA呼び出し。あなたはreadProcessコマンドがさえ実行されているだけでなく、spawnコマンドがトリガされているかどうかを判断することができるはずです/tmp/outputファイルで見たものに基づいて

  • +0

    残念ながら違いはありません。 – HokieGeek

    +0

    新しいアイデアを追加しました。 – ErikR

    +0

    私は自分の質問を編集しましたが、現在の例では、-nオプションを付けたエコーは、少なくともスタンドアロンプ​​ログラムで試してみると、改行を返すようには見えません。他の提案を試してみよう。 – HokieGeek

    関連する問題