packages feed

yi-0.3: 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 ( when, replicateM_ )
import Yi.KillRing


-- * Killring actions


--- | C-w
killRegionE :: YiM ()
killRegionE = do r <- withBuffer getSelectRegionB
                 text <- withBuffer $ readRegionB r
                 killringPut text
                 withBuffer unsetMarkB
                 withBuffer $ deleteRegionB r

-- | C-k
killLineE :: YiM ()
killLineE = withUnivArg $ \a -> case a of
               Nothing -> killRestOfLineE
               Just n -> replicateM_ (2*n) killRestOfLineE

killringPut :: String -> YiM ()
killringPut s = withEditor $ modifyA killringA $ krPut s

-- | Kill the rest of line
killRestOfLineE :: YiM ()
killRestOfLineE =
    do eol <- withBuffer atEol
       l <- withBuffer readRestOfLnB
       killringPut l
       withBuffer deleteToEol
       when eol $
            do c <- withBuffer readB
               killringPut [c]
               withBuffer (deleteN 1)

-- | C-y
yankE :: EditorM ()
yankE = do (text:_) <- getsA killringA krContents
           withBuffer0 $ do pointB >>= setSelectionMarkPointB
                            insertN text
                            unsetMarkB

-- | M-w
killRingSaveE :: YiM ()
killRingSaveE = do text <- withBuffer (readRegionB =<< getSelectRegionB)
                   killringPut text
                   withBuffer unsetMarkB
-- | M-y

-- TODO: Handle argument, verify last command was a yank
yankPopE :: EditorM ()
yankPopE = do withBuffer0 (deleteRegionB =<< getSelectRegionB)
              modifyA killringA $ \kr ->
                  let ring = krContents kr
                  in kr {krContents = tail ring ++ [head ring]}
              yankE

-- | C-M-w
appendNextKillE :: YiM ()
appendNextKillE = withEditor $ modifyA killringA (\kr -> kr {krKilled=True})