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 +4/−4
- src/Rasa/Ext/Files.hs +73/−31
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)