termonad 4.1.1.0 → 4.2.0.0
raw patch · 11 files changed
+340/−34 lines, 11 filesdep +aesondep +unordered-containersdep ~basenew-component:exe:termonad-example-colour-extension-papercolourPVP ok
version bump matches the API change (PVP)
Dependencies added: aeson, unordered-containers
Dependency ranges changed: base
API changes (from Hackage documentation)
- Termonad.Pcre: inline_c_ffi_6989586621679102244 :: IO CUInt
+ Termonad.Config.Colour: [highlightBgColour] :: ColourConfig c -> !Option c
+ Termonad.Config.Colour: [highlightFgColour] :: ColourConfig c -> !Option c
+ Termonad.Config.Colour: lensHighlightBgColour :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Option c_a1fij)
+ Termonad.Config.Colour: lensHighlightFgColour :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Option c_a1fij)
+ Termonad.Pcre: inline_c_ffi_6989586621679102718 :: IO CUInt
+ Termonad.PreferencesFile: mergeObjVals :: Value -> Value -> Value
+ Termonad.PreferencesFile: readFileWithDefaults :: FilePath -> IO (Either Text ConfigOptions)
+ Termonad.Prelude: data QSem
+ Termonad.Prelude: data QSemN
+ Termonad.Prelude: newQSem :: MonadIO m => Int -> m QSem
+ Termonad.Prelude: newQSemN :: MonadIO m => Int -> m QSemN
+ Termonad.Prelude: signalQSem :: MonadIO m => QSem -> m ()
+ Termonad.Prelude: signalQSemN :: MonadIO m => QSemN -> Int -> m ()
+ Termonad.Prelude: waitQSem :: MonadIO m => QSem -> m ()
+ Termonad.Prelude: waitQSemN :: MonadIO m => QSemN -> Int -> m ()
+ Termonad.Prelude: withQSem :: MonadUnliftIO m => QSem -> m a -> m a
+ Termonad.Prelude: withQSemN :: MonadUnliftIO m => QSemN -> Int -> m a -> m a
- Termonad.Config.Colour: ColourConfig :: !Option c -> !Option c -> !Option c -> !Option c -> !Palette c -> ColourConfig c
+ Termonad.Config.Colour: ColourConfig :: !Option c -> !Option c -> !Option c -> !Option c -> !Option c -> !Option c -> !Palette c -> ColourConfig c
- Termonad.Config.Colour: lensBackgroundColour :: forall c_a1f2j. Lens' (ColourConfig c_a1f2j) (Option c_a1f2j)
+ Termonad.Config.Colour: lensBackgroundColour :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Option c_a1fij)
- Termonad.Config.Colour: lensCursorBgColour :: forall c_a1f2j. Lens' (ColourConfig c_a1f2j) (Option c_a1f2j)
+ Termonad.Config.Colour: lensCursorBgColour :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Option c_a1fij)
- Termonad.Config.Colour: lensCursorFgColour :: forall c_a1f2j. Lens' (ColourConfig c_a1f2j) (Option c_a1f2j)
+ Termonad.Config.Colour: lensCursorFgColour :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Option c_a1fij)
- Termonad.Config.Colour: lensForegroundColour :: forall c_a1f2j. Lens' (ColourConfig c_a1f2j) (Option c_a1f2j)
+ Termonad.Config.Colour: lensForegroundColour :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Option c_a1fij)
- Termonad.Config.Colour: lensPalette :: forall c_a1f2j. Lens' (ColourConfig c_a1f2j) (Palette c_a1f2j)
+ Termonad.Config.Colour: lensPalette :: forall c_a1fij. Lens' (ColourConfig c_a1fij) (Palette c_a1fij)
Files
- .nix-helpers/nixpkgs.nix +7/−5
- CHANGELOG.md +23/−0
- LICENSE +1/−1
- README.md +1/−2
- example-config/ExamplePaperColourColourExtension.hs +150/−0
- shell.nix +6/−1
- src/Termonad/App.hs +0/−2
- src/Termonad/Config/Colour.hs +24/−5
- src/Termonad/PreferencesFile.hs +108/−5
- termonad.cabal +19/−11
- test/readme/README.lhs +1/−2
.nix-helpers/nixpkgs.nix view
@@ -26,13 +26,13 @@ if isNull nixpkgs then builtins.fetchTarball {- # Recent version of nixpkgs master as of 2020-12-27 which uses nightly-2020-12-14.- url = "https://github.com/NixOS/nixpkgs/archive/84917aa00bf23c88e5874c683abe05edb0ba4078.tar.gz";- sha256 = "1x3qh815d7k9yc72zpn5cfaaq2b1942q4pka6rx8b5i33yz4m61q";+ # Recent version of nixpkgs master as of 2021-05-09 which uses nightly-2020-05-07.+ url = "https://github.com/NixOS/nixpkgs/archive/1c16013bd6e94da748b41cc123c6b509a23eb440.tar.gz";+ sha256 = "1m2wif0qnci0q14plbqlb95vx214pxqgw5li86lyw6hsiy7y3zfn"; } else nixpkgs; - compilerVersion = if isNull compiler then "ghc8103" else compiler;+ compilerVersion = if isNull compiler then "ghc8104" else compiler; # An overlay that adds termonad to all haskell package sets. haskellPackagesOverlay = self: super: {@@ -46,12 +46,14 @@ ".nix-helpers" "result" ".stack-work"+ "stack.yaml"+ "stack-nightly.yaml" ".travis.yml" ]; src = builtins.filterSource- (path: type: with self.stdenv.lib;+ (path: type: with self.lib; ! elem (baseNameOf path) filesToIgnore && ! any (flip hasPrefix (baseNameOf path)) [ "dist" ".ghc" ] )
CHANGELOG.md view
@@ -1,3 +1,26 @@+## 4.2.0.0++* Add new options `highlightFgColour` and `highlightBgColour` for setting+ the color of highlighted text+ [#190](https://github.com/cdepillabout/termonad/pull/190).+ Thanks [@zanculmarktum](https://github.com/zanculmarktum)!++* Termonad creates a configuration file in `~/.config/termonad/termonad.yaml`+ for use with the Preferences editor. This is only used if you don't+ have a `termonad.hs` file.++ The configuration file loading code has been updated to be more robust in+ loading configurations that are missing fields. This means that if you+ update Termonad from an old version, your preferences will still be able to+ be loaded in most cases+ [#191](https://github.com/cdepillabout/termonad/pull/191). Thanks again+ [@jecaro](https://github.com/jecaro)!++* Added an+ [example](https://github.com/cdepillabout/termonad/blob/74d04ba1469184cd8667f88d24dfbc7d50d7f658/example-config/ExamplePaperColourColourExtension.hs)+ of how to setup a PaperColour color scheme. Thanks @craigem!+ [#193](https://github.com/cdepillabout/termonad/pull/193)+ ## 4.1.1.0 * Add new shortcuts to switch to the next and previous tab:
LICENSE view
@@ -1,4 +1,4 @@-Copyright Dennis Gosnell (c) 2018+Copyright Dennis Gosnell (c) 2017-2021 All rights reserved.
README.md view
@@ -2,13 +2,12 @@ Termonad ========= -[](http://travis-ci.org/cdepillabout/termonad)+[](https://github.com/cdepillabout/termonad/actions/workflows/ci.yml) [](https://hackage.haskell.org/package/termonad) [](http://stackage.org/lts/package/termonad) [](http://stackage.org/nightly/package/termonad) [](./LICENSE) [](https://gitter.im/termonad/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)-[](https://webchat.freenode.net/) Termonad is a terminal emulator configurable in Haskell. It is extremely customizable and provides hooks to modify the default behavior. It can be
+ example-config/ExamplePaperColourColourExtension.hs view
@@ -0,0 +1,150 @@+{-# LANGUAGE OverloadedStrings #-}+-- | This is an example Termonad configuration that shows how to use the+-- PaperColor colour scheme https://github.com/NLKNguyen/papercolor-theme++module Main where++import Data.Maybe (fromMaybe)+import Termonad+ ( CursorBlinkMode(CursorBlinkModeOn)+ , Option(Set)+ , ShowScrollbar(ShowScrollbarNever)+ , TMConfig+ , confirmExit+ , cursorBlinkMode+ , defaultConfigOptions+ , defaultTMConfig+ , options+ , showMenu+ , showScrollbar+ , start+ , FontConfig+ , FontSize(FontSizePoints)+ , defaultFontConfig+ , fontConfig+ , fontFamily+ , fontSize+ )+import Termonad.Config.Colour+ ( AlphaColour+ , ColourConfig+ , Palette(ExtendedPalette)+ , addColourExtension+ , createColour+ , createColourExtension+ , defaultColourConfig+ , defaultStandardColours+ , defaultLightColours+ , backgroundColour+ , foregroundColour+ , palette+ , List8+ , mkList8+ )++-- This is our main 'TMConfig'. It holds all of the non-colour settings+-- for Termonad.+--+-- This shows how a few settings can be changed.+myTMConfig :: TMConfig+myTMConfig =+ defaultTMConfig+ { options =+ defaultConfigOptions+ { showScrollbar = ShowScrollbarNever+ , confirmExit = False+ , showMenu = False+ , cursorBlinkMode = CursorBlinkModeOn+ , fontConfig = fontConf+ }+ }++-- This is our PaperColor dark 'ColourConfig'. It holds all of our dark-related settings.+paperColorDark :: ColourConfig (AlphaColour Double)+paperColorDark =+ defaultColourConfig+ -- Set the default background & foreground colour of text of the terminal.+ { backgroundColour = Set (createColour 28 28 28) -- black.0+ , foregroundColour = Set (createColour 208 208 208) -- white.7+ -- Set the extended palette that has 2 Vecs of 8 PaperColor palette colours+ , palette = ExtendedPalette paperColorNormal paperColorBright+ }+ where+ paperColorNormal :: List8 (AlphaColour Double)+ paperColorNormal = fromMaybe defaultStandardColours $ mkList8+ [ createColour 28 28 28 -- black.0+ , createColour 175 0 95 -- red.1+ , createColour 95 175 0 -- green.2+ , createColour 215 175 95 -- yellow.3+ , createColour 95 175 215 -- blue.4+ , createColour 128 128 128 -- purple.5+ , createColour 215 135 95 -- aqua.6+ , createColour 208 208 208 -- white.7+ ]++ paperColorBright :: List8 (AlphaColour Double)+ paperColorBright = fromMaybe defaultStandardColours $ mkList8+ [ createColour 88 88 88 -- black.8+ , createColour 95 175 95 -- red.9+ , createColour 175 215 0 -- green.10+ , createColour 175 135 215 -- yellow.11+ , createColour 255 175 0 -- blue.12+ , createColour 255 95 175 -- purple.13+ , createColour 0 175 175 -- aqua.14+ , createColour 95 135 135 -- white.15+ ]++-- This is our PaperColor light 'ColourConfig'. It holds all of our light-related settings+paperColorLight :: ColourConfig (AlphaColour Double)+paperColorLight =+ defaultColourConfig+ -- Set the default background & foreground colour of text of the terminal.+ { backgroundColour = Set (createColour 238 238 238) -- black.0+ , foregroundColour = Set (createColour 68 68 68) -- white.7+ -- Set the extended palette that has 2 Vecs of 8 PaperColor palette colours+ , palette = ExtendedPalette paperColorNormal paperColorBright+ }+ where+ paperColorNormal :: List8 (AlphaColour Double)+ paperColorNormal = fromMaybe defaultLightColours $ mkList8+ [ createColour 238 238 238 -- black.0+ , createColour 175 0 0 -- red.1+ , createColour 0 135 0 -- green.2+ , createColour 95 135 0 -- yellow.3+ , createColour 0 135 175 -- blue.4+ , createColour 135 135 135 -- purple.5+ , createColour 0 95 135 -- aqua.6+ , createColour 68 68 68 -- white.7+ ]++ paperColorBright :: List8 (AlphaColour Double)+ paperColorBright = fromMaybe defaultLightColours $ mkList8+ [ createColour 188 188 188 -- black.8+ , createColour 215 0 0 -- red.9+ , createColour 215 0 135 -- green.10+ , createColour 135 0 175 -- yellow.11+ , createColour 215 95 0 -- blue.12+ , createColour 215 95 0 -- purple.13+ , createColour 0 95 175 -- aqua.14+ , createColour 0 95 135 -- white.15+ ]+++-- This defines the font for the terminal.+fontConf :: FontConfig+fontConf =+ defaultFontConfig+ { fontFamily = "Monospace"+ , fontSize = FontSizePoints 12+ }++main :: IO ()+main = do+ -- First, create the colour extension based on either PaperColor modules.+ myColourExt <- createColourExtension paperColorLight++ -- Update 'myTMConfig' with our colour extension.+ let newTMConfig = addColourExtension myTMConfig myColourExt++ -- Start Termonad with our updated 'TMConfig'.+ start newTMConfig
shell.nix view
@@ -24,6 +24,11 @@ # will also index the Termonad libraries, however this will mean the environment # will need to be rebuilt every time the termonad source changes. -{ compiler ? null, indexTermonad ? false, nixpkgs ? null, additionalOverlays ? [] }@args:+{ compiler ? null+, indexTermonad ? false+, nixpkgs ? null+, buildExamples ? false+, additionalOverlays ? []+}@args: (import .nix-helpers/nixpkgs.nix args).termonadShell
src/Termonad/App.hs view
@@ -68,8 +68,6 @@ , labelNew , notebookGetNPages , notebookNew- , notebookNextPage- , notebookPrevPage , notebookSetShowBorder , onEntryActivate , onNotebookPageRemoved
src/Termonad/Config/Colour.hs view
@@ -50,6 +50,8 @@ , lensCursorBgColour , lensForegroundColour , lensBackgroundColour+ , lensHighlightFgColour+ , lensHighlightBgColour , lensPalette -- * Colour Extension , ColourExtension(..)@@ -119,6 +121,8 @@ #endif , terminalSetColorBackground , terminalSetColorForeground+ , terminalSetColorHighlight+ , terminalSetColorHighlightForeground ) import Text.Printf (printf) import Text.Show (showString)@@ -672,11 +676,14 @@ -- 'foregroundColour' and 'backgroundColour' allow you to set the color of the -- foreground text and background of the terminal. --+-- 'highlightFgColour' and 'highlightBgColour' allow you to set the color of+-- the foreground and background of the highlighted text.+-- -- 'palette' allows you to set the full color palette used by the terminal. -- See 'Palette' for more information. ----- If you don't set 'foregroundColour', 'backgroundColour', or 'palette', the--- defaults from VTE are used.+-- If you don't set 'foregroundColour', 'backgroundColour', 'highlightFgColour',+-- 'highlightBgColour', or 'palette', the defaults from VTE are used. -- -- If you want to use a terminal with a white (or light) background and a black -- foreground, it may be a good idea to change some of the colors in the@@ -751,22 +758,28 @@ -- ^ Color of the default foreground text in the terminal. , backgroundColour :: !(Option c) -- ^ Background color for the terminal+ , highlightFgColour :: !(Option c)+ -- ^ Foreground color for the highlighted text.+ , highlightBgColour :: !(Option c)+ -- ^ Background color for the highlighted text. , palette :: !(Palette c) -- ^ Color palette for the terminal. See 'Palette'. } deriving (Eq, Show, Functor) -- | Default setting for a 'ColourConfig'. The cursor colors, font foreground--- color, background color, and color palette are all left at the defaults set--- by VTE.+-- color, background color, highlighted text color, and color palette are all+-- left at the defaults set by VTE. -- -- >>> defaultColourConfig--- ColourConfig {cursorFgColour = Unset, cursorBgColour = Unset, foregroundColour = Unset, backgroundColour = Unset, palette = NoPalette}+-- ColourConfig {cursorFgColour = Unset, cursorBgColour = Unset, foregroundColour = Unset, backgroundColour = Unset, highlightFgColour = Unset, highlightBgColour = Unset, palette = NoPalette} defaultColourConfig :: ColourConfig (AlphaColour Double) defaultColourConfig = ColourConfig { cursorFgColour = Unset , cursorBgColour = Unset , foregroundColour = Unset , backgroundColour = Unset+ , highlightFgColour = Unset+ , highlightBgColour = Unset , palette = NoPalette } @@ -775,6 +788,8 @@ , ("cursorBgColour", "lensCursorBgColour") , ("foregroundColour", "lensForegroundColour") , ("backgroundColour", "lensBackgroundColour")+ , ("highlightFgColour", "lensHighlightFgColour")+ , ("highlightBgColour", "lensHighlightBgColour") , ("palette", "lensPalette") ] ''ColourConfig@@ -813,6 +828,10 @@ whenSet (cursorFgColour colourConf) $ terminalSetColorCursorForeground vteTerm . Just <=< colourToRgba #endif+ whenSet (highlightFgColour colourConf) $+ terminalSetColorHighlightForeground vteTerm . Just <=< colourToRgba+ whenSet (highlightBgColour colourConf) $+ terminalSetColorHighlight vteTerm . Just <=< colourToRgba colourToRgba :: AlphaColour Double -> IO RGBA colourToRgba colour = do
src/Termonad/PreferencesFile.hs view
@@ -3,7 +3,12 @@ import Termonad.Prelude -import Data.Yaml (decodeFileEither, encode, prettyPrintParseException)+import Control.Monad.Trans.Except (ExceptT(..), runExceptT, throwE, withExceptT)+import Data.Aeson (Result(..), fromJSON)+import qualified Data.HashMap.Strict as HashMap+import Data.Yaml (ParseException, ToJSON (toJSON), decodeFileEither, encode, prettyPrintParseException)+import Data.Yaml.Aeson (Value(..))+ import System.Directory ( XdgDirectory(XdgConfig) , createDirectoryIfMissing@@ -30,6 +35,9 @@ -- @~\/.config\/termonad\/termonad.yaml@. This file stores only the 'options' of -- 'TMConfig' so 'hooks' are initialized with 'defaultConfigHooks'. If the -- file doesn't exist, create it with the default values.+--+-- Any options that do not exist will get initialized with values from+-- 'defaultConfigOptions'. tmConfigFromPreferencesFile :: IO TMConfig tmConfigFromPreferencesFile = do confFile <- getPreferencesFile@@ -37,15 +45,110 @@ exists <- doesFileExist confFile unless exists $ writePreferencesFile confFile defaultConfigOptions -- Read the configuration file- eitherOptions <- decodeFileEither confFile+ eitherOptions <- readFileWithDefaults confFile options <- case eitherOptions of Left err -> do- hPutStrLn stderr $ "Error parsing file " <> pack confFile- hPutStrLn stderr $ pack $ prettyPrintParseException err+ hPutStrLn stderr $ "Error parsing file " <> pack confFile <> ": " <> err pure defaultConfigOptions Right options -> pure options- pure $ TMConfig { options = options, hooks = defaultConfigHooks }+ pure TMConfig { options = options, hooks = defaultConfigHooks }++-- | Read the 'ConfigOptions' out of a configuration file.+--+-- Merge the raw 'ConfigOptions' with 'defaultConfigOptions'. This makes sure+-- that old versions of the configuration file will still be able to be read+-- even if new options are added to 'ConfigOptions' in new versions of+-- Termonad.+readFileWithDefaults :: FilePath -> IO (Either Text ConfigOptions)+readFileWithDefaults file = runExceptT $ do+ -- Read the configuration file as a JSON object+ optsFromFile :: Value <-+ withExceptT parseExceptionToText . ExceptT $ decodeFileEither file+ let optsDefault :: Value = toJSON $ defaultConfigOptions+ -- Then merge it with the default options in JSON before converting it to+ -- a 'ConfigOptions'+ resultToExcept . fromJSON $ mergeObjVals optsFromFile optsDefault+ where+ parseExceptionToText :: ParseException -> Text+ parseExceptionToText = pack . prettyPrintParseException++ resultToExcept :: Result a -> ExceptT Text IO a+ resultToExcept (Success v) = pure v+ resultToExcept (Error str) = throwE (pack str)++-- | Merge 'Value's recursively.+--+-- This merges 'Value's recursively in 'Object' values, taking values that+-- have been explicitly over the defaults. The defaults are only used if+-- there is no value that has been explicitly set.+--+-- For 'Array', 'String', 'Number', 'Bool', and 'Null', take the first 'Value'+-- (the one that has been explicitly set in the user's config file):+--+-- >>> mergeObjVals (Array [Number 1, Number 2]) (Array [String "hello"])+-- Array [Number 1.0,Number 2.0]+-- >>> mergeObjVals (String "hello") (String "bye")+-- String "hello"+-- >>> mergeObjVals (Number 1) (Number 2)+-- Number 1.0+-- >>> mergeObjVals (Bool True) (Bool False)+-- Bool True+-- >>> mergeObjVals Null Null+-- Null+--+-- Note that 'Value's in 'Array's are not recursed into:+--+-- >>> let obj1 = Object $ HashMap.singleton "hello" (Number 2)+-- >>> let obj2 = Object $ HashMap.singleton "hello" (String "bye")+-- >>> mergeObjVals (Array [obj1]) (Array [obj2])+-- Array [Object (fromList [("hello",Number 2.0)])]+--+-- 'Object's are recursed into. Unique keys from both Maps will be used.+-- Keys that are in both Maps will be merged according to the rules above:+--+-- >>> let hash1 = HashMap.fromList [("hello", Number 1), ("bye", Number 100)]+-- >>> let hash2 = HashMap.fromList [("hello", Number 2), ("goat", String "chicken")]+-- >>> mergeObjVals (Object hash1) (Object hash2)+-- Object (fromList [("bye",Number 100.0),("goat",String "chicken"),("hello",Number 1.0)])+--+-- 'Value's of different types will use the second 'Value':+--+-- >>> mergeObjVals Null (String "bye")+-- String "bye"+-- >>> mergeObjVals (Bool True) (Number 2)+-- Number 2.0+-- >>> mergeObjVals (Object mempty) (Bool False)+-- Bool False+--+mergeObjVals+ :: Value+ -- ^ Value that has been set explicitly in the User's configuration+ -- file.+ -> Value+ -- ^ Default value that will be used if no explicitly set value.+ -> Value+ -- ^ Merged values.+mergeObjVals optsFromFile optsDefault =+ case (optsFromFile, optsDefault) of+ -- Both the options from the file and the default options are an Object+ -- here. Recursively merge the keys and values.+ (Object optsFromFileHashMap, Object optsDefaultHashMap) ->+ Object $ HashMap.unionWith mergeObjVals optsFromFileHashMap optsDefaultHashMap+ -- Both the value from the file and the default value are the same type.+ -- Use the value from the file.+ --+ -- XXX: This will end up causing readFileWithDefaults to fail if the value+ -- from the file is old and can no longer properly be decoded into a value+ -- expected by ConfigOptions.+ (Array fromFile, Array _) -> Array fromFile+ (String fromFile, String _) -> String fromFile+ (Number fromFile, Number _) -> Number fromFile+ (Bool fromFile, Bool _) -> Bool fromFile+ (Null, Null) -> Null+ -- The value from the file and the default value are different types. Just+ -- use the default value.+ (_, defVal) -> defVal writePreferencesFile :: FilePath -> ConfigOptions -> IO () writePreferencesFile confFile options = do
termonad.cabal view
@@ -1,5 +1,5 @@ name: termonad-version: 4.1.1.0+version: 4.2.0.0 synopsis: Terminal emulator configurable in Haskell description: Termonad is a terminal emulator configurable in Haskell. It is extremely@@ -16,7 +16,7 @@ license-file: LICENSE author: Dennis Gosnell maintainer: cdep.illabout@gmail.com-copyright: 2017 Dennis Gosnell+copyright: 2017-2021 Dennis Gosnell category: Text build-type: Custom cabal-version: 1.12@@ -64,6 +64,7 @@ other-modules: Paths_termonad build-depends: base >= 4.13 && < 5 , adjunctions+ , aeson , classy-prelude , colour , constraints@@ -89,9 +90,10 @@ , QuickCheck , text , transformers- , yaml+ , unordered-containers , xml-conduit , xml-html-qq+ , yaml default-language: Haskell2010 ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates default-extensions: DataKinds@@ -149,14 +151,7 @@ , template-haskell , termonad default-language: Haskell2010- ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N- -- For some reason doctests appear to be segfaulting when compiling with- -- ghc-8.10.3, so only build them when using ghc-8.10.2 or earlier.- -- See https://github.com/cdepillabout/termonad/issues/174.- if impl(ghc <= 8.10.2)- buildable: True- else- buildable: False+ ghc-options: -Wall test-suite termonad-test type: exitcode-stdio-1.0@@ -225,6 +220,19 @@ executable termonad-example-colour-extension-gruvbox main-is: example-config/ExampleGruvboxColourExtension.hs+ build-depends: base+ , termonad+ , colour+ default-language: Haskell2010+ ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates -threaded -rtsopts -with-rtsopts=-N++ if flag(buildexamples)+ buildable: True+ else+ buildable: False++executable termonad-example-colour-extension-papercolour+ main-is: example-config/ExamplePaperColourColourExtension.hs build-depends: base , termonad , colour
test/readme/README.lhs view
@@ -2,13 +2,12 @@ Termonad ========= -[](http://travis-ci.org/cdepillabout/termonad)+[](https://github.com/cdepillabout/termonad/actions/workflows/ci.yml) [](https://hackage.haskell.org/package/termonad) [](http://stackage.org/lts/package/termonad) [](http://stackage.org/nightly/package/termonad) [](./LICENSE) [](https://gitter.im/termonad/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)-[](https://webchat.freenode.net/) Termonad is a terminal emulator configurable in Haskell. It is extremely customizable and provides hooks to modify the default behavior. It can be