{-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_HADDOCK show-extensions #-} -- | -- Module : Yi.Keymap.Vim.Ex.Commands.Copy -- License : GPL-2 -- Maintainer : yi-devel@googlegroups.com -- Stability : experimental -- Portability : portable -- -- :copy ex command to copy selection to the clipboard. module Yi.Keymap.Vim.Ex.Commands.Copy (parse) where import Control.Monad (void) import qualified Data.Attoparsec.Text as P (match, string) import Data.Monoid ((<>)) import Yi.Editor (withCurrentBuffer) import Yi.Keymap (Action (YiA)) import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (parse, impureExCommand, parseRange) import Yi.Keymap.Vim.Ex.Types (ExCommand (cmdAction, cmdShow)) import Yi.Keymap.Vim.Common (EventString) import Yi.Types (YiM, BufferM) import Yi.Rope (toString) import Yi.Buffer.Region (readRegionB, Region) import Control.Monad.Base (liftBase) import System.Hclip (setClipboard) import Yi.Core (errorEditor) parse :: EventString -> Maybe ExCommand parse = Common.parse $ do (regionText, region) <- P.match Common.parseRange void (P.string "copy") return $ Common.impureExCommand { cmdShow = regionText <> "copy" , cmdAction = YiA (copy region) } copy :: Maybe (BufferM Region) -> YiM () copy maybeGetRegion = case maybeGetRegion of Nothing -> errorEditor "Cannot copy: No region" Just getRegion -> liftBase . setClipboard . toString =<< withCurrentBuffer (readRegionB =<< getRegion)