From bd21cae5533c201bd06c10b39f445cdf872658e6 Mon Sep 17 00:00:00 2001 From: Philip Kranz Date: Sun, 4 Feb 2018 10:36:28 +0100 Subject: [PATCH] Export a nicer interface in Yi.UI.LineNumbers. --- yi-core/src/Yi/UI/LineNumbers.hs | 41 ++++++++++++++----- yi-frontend-vty/src/Yi/Frontend/Vty.hs | 4 +- .../src/Yi/Keymap/Vim/Ex/Commands/Number.hs | 25 ++++++----- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/yi-core/src/Yi/UI/LineNumbers.hs b/yi-core/src/Yi/UI/LineNumbers.hs index ae19d043f..5aead81a0 100644 --- a/yi-core/src/Yi/UI/LineNumbers.hs +++ b/yi-core/src/Yi/UI/LineNumbers.hs @@ -12,19 +12,21 @@ -- Line numbers. module Yi.UI.LineNumbers - ( DisplayLineNumbers (..) - , DisplayLineNumbersLocal (..) + ( getDisplayLineNumbers + , setDisplayLineNumbers + , getDisplayLineNumbersLocal + , setDisplayLineNumbersLocal ) where import Data.Binary (Binary (..)) import Data.Default (Default (..)) import Data.Typeable (Typeable) import GHC.Generics (Generic) -import Yi.Types (YiVariable) +import Yi.Buffer (getBufferDyn, putBufferDyn) +import Yi.Editor (getEditorDyn, putEditorDyn) +import Yi.Types (BufferM, EditorM, YiVariable) --- | A YiVariable which globally toggles line numbers for frontends --- that support them. -newtype DisplayLineNumbers = DisplayLineNumbers { getDisplayLineNumbers :: Bool } +newtype DisplayLineNumbers = DisplayLineNumbers { unDisplayLineNumbers :: Bool } deriving (Generic, Typeable) instance Default DisplayLineNumbers where @@ -34,11 +36,17 @@ instance Binary DisplayLineNumbers instance YiVariable DisplayLineNumbers --- | Like 'DisplayLineNumbers' but buffer-local. --- Nothing: use global settings --- Just True: display line numbers only in this buffer --- Just False: hide line numbers only in this buffer -newtype DisplayLineNumbersLocal = DisplayLineNumbersLocal { getDisplayLineNumbersLocal :: Maybe Bool } +-- | Get the global line number setting. +getDisplayLineNumbers :: EditorM Bool +getDisplayLineNumbers = unDisplayLineNumbers <$> getEditorDyn + +-- | Set the global line number setting. Can be overridden by the buffer-local setting. +-- True: Show line numbers +-- False: Hide line numbers +setDisplayLineNumbers :: Bool -> EditorM () +setDisplayLineNumbers = putEditorDyn . DisplayLineNumbers + +newtype DisplayLineNumbersLocal = DisplayLineNumbersLocal { unDisplayLineNumbersLocal :: Maybe Bool } deriving (Generic, Typeable) instance Default DisplayLineNumbersLocal where @@ -47,3 +55,14 @@ instance Default DisplayLineNumbersLocal where instance Binary DisplayLineNumbersLocal instance YiVariable DisplayLineNumbersLocal + +-- | Get the buffer-local line number setting. +getDisplayLineNumbersLocal :: BufferM (Maybe Bool) +getDisplayLineNumbersLocal = unDisplayLineNumbersLocal <$> getBufferDyn + +-- | Set the buffer-local line number setting. +-- Nothing: use global setting +-- Just True: display line numbers only in this buffer +-- Just False: hide line numbers only in this buffer +setDisplayLineNumbersLocal :: Maybe Bool -> BufferM () +setDisplayLineNumbersLocal = putBufferDyn . DisplayLineNumbersLocal diff --git a/yi-frontend-vty/src/Yi/Frontend/Vty.hs b/yi-frontend-vty/src/Yi/Frontend/Vty.hs index df0ef3727..c752c19d3 100644 --- a/yi-frontend-vty/src/Yi/Frontend/Vty.hs +++ b/yi-frontend-vty/src/Yi/Frontend/Vty.hs @@ -260,8 +260,8 @@ renderWindow cfg' e (SL.Rect x y _ _) nb (win, focused) = notMini = not (isMini win) displayLineNumbers = - let local = getDisplayLineNumbersLocal <$> withGivenBuffer (bufkey win) getBufferDyn - global = getDisplayLineNumbers <$> getEditorDyn + let local = withGivenBuffer (bufkey win) getDisplayLineNumbersLocal + global = getDisplayLineNumbers in snd $ runEditor cfg' (fromMaybe <$> global <*> local) e -- Collect some information for displaying line numbers diff --git a/yi-keymap-vim/src/Yi/Keymap/Vim/Ex/Commands/Number.hs b/yi-keymap-vim/src/Yi/Keymap/Vim/Ex/Commands/Number.hs index 125b3cda7..139b8a5b8 100644 --- a/yi-keymap-vim/src/Yi/Keymap/Vim/Ex/Commands/Number.hs +++ b/yi-keymap-vim/src/Yi/Keymap/Vim/Ex/Commands/Number.hs @@ -14,15 +14,15 @@ module Yi.Keymap.Vim.Ex.Commands.Number (parse) where import qualified Data.Attoparsec.Text as P (string) import Data.Monoid ((<>)) -import Yi.Buffer (getBufferDyn, putBufferDyn) -import Yi.Editor (getEditorDyn, printMsg, putEditorDyn, withCurrentBuffer) +import Yi.Editor (printMsg, withCurrentBuffer) import Yi.Keymap (Action (BufferA, EditorA)) import Yi.Keymap.Vim.Common (EventString) import Yi.Keymap.Vim.Ex.Commands.Common (BoolOptionAction (..), parseBoolOption, pureExCommand) import qualified Yi.Keymap.Vim.Ex.Commands.Common as Ex (parse) import Yi.Keymap.Vim.Ex.Types (ExCommand (..), evStringToExCommand) import Yi.String (showT) -import Yi.UI.LineNumbers (DisplayLineNumbers (..), DisplayLineNumbersLocal (..)) +import Yi.UI.LineNumbers (getDisplayLineNumbers, setDisplayLineNumbers, + getDisplayLineNumbersLocal, setDisplayLineNumbersLocal) -- | Defines the following commands: -- - :set [no]number (toggle buffer-local line numbers) @@ -37,30 +37,29 @@ parse = evStringToExCommand boolLocal :: BoolOptionAction -> Action boolLocal BoolOptionAsk = EditorA $ do - mb <- withCurrentBuffer (getDisplayLineNumbersLocal <$> getBufferDyn) + mb <- withCurrentBuffer getDisplayLineNumbersLocal printMsg $ "number = " <> case mb of Nothing -> "" Just b -> showT b -boolLocal (BoolOptionSet b) = BufferA $ - putBufferDyn (DisplayLineNumbersLocal (Just b)) +boolLocal (BoolOptionSet b) = BufferA $ setDisplayLineNumbersLocal (Just b) boolLocal BoolOptionInvert = BufferA $ do - b <- getDisplayLineNumbersLocal <$> getBufferDyn - putBufferDyn (DisplayLineNumbersLocal (fmap not b)) + b <- getDisplayLineNumbersLocal + setDisplayLineNumbersLocal (fmap not b) boolGlobal :: BoolOptionAction -> Action boolGlobal BoolOptionAsk = EditorA $ do - b <- getDisplayLineNumbers <$> getEditorDyn + b <- getDisplayLineNumbers printMsg $ "globalnumber = " <> showT b boolGlobal (BoolOptionSet b) = EditorA $ - putEditorDyn (DisplayLineNumbers b) + setDisplayLineNumbers b boolGlobal BoolOptionInvert = EditorA $ do - b <- getDisplayLineNumbers <$> getEditorDyn - putEditorDyn (DisplayLineNumbers (not b)) + b <- getDisplayLineNumbers + setDisplayLineNumbers (not b) parseUnset :: EventString -> Maybe ExCommand parseUnset = Ex.parse $ do _ <- P.string "unset number" return $ pureExCommand { cmdShow = "unset number" - , cmdAction = BufferA $ putBufferDyn (DisplayLineNumbersLocal Nothing) + , cmdAction = BufferA $ setDisplayLineNumbersLocal Nothing }