Ho una nuova idea dell'uso di XMonad.Prompt.Input di xmonad. Ho pensato che sarebbe stato davvero bello, se si potesse fare una semplice calcolatrice che calcolasse ciò che l'utente inserisce e restituisca il risultato nel testo del prossimo prompt, finendo quando l'utente preme la fuga ... Il problema è che io non si sa bene come trattare con i tipi ...Calcolatrice semplice nel prompt xmonad
Finora ho questo:
che non funziona. Ottengo:
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))'
Capisco che abbia qualcosa a che fare con il fatto che runAndGetOutput ritorna IO String e ho bisogno di una stringa normale per inputPrompt incluso dall'importazione XMonad.Prompt.Input. Ma non ho idea di come affrontarlo ...
Grazie mille per il vostro aiuto!
EDIT: Ora ho questo:
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
che compila, ma non funziona come previsto. Posso aprire il prompt, inserire del testo, quindi lancia il comando shell, ma poi scarta il valore stdo invece di usarlo come nuovo testo di prompt.
Mi aspetto che la versione con echo segua: Quando apro il prompt, viene mostrata una stringa predefinita. Quando inserisco un valore e premo Invio, viene visualizzato un altro prompt con il valore inserito in precedenza (grazie a echo che restituisce solo ciò che ha ottenuto). Se ha funzionato con echo, sostituire echo con alcuni script bash per eseguire i calcoli e restituire il risultato anziché l'eco.
MODIFICO recente: Finalmente risolto. Il codice finale del mio piccolo frammento di calc è nella mia auto-risposta :) Grazie a tutti.
Ciò ha funzionato. Molte grazie! –