yi-0.4: Yi/Keymap/Cua.hs
-- Copyright (c) 2008 Jean-Philippe Bernardy
module Yi.Keymap.Cua (keymap) where
import Prelude hiding (error)
import Yi.Accessor
import Yi.Buffer
import Yi.Buffer.HighLevel
import Yi.Buffer.Normal
import Yi.Buffer.Region
import Yi.Core
import Yi.Editor
import Yi.File
import Yi.Keymap.Emacs.Utils
import Yi.Keymap.Keys
import Yi.Misc
import Yi.Prelude
keymap :: Keymap
keymap = selfInsertKeymap <|> move <|> select <|> other
selfInsertKeymap :: Keymap
selfInsertKeymap = do
c <- printableChar
write (adjBlock 1 >> insertSelf c)
setMark :: BufferM ()
setMark = do
isSet <- getA highlightSelectionA
when (not isSet) $ do
setA highlightSelectionA True
pointB >>= setSelectionMarkPointB
unsetMark :: BufferM ()
unsetMark = setA highlightSelectionA False
cut, del, copy, paste :: EditorM ()
cut = copy >> del
del = withBuffer0 (deleteRegionB =<< getSelectRegionB)
copy = setRegE =<< withBuffer0 (readRegionB =<< getSelectRegionB)
paste = withBuffer0 . insertN =<< getRegE
moveKeys :: [(Event, BufferM ())]
moveKeys = [
(spec KHome , maybeMoveB Line Backward),
(spec KEnd , maybeMoveB Line Forward),
(ctrl (spec KHome) , maybeMoveB Document Backward),
(ctrl (spec KEnd) , maybeMoveB Document Forward),
(ctrl (spec KRight) , moveB Word Forward),
(ctrl (spec KLeft ) , moveB Word Backward),
(spec KUp , moveB VLine Backward),
(spec KDown , moveB VLine Forward),
(spec KRight , moveB Character Forward),
(spec KLeft , moveB Character Backward)
]
move, select, other :: Keymap
move = choice [ k ?>>! unsetMark >> a | (k,a) <- moveKeys]
select = choice [shift k ?>>! setMark >> a | (k,a) <- moveKeys]
other = choice [
spec KBS ?>>! adjBlock (-1) >> withBuffer bdeleteB,
spec KDel ?>>! do
haveSelection <- withBuffer $ getA highlightSelectionA
if haveSelection
then withEditor del
else adjBlock (-1) >> withBuffer (deleteN 1),
spec KEnter ?>>! insertB '\n',
ctrl (char 'q') ?>>! askQuitEditor,
ctrl (char 'f') ?>> isearchKeymap Forward,
ctrl (char 'x') ?>>! cut,
ctrl (char 'c') ?>>! copy,
ctrl (char 'v') ?>>! paste,
ctrl (spec KIns) ?>>! copy,
shift (spec KIns) ?>>! paste,
ctrl (char 'z') ?>>! undoB,
ctrl (char 'y') ?>>! redoB,
ctrl (char 's') ?>>! fwriteE,
ctrl (char 'o') ?>>! findFile
]