packages feed

yi-0.3: Yi/Keymap/Emacs.hs

--
-- Copyright (c) 2005,2007,2008 Jean-Philippe Bernardy
--
--

-- This module aims at a mode that should be (mostly) intuitive to
-- emacs users, but mapping things into the Yi world when
-- convenient. Hence, do not go into the trouble of trying 100%
-- emulation. For example, M-x gives access to Yi (Haskell) functions,
-- with their native names.

module Yi.Keymap.Emacs
  ( keymap
  , makeKeymap
  )
where

import Yi.Yi
import Yi.TextCompletion
import Yi.Keymap.Emacs.KillRing
import Yi.Keymap.Emacs.UnivArgument
import Yi.Keymap.Emacs.Utils
  ( KList
  , completeFileName
  , evalRegionE
  , executeExtendedCommandE
  , findFile
  , insertNextC
  , insertSelf
  , isearchKeymap
  , killBufferE
  , makeKeymap
  , queryReplaceE
  , readArgC
  , scrollDownE
  , scrollUpE
  , shellCommandE
  , switchBufferE
  , withMinibuffer
  )
import Yi.Buffer
import Yi.Buffer.Normal
import Data.Maybe

import Control.Monad
import Control.Applicative

import Yi.Indent

selfInsertKeymap :: Keymap
selfInsertKeymap = do
  Event (KASCII c) [] <- satisfy isPrintableEvent
  write (insertSelf c)
      where isPrintableEvent (Event (KASCII c) []) = c >= ' '
            isPrintableEvent _ = False

keymap :: Keymap
keymap =
  selfInsertKeymap <|> makeKeymap keys

keys :: KList
keys =
  [ ( "TAB",      write $ autoIndentB)
  , ( "RET",      write $ repeatingArg $ insertB '\n')
  , ( "DEL",      write $ repeatingArg $ deleteN 1)
  , ( "BACKSP",   write $ repeatingArg bdeleteB)
  , ( "C-M-w",    write $ appendNextKillE)
  , ( "C-/",      write $ repeatingArg undoB)
  , ( "C-_",      write $ repeatingArg undoB)
  , ( "C-<left>", write $ repeatingArg prevWordB)
  , ( "C-<right>",write $ repeatingArg nextWordB)
  , ( "C-<home>", write $ repeatingArg topB)
  , ( "C-<end>",  write $ repeatingArg botB)
  , ( "C-@",      write $ (pointB >>= setSelectionMarkPointB))
  , ( "C-SPC",    write $ (pointB >>= setSelectionMarkPointB))
  , ( "C-a",      write $ repeatingArg (maybeMoveB Line Backward))
  , ( "C-b",      write $ repeatingArg leftB)
  , ( "C-d",      write $ repeatingArg $ deleteN 1)
  , ( "C-e",      write $ repeatingArg (maybeMoveB Line Forward))
  , ( "C-f",      write $ repeatingArg rightB)
  , ( "C-g",      write $ unsetMarkB)
  -- , ( "C-g",   write $ keyboardQuitE)
  -- C-g should be a more general quit that also unsets the mark.
  , ( "C-i",      write $ autoIndentB)
  , ( "C-j",      write $ repeatingArg $ insertB '\n')
  , ( "C-k",      write $ killLineE)
  , ( "C-m",      write $ repeatingArg $ insertB '\n')
  , ( "C-n",      write $ repeatingArg $ moveB VLine Forward)
  , ( "C-o",      write $ repeatingArg (insertB '\n' >> leftB))
  , ( "C-p",      write $ repeatingArg $ moveB VLine Backward)
  , ( "C-q",      insertNextC)
  , ( "C-r",      isearchKeymap Backward)
  , ( "C-s",      isearchKeymap Forward)
  , ( "C-t",      write $ repeatingArg $ swapB)
  , ( "C-u",      readArgC)
  , ( "C-v",      write $ scrollDownE)
  , ( "M-v",      write $ scrollUpE)
  , ( "C-w",      write $ killRegionE)
  , ( "C-z",      write $ suspendEditor)
  , ( "C-x ^",    write $ repeatingArg enlargeWinE)
  , ( "C-x 0",    write $ closeWindow)
  , ( "C-x 1",    write $ closeOtherE)
  , ( "C-x 2",    write $ splitE)
  , ( "C-x C-c",  write $ quitEditor)
  , ( "C-x C-f",  write $ findFile)
  , ( "C-x C-s",  write $ fwriteE)
  , ( "C-x C-w",  write $ withMinibuffer "Write file: "
                                          (completeFileName Nothing)
                                          fwriteToE
    )
  , ( "C-x C-x",  write $ exchangePointAndMarkB)
  , ( "C-x b",    write $ switchBufferE)
  , ( "C-x d",    write $ dired)
  , ( "C-x e e",  write $ evalRegionE)
  , ( "C-x o",    write $ nextWinE)
  , ( "C-x k",    write $ killBufferE)
  -- , ( "C-x r k",  write $ killRectE)
  -- , ( "C-x r o",  write $ openRectE)
  -- , ( "C-x r t",  write $ stringRectE)
  -- , ( "C-x r y",  write $ yankRectE)
  , ( "C-x u",    write $ repeatingArg undoB)
  , ( "C-x v",    write $ repeatingArg shrinkWinE)
  , ( "C-y",      write $ yankE)
  , ( "M-!",      write $ shellCommandE)
  , ( "M-/",      write $ wordCompleteB)
  , ( "M-<",      write $ repeatingArg topB)
  , ( "M->",      write $ repeatingArg botB)
  , ( "M-%",      write $ queryReplaceE)
  , ( "M-BACKSP", write $ repeatingArg bkillWordB)
  --  , ( "M-a",      write $ repeatingArg backwardSentenceE)
  , ( "M-b",      write $ repeatingArg prevWordB)
  , ( "M-c",      write $ repeatingArg capitaliseWordB)
  , ( "M-d",      write $ repeatingArg killWordB)
  -- , ( "M-e",      write $ repeatingArg forwardSentenceE)
  , ( "M-f",      write $ repeatingArg nextWordB)
  , ( "M-g g",    write $ gotoLn)
  -- , ( "M-h",      write $ repeatingArg markParagraphE)
  -- , ( "M-k",      write $ repeatingArg killSentenceE)
  , ( "M-l",      write $ repeatingArg lowercaseWordB)
  , ( "M-t",      write $ repeatingArg $ transposeB Word Forward)
  , ( "M-u",      write $ repeatingArg uppercaseWordB)
  , ( "M-w",      write $ killRingSaveE)
  , ( "M-x",      write $ executeExtendedCommandE)
  , ( "M-y",      write $ yankPopE)
  , ( "<home>",   write $ repeatingArg moveToSol)
  , ( "<end>",    write $ repeatingArg moveToEol)
  , ( "<left>",   write $ repeatingArg leftB)
  , ( "<right>",  write $ repeatingArg rightB)
  , ( "<up>",     write $ repeatingArg (moveB VLine Backward))
  , ( "<down>",   write $ repeatingArg (moveB VLine Forward))
  , ( "C-<up>",   write $ repeatingArg $ prevNParagraphs 1)
  , ( "C-<down>", write $ repeatingArg $ nextNParagraphs 1)
  , ( "<next>",   write $ repeatingArg downScreenB)
  , ( "<prior>",  write $ repeatingArg upScreenB)
  ]