{-# OPTIONS_HADDOCK show-extensions #-}
module Yi.Keymap.Vim.StyledRegion
( StyledRegion(..)
, normalizeRegion
, transformCharactersInRegionB
, transformCharactersInLineN
) where
import Control.Monad (forM_)
import qualified Data.Text as T (map)
import Yi.Buffer
import qualified Yi.Rope as R (withText)
import Yi.Utils (SemiNum ((-~)))
data StyledRegion = StyledRegion !RegionStyle !Region
normalizeRegion :: StyledRegion -> BufferM StyledRegion
normalizeRegion :: StyledRegion -> BufferM StyledRegion
normalizeRegion sr :: StyledRegion
sr@(StyledRegion style :: RegionStyle
style reg :: Region
reg) =
if RegionStyle
style RegionStyle -> RegionStyle -> Bool
forall a. Eq a => a -> a -> Bool
== RegionStyle
Exclusive
then do
let end :: Point
end = Region -> Point
regionEnd Region
reg
(_, endColumn :: Int
endColumn) <- Point -> BufferM (Int, Int)
getLineAndColOfPoint Point
end
StyledRegion -> BufferM StyledRegion
forall (m :: * -> *) a. Monad m => a -> m a
return (if Int
endColumn Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0
then RegionStyle -> Region -> StyledRegion
StyledRegion RegionStyle
Inclusive (Region -> StyledRegion) -> Region -> StyledRegion
forall a b. (a -> b) -> a -> b
$ Region
reg { regionEnd :: Point
regionEnd = Point
end Point -> Size -> Point
forall absolute relative.
SemiNum absolute relative =>
absolute -> relative -> absolute
-~ 2 }
else StyledRegion
sr)
else StyledRegion -> BufferM StyledRegion
forall (m :: * -> *) a. Monad m => a -> m a
return StyledRegion
sr
transformCharactersInRegionB :: StyledRegion -> (Char -> Char) -> BufferM ()
transformCharactersInRegionB :: StyledRegion -> (Char -> Char) -> BufferM ()
transformCharactersInRegionB (StyledRegion Block reg :: Region
reg) f :: Char -> Char
f = do
[Region]
subregions <- Region -> BufferM [Region]
splitBlockRegionToContiguousSubRegionsB Region
reg
[Region] -> (Region -> BufferM ()) -> BufferM ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [Region]
subregions ((Region -> BufferM ()) -> BufferM ())
-> (Region -> BufferM ()) -> BufferM ()
forall a b. (a -> b) -> a -> b
$ \sr :: Region
sr ->
StyledRegion -> (Char -> Char) -> BufferM ()
transformCharactersInRegionB (RegionStyle -> Region -> StyledRegion
StyledRegion RegionStyle
Exclusive Region
sr) Char -> Char
f
case [Region]
subregions of
(sr :: Region
sr:_) -> Point -> BufferM ()
moveTo (Region -> Point
regionStart Region
sr)
[] -> [Char] -> BufferM ()
forall a. HasCallStack => [Char] -> a
error "Should never happen"
transformCharactersInRegionB (StyledRegion style :: RegionStyle
style reg :: Region
reg) f :: Char -> Char
f = do
Region
reg' <- Region -> RegionStyle -> BufferM Region
convertRegionToStyleB Region
reg RegionStyle
style
YiString
s <- Region -> BufferM YiString
readRegionB Region
reg'
Region -> YiString -> BufferM ()
replaceRegionB Region
reg' ((Text -> Text) -> YiString -> YiString
R.withText ((Char -> Char) -> Text -> Text
T.map Char -> Char
f) YiString
s)
Point -> BufferM ()
moveTo (Region -> Point
regionStart Region
reg')
transformCharactersInLineN :: Int -> (Char -> Char) -> BufferM ()
transformCharactersInLineN :: Int -> (Char -> Char) -> BufferM ()
transformCharactersInLineN count :: Int
count action :: Char -> Char
action = do
Point
p0 <- BufferM Point
pointB
Int -> BufferM ()
moveXorEol Int
count
Point
p1 <- BufferM Point
pointB
let sreg :: StyledRegion
sreg = RegionStyle -> Region -> StyledRegion
StyledRegion RegionStyle
Exclusive (Region -> StyledRegion) -> Region -> StyledRegion
forall a b. (a -> b) -> a -> b
$ Point -> Point -> Region
mkRegion Point
p0 Point
p1
StyledRegion -> (Char -> Char) -> BufferM ()
transformCharactersInRegionB StyledRegion
sreg Char -> Char
action
Point -> BufferM ()
moveTo Point
p1