@@ -9,14 +9,14 @@ import Data.ByteString.Char8 qualified as ByteString
99import Data.Text qualified as Text
1010import Data.Time (ZonedTime , getZonedTime )
1111import NOM.Error (NOMError )
12- import NOM.Print (Config (.. ))
12+ import NOM.Print (Config (.. ), printHelp )
1313import NOM.Print.Table as Table (bold , displayWidth , displayWidthBS , markup , red , truncate )
1414import NOM.State (PrintNameStyle (.. ), PrintState (.. ), initPrintState )
1515import NOM.Update.Monad (UpdateMonad , getNow )
1616import Relude
1717import Streamly.Data.Fold qualified as Fold
1818import Streamly.Data.Stream qualified as Stream
19- import System.Console.ANSI (SGR (Reset ), setSGRCode )
19+ import System.Console.ANSI (SGR (Reset ), hClearScreen , setSGRCode )
2020import System.Console.ANSI qualified as Terminal
2121import System.Console.Terminal.Size qualified as Terminal.Size
2222import System.IO qualified
@@ -252,6 +252,10 @@ processTextStream config parser updater maintenance printerMay finalize initialS
252252 printerMay & maybe keepProcessing \ (printer, output_handle) -> do
253253 linesVar <- newTVarIO 0
254254 let keepProcessingStdin :: IO ()
255+ let toggleHelp :: IO () = atomically $ do
256+ print_state <- readTMVar print_state_var
257+ writeTMVar print_state_var $ print_state{printHelp = not print_state. printHelp}
258+ writeTMVar new_user_input ()
255259 keepProcessingStdin = forever $ do
256260 key <- getKey
257261 case key of
@@ -260,15 +264,25 @@ processTextStream config parser updater maintenance printerMay finalize initialS
260264 print_state <- readTMVar print_state_var
261265 let print_state_style = if print_state. printName == PrintName then PrintDerivationPath else PrintName
262266 writeTMVar print_state_var $ print_state{printName = print_state_style}
263- writeTMVar input_received ()
264- " ?" -> do
267+ writeTMVar new_user_input ()
268+ " ?" -> toggleHelp
269+ " h" -> toggleHelp
270+ " f" -> do
265271 atomically $ do
266- print_state <- takeTMVar print_state_var
267- putTMVar print_state_var $ print_state{printHelp = True }
268- writeTMVar input_received ()
272+ print_state <- readTMVar print_state_var
273+ writeTMVar print_state_var $ print_state{freeze = not print_state . freeze }
274+ writeTMVar new_user_input ()
269275 _ -> pure ()
270276 writeToScreen :: IO ()
271- writeToScreen = writeStateToScreen (not config. silent) linesVar state_var print_state_var output_builder_var refresh_display_var maintenance printer output_handle
277+ writeToScreen = do
278+ print_state <- atomically $ readTMVar print_state_var
279+ case (print_state. freeze, print_state. printHelp) of
280+ (True , _) -> pure () -- Freezing the output, do not print anything.
281+ (_, True ) -> do
282+ hClearScreen output_handle
283+ ByteString. hPut output_handle printHelp
284+ System.IO. hFlush output_handle
285+ _ -> writeStateToScreen (not config. silent) printedLinesVar state_var print_state_var output_builder_var refresh_display_var maintenance printer output_handle
272286 keepPrinting :: IO ()
273287 keepPrinting = forever do
274288 runConcurrently
0 commit comments