@@ -9,14 +9,14 @@ import Data.ByteString.Char8 qualified as ByteString
9
9
import Data.Text qualified as Text
10
10
import Data.Time (ZonedTime , getZonedTime )
11
11
import NOM.Error (NOMError )
12
- import NOM.Print (Config (.. ))
12
+ import NOM.Print (Config (.. ), printHelp )
13
13
import NOM.Print.Table as Table (bold , displayWidth , displayWidthBS , markup , red , truncate )
14
14
import NOM.State (PrintNameStyle (.. ), PrintState (.. ), initPrintState )
15
15
import NOM.Update.Monad (UpdateMonad , getNow )
16
16
import Relude
17
17
import Streamly.Data.Fold qualified as Fold
18
18
import Streamly.Data.Stream qualified as Stream
19
- import System.Console.ANSI (SGR (Reset ), setSGRCode )
19
+ import System.Console.ANSI (SGR (Reset ), hClearScreen , setSGRCode )
20
20
import System.Console.ANSI qualified as Terminal
21
21
import System.Console.Terminal.Size qualified as Terminal.Size
22
22
import System.IO qualified
@@ -252,6 +252,10 @@ processTextStream config parser updater maintenance printerMay finalize initialS
252
252
printerMay & maybe keepProcessing \ (printer, output_handle) -> do
253
253
linesVar <- newTVarIO 0
254
254
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 ()
255
259
keepProcessingStdin = forever $ do
256
260
key <- getKey
257
261
case key of
@@ -260,15 +264,25 @@ processTextStream config parser updater maintenance printerMay finalize initialS
260
264
print_state <- readTMVar print_state_var
261
265
let print_state_style = if print_state. printName == PrintName then PrintDerivationPath else PrintName
262
266
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
265
271
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 ()
269
275
_ -> pure ()
270
276
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
272
286
keepPrinting :: IO ()
273
287
keepPrinting = forever do
274
288
runConcurrently
0 commit comments