packages feed

rasa-ext-files 0.1.3 → 0.1.4

raw patch · 2 files changed

+77/−35 lines, 2 filesdep +mtldep −rasa-ext-status-bardep ~rasadep ~rasa-ext-views

Dependencies added: mtl

Dependencies removed: rasa-ext-status-bar

Dependency ranges changed: rasa, rasa-ext-views

Files

rasa-ext-files.cabal view
@@ -1,5 +1,5 @@ name: rasa-ext-files-version: 0.1.3+version: 0.1.4 cabal-version: >=1.10 build-type: Simple license: GPL-3@@ -22,13 +22,13 @@         Rasa.Ext.Files     build-depends:         base >=4.8 && <5,-        rasa >=0.1.9 && <0.2,-        rasa-ext-views >=0.1.3 && <0.2,-        rasa-ext-status-bar >=0.1.3 && <0.2,+        rasa >=0.1.10 && <0.2,+        rasa-ext-views >=0.1.4 && <0.2,         rasa-ext-cmd >=0.1.2 && <0.2,         data-default >=0.7.1.1 && <0.8,         lens ==4.14.*,         text >=1.2.2.1 && <1.3,+        mtl >=2.2.1 && <2.3,         yi-rope >=0.7.0.2 && <0.8     default-language: Haskell2010     hs-source-dirs: src
src/Rasa/Ext/Files.hs view
@@ -1,4 +1,6 @@-{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}+{-# language+   OverloadedStrings+#-}  module Rasa.Ext.Files   ( files@@ -6,66 +8,106 @@   ) where  import qualified Data.Text.IO as TIO-import Control.Lens import System.Environment -import Data.Foldable import Data.Typeable import Data.Default-import Data.Monoid+import Data.Maybe -import Control.Monad.IO.Class+import Control.Monad+import Control.Monad.Trans import qualified Yi.Rope as Y  import Rasa.Ext import Rasa.Ext.Views import Rasa.Ext.Cmd-import Rasa.Ext.StatusBar -data FileInfo = FileInfo-  { _filename :: Maybe Y.YiString-  } deriving (Typeable, Show, Eq)--makeLenses ''FileInfo+-- | Stores filename+data FileInfo =+  FileInfo (Maybe String)+  deriving (Typeable, Show, Eq)  instance Default FileInfo where-  def = FileInfo {-  _filename=Nothing-}+  def = FileInfo Nothing +type Filename = String++-- | Stores File status; Clean means all changes are saved+data FileStatus =+  Dirty+  | Clean+  deriving Show++instance Default FileStatus where+  def = Clean++-- | Returns 'FileStatus' of current buffer+getFileStatus :: BufAction FileStatus+getFileStatus = getBufExt++-- | Sets 'FileStatus' of current buffer+setFileStatus :: FileStatus -> BufAction ()+setFileStatus = setBufExt++-- | Gets filename of current buffer+getFilename :: BufAction (Maybe Filename)+getFilename = do+  FileInfo filename <- getBufExt+  return filename++-- | Main export, use this in your Rasa config files :: Action ()-files = do -  beforeEveryRender_ showFilename-  onInit $ do+files = do+  onEveryNewBuffer_ $ do+    void . onBufTextChanged $ bufferChanged+    void . addTopStatus $ fileStatus+    void . addTopStatus $ (fmap Y.fromString <$> getFilename)++  afterInit $ do     loadFiles-    addCmd "save" $ focusDo_ . saveAs . Y.fromString+    addCmd "save" $ focusDo_ . saveAs -showFilename :: Action ()-showFilename = focusDo_ $ do-  mName <- use $ bufExt.filename-  traverse_ (leftStatus . disp) mName-      where disp name = "<" <> name <> ">"+-- | Renders the current file status+fileStatus :: BufAction (Maybe RenderInfo)+fileStatus = do+  hasFilename <- isJust <$> getFilename+  status <- getFileStatus+  if hasFilename+    then return . Just $+       case status of+         Dirty -> styleText "✘" $ fg Red+         Clean -> styleText "✓" $ fg Green+    else return Nothing -saveAs :: Y.YiString -> BufAction ()-saveAs fName = getText >>= liftIO . TIO.writeFile (Y.toString fName) . Y.toText+-- | Keeps track of buffer status+bufferChanged :: BufTextChanged -> BufAction ()+bufferChanged _ = setFileStatus Dirty +saveAs :: String -> BufAction ()+saveAs fName = getText >>= liftIO . TIO.writeFile fName . Y.toText++-- | Save the buffer if we have a filename save :: BufAction () save = do-  mName <- use $ bufExt.filename+  FileInfo mName <- getBufExt   case mName of     Just fName -> saveAs fName     Nothing -> return ()+  setFileStatus Clean -setFilename :: Y.YiString -> BufAction ()-setFilename fname = bufExt.filename ?= fname+-- | Set the filename+setFilename :: String -> BufAction ()+setFilename fname = setBufExt $ FileInfo (Just fname) -addFile :: Y.YiString -> Y.YiString -> Action ()+-- | Add a buffer for a file+addFile :: String -> Y.YiString -> Action () addFile fname txt = do-  newBuf <- newBuffer txt+  newBuf <- addBuffer txt   bufDo_ newBuf (setFilename fname) +-- | Load files from command line loadFiles :: Action () loadFiles = do   fileNames <- liftIO getArgs   fileTexts <- liftIO $ traverse TIO.readFile fileNames-  mapM_ (uncurry addFile) $ zip (Y.fromString <$> fileNames) (Y.fromText <$> fileTexts)+  mapM_ (uncurry addFile) $ zip fileNames (Y.fromText <$> fileTexts)