module Yi.Keymap.Vim2.StyledRegion
( StyledRegion(..)
, normalizeRegion
, transformCharactersInRegionB
, transformCharactersInLineN
) where
import Prelude ()
import Yi.Prelude
import Yi.Buffer
data StyledRegion = StyledRegion !RegionStyle !Region
normalizeRegion :: StyledRegion -> BufferM StyledRegion
normalizeRegion sr@(StyledRegion style reg) =
if style == Exclusive
then do
let end = regionEnd reg
(_, endColumn) <- getLineAndColOfPoint end
if endColumn == 0
then return $ StyledRegion Inclusive $ reg { regionEnd = end -~ 2 }
else return sr
else return sr
transformCharactersInRegionB :: StyledRegion -> (Char -> Char) -> BufferM ()
transformCharactersInRegionB (StyledRegion Block reg) f = do
subregions <- splitBlockRegionToContiguousSubRegionsB reg
forM_ subregions $ \sr ->
transformCharactersInRegionB (StyledRegion Exclusive sr) f
case subregions of
(sr:_) -> moveTo (regionStart sr)
[] -> error "Should never happen"
transformCharactersInRegionB (StyledRegion style reg) f = do
reg' <- convertRegionToStyleB reg style
s <- readRegionB reg'
replaceRegionB reg' (fmap f s)
moveTo (regionStart reg')
transformCharactersInLineN :: Int -> (Char -> Char) -> BufferM ()
transformCharactersInLineN count action = do
p0 <- pointB
moveXorEol count
p1 <- pointB
let sreg = StyledRegion Exclusive $ mkRegion p0 p1
transformCharactersInRegionB sreg action
moveTo p1