Skip to content

Commit

Permalink
Export a nicer interface in Yi.UI.LineNumbers.
Browse files Browse the repository at this point in the history
  • Loading branch information
talanis85 committed Feb 4, 2018
1 parent 3f76805 commit bd21cae
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 26 deletions.
41 changes: 30 additions & 11 deletions yi-core/src/Yi/UI/LineNumbers.hs
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
4 changes: 2 additions & 2 deletions yi-frontend-vty/src/Yi/Frontend/Vty.hs
Expand Up @@ -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
Expand Down
25 changes: 12 additions & 13 deletions yi-keymap-vim/src/Yi/Keymap/Vim/Ex/Commands/Number.hs
Expand Up @@ -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)
Expand All @@ -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 -> "<unset>"
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
}

0 comments on commit bd21cae

Please sign in to comment.