module Yi.File (
editFile,
viWrite, viWriteTo, viSafeWriteTo,
fwriteE,
fwriteBufferE,
fwriteAllE,
fwriteToE,
backupE,
revertE,
setFileName
) where
import Control.Applicative
import Control.Lens
import Control.Monad.Base
import Data.Monoid
import qualified Data.Text as T
import Data.Time
import System.Directory
import System.FriendlyPath
import Yi.Buffer
import Yi.Core
import Yi.Dired
import Yi.Editor
import Yi.Keymap
import Yi.Monad
import qualified Yi.Rope as R
import Yi.String
import Yi.Utils
revertE :: YiM ()
revertE = do
withCurrentBuffer (gets file) >>= \case
Just fp -> do
now <- io getCurrentTime
s <- liftBase $ R.readFile fp
withCurrentBuffer $ revertB s now
printMsg ("Reverted from " <> showT fp)
Nothing -> printMsg "Can't revert, no file associated with buffer."
viWrite :: YiM ()
viWrite = do
withCurrentBuffer (gets file) >>= \case
Nothing -> errorEditor "no file name associate with buffer"
Just f -> do
bufInfo <- withCurrentBuffer bufInfoB
let s = bufInfoFileName bufInfo
fwriteE
let message = (showT f <>) (if f == s
then " written"
else " " <> showT s <> " written")
printMsg message
viWriteTo :: T.Text -> YiM ()
viWriteTo f = do
bufInfo <- withCurrentBuffer bufInfoB
let s = T.pack $ bufInfoFileName bufInfo
fwriteToE f
let message = f `T.append` if f == s
then " written"
else ' ' `T.cons` s `T.append` " written"
printMsg message
viSafeWriteTo :: T.Text -> YiM ()
viSafeWriteTo f = do
existsF <- liftBase $ doesFileExist (T.unpack f)
if existsF
then errorEditor $ f <> ": File exists (add '!' to override)"
else viWriteTo f
fwriteE :: YiM ()
fwriteE = fwriteBufferE =<< gets currentBuffer
fwriteBufferE :: BufferRef -> YiM ()
fwriteBufferE bufferKey = do
nameContents <- withGivenBuffer bufferKey ((,) <$> gets file
<*> streamB Forward 0)
case nameContents of
(Just f, contents) -> io (doesDirectoryExist f) >>= \case
True -> printMsg "Can't save over a directory, doing nothing."
False -> do
liftBase $ R.writeFile f contents
io getCurrentTime >>= withGivenBuffer bufferKey . markSavedB
(Nothing, _c) -> printMsg "Buffer not associated with a file"
fwriteToE :: T.Text -> YiM ()
fwriteToE f = do
b <- gets currentBuffer
setFileName b (T.unpack f)
fwriteBufferE b
fwriteAllE :: YiM ()
fwriteAllE =
do allBuffs <- gets bufferSet
let modifiedBuffers = filter (not . isUnchangedBuffer) allBuffs
mapM_ fwriteBufferE (fmap bkey modifiedBuffers)
backupE :: FilePath -> YiM ()
backupE = error "backupE not implemented"
setFileName :: BufferRef -> FilePath -> YiM ()
setFileName b filename = do
cfn <- liftBase $ userToCanonPath filename
withGivenBuffer b $ assign identA $ FileBuffer cfn