module Yi.Keymap.Vim.Ex.Commands.BufferDelete (parse) where
import Control.Applicative (Alternative (some))
import Control.Monad (void, when)
import qualified Data.Text as T (null)
import qualified Data.Attoparsec.Text as P (Parser, choice, digit, parseOnly, string)
import Lens.Micro.Platform (use)
import Yi.Buffer.Basic (BufferRef (..))
import Yi.Core (closeWindow, errorEditor)
import Yi.Editor (currentWindowA, deleteBuffer, getBufferWithName, withEditor)
import Yi.Keymap (Action (YiA))
import Yi.Keymap.Vim.Common (EventString)
import Yi.Keymap.Vim.Ex.Commands.Buffer (bufferIdentifier)
import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (needsSaving, parseWithBangAndCount, impureExCommand)
import Yi.Keymap.Vim.Ex.Types (ExCommand (cmdAction, cmdShow))
import Yi.Window (bufkey)
parse :: EventString -> Maybe ExCommand
parse = Common.parseWithBangAndCount nameParser $ \ _ bang mcount -> do
bufIdent <- bufferIdentifier
return $ Common.impureExCommand {
cmdShow = "bdelete"
, cmdAction = YiA $ do
buffer <- case (# mcount, P.parseOnly bufferRef bufIdent #) of
(# Just i, _ #) -> return $ BufferRef i
_ | T.null bufIdent -> withEditor $ bufkey <$> use currentWindowA
(# _, Right ref #) -> return ref
(# _, Left _ #) -> getBufferWithName bufIdent
q <- if bang then pure True else not <$> Common.needsSaving buffer
if q
then do
deleteBuffer buffer
when (T.null bufIdent) $ closeWindow
else errorEditor "No write since last change (add ! to override)"
}
where
bufferRef = BufferRef . read <$> some P.digit
nameParser :: P.Parser ()
nameParser = void . P.choice . fmap P.string $ ["bdelete","bdel","bd"]