yi-0.4: Yi/Keymap/Emacs/KillRing.hs
{-# LANGUAGE DeriveDataTypeable #-}
-- Copyright (c) 2005,8 Jean-Philippe Bernardy
module Yi.Keymap.Emacs.KillRing where
import Yi.Keymap.Emacs.UnivArgument
import Yi.Buffer.Region
import Yi.Keymap
import Yi.Buffer
import Yi.Buffer.HighLevel
import Yi.Accessor
import Yi.Editor
import Control.Monad ( replicateM_ )
import Yi.KillRing
-- * Killring actions
-- | C-w
killRegion :: BufferM ()
killRegion = deleteRegionB =<< getSelectRegionB
-- | C-k
killLineE :: YiM ()
killLineE = withUnivArg $ \a -> withBuffer $ case a of
Nothing -> killRestOfLine
Just n -> replicateM_ (2*n) killRestOfLine
killringPut :: Direction -> String -> EditorM ()
killringPut dir s = modifyA killringA $ krPut dir s
-- | Kill the rest of line
killRestOfLine :: BufferM ()
killRestOfLine =
do eol <- atEol
if eol then deleteN 1 else deleteToEol
-- | C-y
yankE :: EditorM ()
yankE = do (text:_) <- getsA killringA krContents
withBuffer0 $ do pointB >>= setSelectionMarkPointB
insertN text
-- | M-w
killRingSaveE :: EditorM ()
killRingSaveE = do (r, text) <- withBuffer0 $ do
setA highlightSelectionA False
r <- getSelectRegionB
text <- readRegionB r
return (r,text)
killringPut (regionDirection r) text
-- | M-y
-- TODO: Handle argument, verify last command was a yank
yankPopE :: EditorM ()
yankPopE = do
kr <- getA killringA
withBuffer0 (deleteRegionB =<< getSelectRegionB)
setA killringA $ let ring = krContents kr
in kr {krContents = tail ring ++ [head ring]}
yankE
-- | C-M-w
appendNextKillE :: EditorM ()
appendNextKillE = modifyA killringA (\kr -> kr {krKilled=True})