簡體   English   中英

如何在xmonad鍵盤綁定中使用readProcess的輸出?

[英]How do I use the output of readProcess in an xmonad keybinding?

好的,所以前段時間,我正在考慮根據框上腳本的輸出,在xmonad中建立鍵綁定的效果。 我最終出於不相關的原因決定不這樣做,但是最近我確實嘗試做類似的事情,就像學習Haskell的練習一樣。

因此,給定功能:

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

由於測試返回IO String並生成一個String,所以拋出該錯誤。

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

也可以正常工作。

那么,我哪里出錯了?

編輯:解決方案是使用runProcessWithInput而不是readProcess 相關鏈接: https: //ghc.haskell.org/trac/ghc/ticket/5212 xmonad io綁定不起作用

更新資料

顯然,解決方案(請參閱下面的注釋)是使用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" 第二個將從test的輸出中刪除所有換行符(實際上,任何非字母)。

其他一些事情可能會揭示正在發生的事情:

  1. 使用以下內容創建一個名為/tmp/report的腳本:

     #!/bin/sh ( date; echo "/tmp/report was called with args" "$@") >> /tmp/output 
  2. 使/tmp/report可執行。

  3. 運行/tmp/report並驗證兩行是否附加到/tmp/output
  4. 在您的monad配置中,使動作spawn "/tmp/report A" 通過查看預期行是否附加到/tmp/output來測試操作。
  5. 嘗試執行monad操作:

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

    (請注意,我們使用>>這里,不是>>= )。當你觸發動作,你應該可以看到一個報告線B呼叫,還一個是A電話。

根據您在文件/tmp/output看到的內容,您應該能夠確定readProcess命令是否正在執行以及spawn命令是否正在觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM