module Yi.Keymap.Emacs.KillRing where
import Control.Monad (replicateM_)
import Control.Lens
import Yi.Keymap
import Yi.Buffer
import Yi.Editor
import Yi.KillRing
killRegion :: BufferM ()
killRegion = deleteRegionB =<< getSelectRegionB
killLineE :: Maybe Int -> YiM ()
killLineE a = withBuffer $ case a of
Nothing -> killRestOfLine
Just n -> replicateM_ (2*n) killRestOfLine
killringPut :: Direction -> String -> EditorM ()
killringPut dir s = (%=) killringA $ krPut dir s
killRestOfLine :: BufferM ()
killRestOfLine =
do eol <- atEol
if eol then deleteN 1 else deleteToEol
yankE :: EditorM ()
yankE = do (text:_) <- uses killringA krContents
withBuffer0 $ do pointB >>= setSelectionMarkPointB
insertN text
killRingSaveE :: EditorM ()
killRingSaveE = do (r, text) <- withBuffer0 $ do
r <- getSelectRegionB
text <- readRegionB r
assign highlightSelectionA False
return (r,text)
killringPut (regionDirection r) text
yankPopE :: EditorM ()
yankPopE = do
kr <- use killringA
withBuffer0 (deleteRegionB =<< getRawestSelectRegionB)
assign killringA $ let ring = krContents kr
in kr {krContents = tail ring ++ [head ring]}
yankE
appendNextKillE :: EditorM ()
appendNextKillE = (%=) killringA (\kr -> kr {krKilled=True})