manatee-editor 0.0.8 → 0.1.0
raw patch · 9 files changed
+233/−88 lines, 9 filesdep +binarydep +derivedep −gtk-serialized-eventdep ~manatee-coresetup-changedbinary-added
Dependencies added: binary, derive
Dependencies removed: gtk-serialized-event
Dependency ranges changed: manatee-core
Files
- Main.hs +1/−1
- Manatee/Extension/Editor.hs +1/−1
- Manatee/Extension/Editor/PageMode.hs +1/−1
- Manatee/Extension/Editor/SourceBuffer.hs +32/−1
- Manatee/Extension/Editor/SourceView.hs +152/−76
- Setup.hs +12/−2
- data/welcome/snapshot.png binary
- data/welcome/welcome.txt +24/−0
- manatee-editor.cabal +10/−6
Main.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Editor.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Editor/PageMode.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Editor/SourceBuffer.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -17,18 +17,23 @@ -- along with this program. If not, see <http://www.gnu.org/licenses/>. {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE TemplateHaskell #-} module Manatee.Extension.Editor.SourceBuffer where import Control.Applicative import Control.Concurrent.STM import DBus.Client hiding (Signal)+import Data.Binary+import Data.DeriveTH import Data.List import Data.Maybe import Data.Typeable import Graphics.UI.Gtk.Multiline.TextBuffer+import Manatee.Core.Config import Manatee.Core.PageMode import Manatee.Core.Types import Manatee.Extension.Editor.PageMode+import Manatee.Toolkit.General.STM import Text.Regex.TDFA import qualified Data.ByteString as BS@@ -40,9 +45,20 @@ ,sourceBufferPageId :: PageId ,sourceBufferMode :: PageMode ,sourceBufferBuffer :: SB.SourceBuffer+ ,sourceBufferState :: TVar SourceState } deriving Typeable +data SourceState =+ SourceState {sourceStateCursor :: Maybe (Int, Int)+ ,sourceStateScrolledPosition :: (Double, Double)+ } deriving Show++-- | Init state.+sourceInitState :: SourceState+sourceInitState =+ SourceState (Just (1, 0)) (0, 0)+ -- | New source buffer. sourceBufferNew :: String -> [String] -> Client -> PageId -> CustomizeWrap -> IO SourceBuffer sourceBufferNew path _ client pageId _ = do@@ -55,3 +71,18 @@ <*> pure pageId <*> pure (fromMaybe defaultMode $ find (\x -> path =~ pageModeRegexp x) sourceModeList) <*> pure buffer+ <*> newTVarIO sourceInitState++-- | Write state.+sourceBufferWriteState :: SourceBuffer -> FilePath -> IO ()+sourceBufferWriteState buffer path = do+ state <- readTVarIO $ sourceBufferState buffer+ writeConfigPath path state++-- | Read state.+sourceBufferReadState :: SourceBuffer -> FilePath -> IO () +sourceBufferReadState buffer path = do+ state <- readConfigPath path sourceInitState+ writeTVarIO (sourceBufferState buffer) state+ +$(derive makeBinary ''SourceState)
Manatee/Extension/Editor/SourceView.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -27,9 +27,9 @@ import Data.Text.Lazy (Text) import Data.Typeable import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)-import Graphics.UI.Gtk.Gdk.SerializedEvent import Graphics.UI.Gtk.SourceView.SourceLanguage import Graphics.UI.Gtk.SourceView.SourceLanguageManager+import Manatee.Core.Config import Manatee.Core.DBus import Manatee.Core.PageFrame import Manatee.Core.PageView@@ -63,21 +63,28 @@ pageBufferCreateView a pId = PageViewWrap <$> sourceViewNew a pId pageBufferMode = sourceBufferMode pageBufferPackageName _ = fmap takeFileName getDataDir+ pageBufferWriteState = sourceBufferWriteState+ pageBufferReadState = sourceBufferReadState instance PageView SourceView where- pageViewBuffer = PageBufferWrap . sourceViewBuffer- pageViewPlugId = sourceViewPlugId- pageViewBox = pageFrameBox . sourceViewFrame- pageViewScrolledWindow = sourceViewScrolledWindow- pageViewFocus = widgetGrabFocus . sourceViewView- pageViewCut = sourceViewCut- pageViewCopy = sourceViewCopy- pageViewPaste = sourceViewPaste- pageViewHandleKeyAction = sourceViewHandleKeyAction- pageViewScrollToTop = sourceViewScrollToTop- pageViewScrollToBottom = sourceViewScrollToBottom- pageViewScrollVerticalPage = sourceViewScrollVerticalPage- pageViewScrollVerticalStep = sourceViewScrollVerticalStep+ pageViewBuffer = PageBufferWrap . sourceViewBuffer+ pageViewPlugId = sourceViewPlugId+ pageViewFrame = sourceViewFrame+ pageViewCut = sourceViewCut+ pageViewCopy = sourceViewCopy+ pageViewPaste = sourceViewPaste+ pageViewLocalKeymap _ = sourceViewLocalKeymap+ pageViewLocalCommandMap _ = sourceViewLocalCommandMap+ pageViewFocus = widgetGrabFocus . sourceViewView+ pageViewPropagateWidget = castToWidget . sourceViewView+ pageViewSaveState view = sourceViewSaveState view Nothing+ pageViewRestoreState view = sourceViewRestoreState view Nothing+ pageViewWriteState view path = sourceViewSaveState view (Just path)+ pageViewReadState view path = sourceViewRestoreState view (Just path)+ pageViewScrollToTop = sourceViewScrollToTop+ pageViewScrollToBottom = sourceViewScrollToBottom+ pageViewScrollVerticalPage = sourceViewScrollVerticalPage+ pageViewScrollVerticalStep = sourceViewScrollVerticalStep -- | Internal function for create string buffer. sourceViewNew :: SourceBuffer -> PagePlugId -> IO SourceView@@ -145,14 +152,14 @@ sourceViewDisplayPositionStatus :: SourceView -> IO () sourceViewDisplayPositionStatus sb = liftM2 (printf "Pos (%d, %d)") (sourceViewGetLine sb) (sourceViewGetColumn sb)- >>= pageFrameUpdateStatusbar (sourceViewFrame sb) "Pos"+ >>= pageViewUpdateStatusbar sb "Pos" -- | Display percent information. sourceViewDisplayPercentStatus :: SourceView -> IO () sourceViewDisplayPercentStatus sv = do line <- sourceViewGetLine sv lineCount <- sourceViewGetLineCount sv- pageFrameUpdateStatusbar (sourceViewFrame sv) "Percent" ("(" ++ show (floor (i2d (line * 100) / i2d lineCount)) ++ "%)")+ pageViewUpdateStatusbar sv "Percent" ("(" ++ show (floor (i2d (line * 100) / i2d lineCount)) ++ "%)") -- | Handle selection mark. sourceViewHandleSelectionMark :: SourceView -> IO () @@ -198,7 +205,7 @@ string <- sourceViewGetText a writeFile filepath string name <- sourceViewName a- pageFrameShowOutputbar (sourceViewFrame a) ("Save " ++ name) Nothing+ pageViewShowOutputbar a ("Save " ++ name) Nothing -- | Get buffer name. sourceViewName :: SourceView -> IO String@@ -212,8 +219,8 @@ ifM (SB.sourceBufferGetCanUndo sb) (do SB.sourceBufferUndo sb- pageFrameShowOutputbar (sourceViewFrame a) "Undo!" Nothing)- (pageFrameShowOutputbar (sourceViewFrame a) "No further undo information." Nothing)+ pageViewShowOutputbar a "Undo!" Nothing)+ (pageViewShowOutputbar a "No further undo information." Nothing) -- | Redo. sourceViewRedo :: SourceView -> IO ()@@ -222,8 +229,8 @@ ifM (SB.sourceBufferGetCanRedo sb) (do SB.sourceBufferRedo sb- pageFrameShowOutputbar (sourceViewFrame a) "Redo!" Nothing)- (pageFrameShowOutputbar (sourceViewFrame a) "No further redo information." Nothing)+ pageViewShowOutputbar a "Redo!" Nothing)+ (pageViewShowOutputbar a "No further redo information." Nothing) -- | String view wrap user action for undo/redo. sourceViewWrapAction :: SourceView -> IO () -> IO () @@ -389,62 +396,102 @@ sourceViewSetText :: SourceView -> String -> IO () sourceViewSetText = textViewSetText . sourceViewView +-- | Local keymap.+sourceViewLocalKeymap :: Map Text Text+sourceViewLocalKeymap = + M.fromList+ [("M-a", "Select all")+ ,("M-s", "Save")+ ,("M-d", "Delete lines")+ ,("M-D", "Delete")+ ,("M-/", "Undo")+ ,("M-?", "Redo")+ ,("M-r", "Reload")+ ,("M-,", "Backward delete char")+ ,("M-.", "Forward delete char")+ ,("M-<", "Backward delete word")+ ,("M->", "Forward delete word")+ ,("C-M-,", "Delete to line start")+ ,("C-M-.", "Delete to line end")+ ,("M-j", "Forward line")+ ,("M-k", "Backward line")+ ,("M-l", "Forward char")+ ,("M-h", "Backward char")+ ,("M-m", "New line")+ ,("Down", "Forward line")+ ,("Up", "Backward line")+ ,("Left", "Forward char")+ ,("Right", "Backward char")+ ,("Return", "New line")+ ,("M-L", "Forward word")+ ,("M-H", "Backward word")+ ,("M-P-h", "Smart home")+ ,("M-P-l", "Smart end")+ ,("M-N", "Open new line below")+ ,("M-P", "Open new line above")+ ,("M-w", "Duplicate lines below")+ ,("M-W", "Duplicate lines above")+ ,("M-e", "Transposes line below")+ ,("M-E", "Transposes line above")+ ,("C-c", "Toggle selection mark")+ ,("C-C", "Exchange selection mark")+ ,("C-o", "Open file")+ ,("C-g", "Goto line")+ ,("C-G", "Goto column")+ ]+ -- | String buffer keymap.-sourceViewKeymap :: Map Text (SourceView -> IO ())-sourceViewKeymap = +sourceViewLocalCommandMap :: Map Text (SourceView -> IO ())+sourceViewLocalCommandMap = M.fromList - [("M-a", sourceViewSelectAll)- ,("M-s", sourceViewSave)- ,("M-d", sourceViewDelLines)- ,("M-D", sourceViewDelete)- ,("M-/", sourceViewUndo)- ,("M-?", sourceViewRedo)- ,("M-r", sourceViewReload)- ,("M-,", sourceViewDeleteBackwardChar)- ,("M-.", sourceViewDeleteForwardChar)- ,("M-<", sourceViewDeleteBackwardWord)- ,("M->", sourceViewDeleteForwardWord)- ,("M-C-,", sourceViewDeleteToLineStart)- ,("M-C-.", sourceViewDeleteToLineEnd)- ,("M-j", sourceViewForwardLine)- ,("M-k", sourceViewBackwardLine)- ,("M-l", sourceViewForwardChar)- ,("M-h", sourceViewBackwardChar)- ,("M-m", sourceViewNewline)- ,("Down", sourceViewForwardLine)- ,("Up", sourceViewBackwardLine)- ,("Left", sourceViewForwardChar)- ,("Right", sourceViewBackwardChar)- ,("Return", sourceViewNewline)- ,("M-L", sourceViewForwardWord)- ,("M-H", sourceViewBackwardWord)- ,("M-P-h", sourceViewSmartHome)- ,("M-P-l", sourceViewSmartEnd)- ,("M-N", sourceViewOpenNewlineBelow)- ,("M-P", sourceViewOpenNewlineAbove)- ,("M-w", sourceViewDupLinesBelow)- ,("M-W", sourceViewDupLinesAbove)- ,("M-e", sourceViewTraLinesBelow)- ,("M-E", sourceViewTraLinesAbove)- ,("C-c", sourceViewToggleSelectionMark)- ,("C-C", sourceViewExchangeSelectionMark)- ,("C-o", sourceViewOpenFile)- ,("C-g", sourceViewGotoLine)- ,("C-G", sourceViewGotoColumn)+ [("Select all", sourceViewSelectAll)+ ,("Save", sourceViewSave)+ ,("Delete lines", sourceViewDelLines)+ ,("Delete", sourceViewDelete)+ ,("Undo", sourceViewUndo)+ ,("Redo", sourceViewRedo)+ ,("Reload", sourceViewReload)+ ,("Backward delete char", sourceViewDeleteBackwardChar)+ ,("Forward delete char", sourceViewDeleteForwardChar)+ ,("Backward delete word", sourceViewDeleteBackwardWord)+ ,("Forward delete word", sourceViewDeleteForwardWord)+ ,("Delete to line start", sourceViewDeleteToLineStart)+ ,("Delete to line end", sourceViewDeleteToLineEnd)+ ,("Forward line", sourceViewForwardLine)+ ,("Backward line", sourceViewBackwardLine)+ ,("Forward char", sourceViewForwardChar)+ ,("Backward char", sourceViewBackwardChar)+ ,("New line", sourceViewNewline)+ ,("Forward word", sourceViewForwardWord)+ ,("Backward word", sourceViewBackwardWord)+ ,("Smart home", sourceViewSmartHome)+ ,("Smart end", sourceViewSmartEnd)+ ,("Open new line below", sourceViewOpenNewlineBelow)+ ,("Open new line above", sourceViewOpenNewlineAbove)+ ,("Duplicate lines below", sourceViewDupLinesBelow)+ ,("Duplicate lines above", sourceViewDupLinesAbove)+ ,("Transposes line below", sourceViewTraLinesBelow)+ ,("Transposes line above", sourceViewTraLinesAbove)+ ,("Toggle selection mark", sourceViewToggleSelectionMark)+ ,("Exchange selection mark", sourceViewExchangeSelectionMark)+ ,("Open file", sourceViewOpenFile)+ ,("Goto line", sourceViewGotoLine)+ ,("Goto column", sourceViewGotoColumn) ] -- | Open file. sourceViewOpenFile :: SourceView -> IO () sourceViewOpenFile view = - localInteractive view "fOpen file : " $ \ [path] -> + interactive view [(IFile, "Open file : ", "")] $ \ [path] -> mkDaemonSignal (pageViewClient view) NewTab (NewTabArgs "PageEditor" path []) -- | Goto column. sourceViewGotoColumn :: SourceView -> IO () sourceViewGotoColumn view@SourceView {sourceViewView = sourceView} = - localInteractive view "nColumn : " $ \ [column] -> do+ interactive view [(INum, "Column : ", "")] $ \ [column] -> do let number = read column :: Int textViewGotoColumn sourceView number+ pageViewShowOutputbar view (show [column]) Nothing -- | Goto row. sourceViewGotoLine :: SourceView -> IO ()@@ -452,7 +499,7 @@ ,sourceViewBuffer = sourceBuffer} = do let buffer = sourceBufferBuffer sourceBuffer lines <- textBufferGetLineCount buffer- localInteractive view ("nLine (1 - " ++ show lines ++ ") : ") $ \ [line] -> do+ interactive view [(INum, "Line (1 - " ++ show lines ++ ") : ", "")] $ \ [line] -> do let number = read line :: Int textViewGotoLine sourceView number @@ -460,8 +507,8 @@ sourceViewToggleSelectionMark :: SourceView -> IO () sourceViewToggleSelectionMark view = ifM (textViewToggleSelectionMark $ sourceViewView view )- (pageFrameUpdateStatusbar (sourceViewFrame view) "Selection" "Selection (Active)")- (pageFrameUpdateStatusbar (sourceViewFrame view) "Selection" "Selection (Inactive)")+ (pageViewUpdateStatusbar view "Selection" "Selection (Active)")+ (pageViewUpdateStatusbar view "Selection" "Selection (Inactive)") -- | Exchange selection mark. sourceViewExchangeSelectionMark :: SourceView -> IO ()@@ -491,16 +538,45 @@ textViewScrollVertical tv sw (if isDown then stepInc else (- stepInc)) sourceViewApplySelectionMark a --- | Handle key action.-sourceViewHandleKeyAction :: SourceView -> Text -> SerializedEvent -> IO ()-sourceViewHandleKeyAction view keystoke sEvent = - case M.lookup keystoke sourceViewKeymap of- -- Execute action when found in keymap.- Just action -> action view- -- Otherwise propagate event.- Nothing -> widgetPropagateEvent (sourceViewView view) sEvent - -- | Source view scrolled window. sourceViewScrolledWindow :: SourceView -> ScrolledWindow sourceViewScrolledWindow = pageFrameScrolledWindow . sourceViewFrame++-- | Save state.+sourceViewSaveState :: SourceView -> Maybe FilePath -> IO ()+sourceViewSaveState view@(SourceView {sourceViewBuffer = buffer}) + statePath = do+ -- Get cursor.+ line <- textBufferGetLine (sourceBufferBuffer buffer)+ column <- textBufferGetLineOffset (sourceBufferBuffer buffer)++ -- Get scroll position.+ scrolledWindowPosition <- textViewGetCursorAlign (sourceViewView view)++ -- Save state.+ let state = SourceState (Just (line, column)) scrolledWindowPosition + case statePath of+ Nothing -> writeTVarIO (sourceBufferState buffer) state+ Just path -> writeConfigPath path state++-- | Restore state.+sourceViewRestoreState :: SourceView -> Maybe FilePath -> IO ()+sourceViewRestoreState SourceView {sourceViewBuffer = buffer+ ,sourceViewView = textView} + statePath = do+ bufferState <- readTVarIO (sourceBufferState buffer)+ (SourceState cursor scrolledWindowPosition) <- + case statePath of+ Just path -> readConfigPath path bufferState+ Nothing -> return bufferState++ -- Restore cursor.+ cursor ?>= \ (line, column) -> do+ textViewGotoLine textView line+ textViewGotoColumn textView column++ -- Restore cursor alignment.+ -- TODO, we need find a way to restore TextView scroll position.+ -- textViewSetCursorAlign can't work if cursor not in visible area.+ textViewSetCursorAlign textView scrolledWindowPosition
Setup.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -19,6 +19,7 @@ import Distribution.Simple import Manatee.Core.Config import Manatee.Core.Types+import Manatee.Toolkit.Cabal.Utils import Manatee.Extension.Editor.PageMode import qualified Data.Map as M@@ -26,7 +27,7 @@ main = defaultMainWithHooks simpleUserHooks { -- Update PageTypeRule after install successful.- postInst = \ _ _ _ _ -> do+ postInst = \ _ _ pack_des lbi -> do (PageTypeRule rule) <- readConfig pageTypeRulePath (PageTypeRule M.empty) writeConfig pageTypeRulePath (PageTypeRule (M.insert "PageEditor" "manatee-editor" rule)) -- Update PageModeRule.@@ -37,4 +38,13 @@ (Right $ M.fromList $ map (\x -> (pageModeRegexp x, pageModeName x)) sourceModeList ) modeRule))+ -- Update Application info.+ let snapshotPath = getDataFilePath pack_des lbi "data/welcome/snapshot.png"+ welcomeFile = getDataFilePath pack_des lbi "data/welcome/welcome.txt"+ (WelcomeApplication apps) <- readConfig welcomeApplicationPath (WelcomeApplication M.empty)+ writeConfig welcomeApplicationPath (WelcomeApplication+ (M.insert + ("Editor", snapshotPath)+ ("PageEditor", welcomeFile, [])+ apps)) }
+ data/welcome/snapshot.png view
binary file changed (absent → 142792 bytes)
+ data/welcome/welcome.txt view
@@ -0,0 +1,24 @@+Hi, there!++Welcome to Manatee (The Haskell/Gtk+ Integrated Live Environment) !++Want to know what's it? +Please watch video: + http://www.youtube.com/watch?v=weS6zys3U8k or http://www.youtube.com/watch?v=A3DgKDVkyeM+ +How to use it?+Please read wiki page:+ http://haskell.org/haskellwiki/Manatee + +Here have some screenshot:+ http://goo.gl/MkVw+ +Please report bug or suggestion to:+ manatee-user@googlegroups.com++If you're lucky, you can find me (ManateeLazyCat) at IRC:+ (irc.freenode.net 6667 ##manatee)++Enjoy! :)++ -- Andy
manatee-editor.cabal view
@@ -1,13 +1,13 @@ name: manatee-editor-version: 0.0.8+version: 0.1.0 Cabal-Version: >= 1.6 license: GPL-3 license-file: LICENSE-copyright: (c) 2009 ~ 2010 Andy Stewart+copyright: (c) 2010 ~ 2011 Andy Stewart synopsis: Editor extension for Manatee. description: manatee-editor is editor extension for Manatee (Haskell/Gtk+ Integrated Live Environment) .- Video at (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>+ Video (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html> . Screenshots at : <http://goo.gl/MkVw> .@@ -22,16 +22,20 @@ stability: provisional category: Manatee, Editor, IDE -tested-with: GHC==6.12.3+tested-with: GHC==7.0.2 build-type: Custom +data-dir: ""+data-files: data/welcome/snapshot.png+ data/welcome/welcome.txt+ Source-Repository head type: darcs location: http://patch-tag.com/r/AndyStewart/manatee-editor Library- build-depends: base >= 4 && < 5, manatee-core >= 0.0.8, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,- containers >= 0.3.0.0, gtk-serialized-event >= 0.12.0, gtk >= 0.12.0, gtksourceview2 >= 0.12.0,+ build-depends: base >= 4 && < 5, manatee-core >= 0.1.0, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,+ containers >= 0.3.0.0, gtk >= 0.12.0, gtksourceview2 >= 0.12.0, derive, binary, text >= 0.7.1.0, bytestring >= 0.9.1.5, dbus-core, regex-tdfa, filepath exposed-modules: Manatee.Extension.Editor