Skip to content

Commit b54c98d

Browse files
committed
Freeze/help user triggered features
When the user presses h or ?, we print a short usage/help text listing the interactive key bindings. When the user presses f, we freeze the output text. I personally use this to copy/paste stuff from the terminal output, that's quite convenient. There's no visual feedback showing the output text is paused at the moment. This might be a UX footgun ><
1 parent 7f7bbf4 commit b54c98d

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

lib/NOM/IO.hs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import Data.ByteString.Char8 qualified as ByteString
99
import Data.Text qualified as Text
1010
import Data.Time (ZonedTime, getZonedTime)
1111
import NOM.Error (NOMError)
12-
import NOM.Print (Config (..))
12+
import NOM.Print (Config (..), printHelp)
1313
import NOM.Print.Table as Table (bold, displayWidth, displayWidthBS, markup, red, truncate)
1414
import NOM.State (PrintNameStyle (..), PrintState (..), initPrintState)
1515
import NOM.Update.Monad (UpdateMonad, getNow)
1616
import Relude
1717
import Streamly.Data.Fold qualified as Fold
1818
import Streamly.Data.Stream qualified as Stream
19-
import System.Console.ANSI (SGR (Reset), setSGRCode)
19+
import System.Console.ANSI (SGR (Reset), hClearScreen, setSGRCode)
2020
import System.Console.ANSI qualified as Terminal
2121
import System.Console.Terminal.Size qualified as Terminal.Size
2222
import 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

lib/NOM/Print.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module NOM.Print (stateToText, showCode, Config (..)) where
1+
module NOM.Print (stateToText, showCode, printHelp, Config (..)) where
22

33
import Data.Foldable qualified as Unsafe
44
import Data.IntMap.Strict qualified as IntMap
@@ -588,3 +588,13 @@ printDuration diff
588588

589589
timeDiffSeconds :: Int -> Text
590590
timeDiffSeconds = printDuration . fromIntegral
591+
592+
printHelp :: ByteString
593+
printHelp =
594+
"\n==================\n"
595+
<> "Nix Output Monitor\n"
596+
<> "==================\n"
597+
<> "Hotkeys\n\n"
598+
<> "n: toggle derivation name/derivation path print\n"
599+
<> "f: toggle screen freeze\n"
600+
<> "? or h: toggle help screen\n"

lib/NOM/State.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ data PrintNameStyle = PrintName | PrintDerivationPath deriving stock (Show, Eq,
202202
data PrintState = MkPrintState
203203
{ printName :: PrintNameStyle
204204
, printHelp :: Bool
205+
, freeze :: Bool
205206
}
206207
deriving stock (Show, Eq, Ord, Generic)
207208

@@ -210,6 +211,7 @@ initPrintState =
210211
MkPrintState
211212
{ printName = PrintName
212213
, printHelp = False
214+
, freeze = False
213215
}
214216

215217
data NOMV1State = MkNOMV1State

0 commit comments

Comments
 (0)