Personal tools

Manatee

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(How to write Manatee extension)
(How to write Manatee extension)
 
(29 intermediate revisions by 2 users not shown)
Line 29: Line 29:
   
 
At last, Manatee is not Emacs, Manatee is not XMond, Manatee is not Gnome... it's a new software...
 
At last, Manatee is not Emacs, Manatee is not XMond, Manatee is not Gnome... it's a new software...
 
== Hackage package ==
 
http://hackage.haskell.org/package/manatee
 
   
 
== Video ==
 
== Video ==
Line 51: Line 48:
 
http://goo.gl/MkVw
 
http://goo.gl/MkVw
   
== Manual ==
+
== Hackage package ==
   
http://haskell.org/haskellwiki/Manatee
+
http://hackage.haskell.org/package/manatee
   
 
== IRC channel ==
 
== IRC channel ==
Line 65: Line 62:
 
manatee-develop@googlegroups.com
 
manatee-develop@googlegroups.com
   
== Download source code ==
+
== Twitter ==
   
Download script from :
+
https://twitter.com/manateelazycat
 
https://patch-tag.com/r/AndyStewart/manatee/snapshot/current/content/pretty/repos.sh
 
 
And do
 
sudo chmod +x ./repos.sh && ./repos.sh get
 
 
Source code will download at *parent* directory of reposh.sh, example, if repos.sh at /home/andy/, source code will download at /home
 
 
== Report bug ==
 
 
Manatee is distributed framework, it allowed you install extension don't need depend each other,
 
but it's easy to break if some package is older core packages (manatee-core, manatee-anything, manatee),
 
so please make sure '''all''' packages has update to newest version before you report bug to
 
manatee-user@googlegroups.com . Thanks! :)
 
   
 
== Installation ==
 
== Installation ==
Line 83: Line 80:
 
This step is optional, it's okay use ld link program, just much slow. :)
 
This step is optional, it's okay use ld link program, just much slow. :)
   
2) Install GHC compiler http://www.haskell.org/ghc/download_ghc_6_12_3.html:
+
2) Install GHC compiler http://www.haskell.org/ghc/download_ghc_7_0_3:
   
 
Download ghc package for your system, then do below command :
 
Download ghc package for your system, then do below command :
Line 91: Line 88:
 
3) Install C library: In Debian use below command:
 
3) Install C library: In Debian use below command:
   
sudo aptitude install libgtksourceview2.0-dev libgconf2-dev libwebkit-dev libcurl4-openssl-dev libgtkimageview-dev libpoppler-glib-dev poppler-data libtagc0-dev libvte-dev libvte-common -y
+
sudo aptitude install libgtksourceview2.0-dev libgconf2-dev libwebkit-dev libcurl4-openssl-dev libgtkimageview-dev libpoppler-glib-dev poppler-data libtagc0-dev libvte-dev -y
   
 
4) Install cabal:
 
4) Install cabal:
   
If you're haskell newbie, use below command to install cabal (haskell expert ignore this):
+
Download http://hackage.haskell.org/packages/archive/cabal-install/0.10.2/cabal-install-0.10.2.tar.gz
  +
  +
Decompress cabal-install-0.10.2.tar.gz and do below command:
   
sudo aptitude install cabal-install -y
+
cd ./cabal-install-0.10.2 && sudo chmod +x ./bootstrap.sh && ./bootstrap.sh
   
 
5) Install dependent Haskell library:
 
5) Install dependent Haskell library:
Line 107: Line 104:
 
Then do below command (NOTE: don't use root permission with cabal, otherwise Manatee can't work):
 
Then do below command (NOTE: don't use root permission with cabal, otherwise Manatee can't work):
   
cabal update && cabal install happy c2hs gtk2hs-buildtools glib gio pango cairo gtk
+
cabal update && cabal install alex happy c2hs && cabal install gtk2hs-buildtools glib gio pango cairo gtk
   
6) Install Manatee (same, don't use root permission):
+
6) Install Manatee:
   
cabal install manatee-core manatee-anything manatee-browser manatee-editor manatee-filemanager manatee-imageviewer manatee-ircclient manatee-mplayer manatee-pdfviewer manatee-processmanager manatee-reader manatee-curl manatee-terminal manatee
+
Install all Manatee packages (same, don't use root permission):
   
That's all, then type command manatee to play it! :)
+
cabal install manatee-all
   
Manatee can work in Gnome, KDE and XFCE
+
If you don't want install all Manatee packages, you can install basic package like below:
   
Unfortunately, Manatee can't work in XMonad, please let me know if some XMonad hacker know how to fix it. :)
+
cabal install manatee-core manatee-welcome manatee
   
== Quick start ==
+
Then choose extension package list in below to install:
   
When you first run manatee, it will show a [http://www.flickr.com/photos/48809572@N02/5154125192/lightbox/ Global Search menu]
+
manatee-browser
In search menu, it will search different kind candidate for your input.
+
manatee-editor
  +
manatee-filemanager
  +
manatee-imageviewer
  +
manatee-ircclient
  +
manatee-mplayer
  +
manatee-pdfviewer
  +
manatee-processmanager
  +
manatee-reader
  +
manatee-curl
  +
manatee-terminal
   
Example, when you type http://www.google.com in it, it will show '''Browser''' candidate for you, then you hit RETURN or "Alt + m" will open link in browser.
+
Note if you don't install any extension package, nothing will show in manatee, so you at least to choose one extension to install.
   
If you type Haskell filepath, example, /path/Haskell.hs, manatee will call editor module to open /path/Haskell.hs
+
That's all, then type command manatee to play it! :)
   
You can type pdf filepath to open in pdf viewer module, image filepath is same.
+
I have test, Manatee can works well in Gnome, KDE, XMonad and XFCE
   
You also can type directory to open in file manager.
+
== Quick start ==
   
More tips see below "Global Keymap". :)
+
When you first use Manatee, will show all manatee extension in a welcome tab.
  +
Just click to use it.
   
== Customize ==
+
If you don't know keymap, just hit C-/ or C-?
   
After change configure file, re-install current package will mix configure file to build your own version.
+
Enjoy! :)
(Or press "Ctrl + i" in current application)
 
   
Manatee developer can press "Ctrl + u" to debug configure file in '''runtime''', you still need to re-install the current package if you want to start the configuration file take effect the next time,
+
== Report bug ==
   
You can find default configure template in package (Config directory)
+
Manatee is distributed framework, it allowed you install extension don't need depend each other,
  +
but it's easy to break if some package is older than core packages (manatee-core, manatee),
  +
so please make sure '''all''' packages has update to newest version before you report bug to
  +
manatee-user@googlegroups.com . Thanks! :)
   
== Global keymap ==
+
== Download source code ==
   
F2 => Process Manager
+
Download script from :
   
F3 => RSS/Atom reader
+
https://patch-tag.com/r/AndyStewart/manatee/snapshot/current/content/pretty/repos.sh
   
F4 => File Manager
+
And do
  +
sudo chmod +x ./repos.sh && ./repos.sh get
   
F5 => Webkit browser
+
Source code will download at *parent* directory of reposh.sh, example, if repos.sh at /home/andy/, source code will download at /home
   
F7 => Login IRC with your own nickname
+
== Customize ==
   
F6 => Login #haskell
+
After change configure file, re-install current package will mix configure file to build your own version.
  +
(Or press "Ctrl + i" in current application)
   
F8 => Download Manager
+
Manatee developer can press "Ctrl + u" to debug configure file in '''runtime''', you still need to re-install the current package if you want to start the configuration file take effect the next time,
   
F11 => Toggle fullscreen
+
You can find default configure template in package (manatee-*/Config directory)
   
F12 => Lock screen
+
== How to write Manatee extension ==
   
Super + n => Terminal emulator
+
Please look [http://www.flickr.com/photos/48809572@N02/5031811365/lightbox/ Framework] before continue.
   
== Misc Keymap ==
+
Template package at http://hackage.haskell.org/package/manatee-template
   
Ctrl + u => Debug configure file at runtime
+
First, i explain Manatee package hierarchy:
  +
  +
manatee-core contain DBus protocol detail and toolkit use in other manatee packages.
  +
  +
manatee-welcome is use for show welcome page for manatee extension.
  +
  +
manatee contain daemon process,
  +
Daemon process is root process to manage other manatee processes:
  +
such as render application process' graphics for sandbox protected, window manage ... etc.
  +
Daemon process just do manage job and don't running any special application code in it.
  +
  +
Other manatee-* package, such as manatee-editor, manatee-browser...etc running in
  +
it's own process, you can write any code to implement your application,
  +
just need follow some interface:
   
Ctrl + i => Install configure file
+
Manatee application interface:
   
Alt + [ => Jump buffer directory
+
instance PageBuffer TemplateBuffer where
  +
-- Get buffer name from Template buffer.
  +
pageBufferGetName = readTVarIO . templateBufferFilePath
   
== Focus Interactivebar ==
+
-- Set buffer name.
  +
pageBufferSetName a = writeTVarIO (templateBufferFilePath a)
   
Alt + f => Focus interactive bar
+
-- DBus client.
  +
pageBufferClient = templateBufferClient
   
Alt + F => Focus buffer
+
-- How to create TemplateView from TemplateBuffer for multiple view design.
  +
pageBufferCreateView a pId = PageViewWrap <$> templateViewNew a pId
   
Alt + b => Toggle focus between interactive bar and current buffer
+
-- Page mode.
  +
pageBufferMode = templateBufferMode
   
Alt + g => Close interactive bar
+
-- Get package name to update user's configure.
  +
pageBufferPackageName _ = fmap takeFileName getDataDir
   
== Interactivebar keymap ==
+
-- Save buffer state.
  +
pageBufferWriteState = templateBufferWriteState
  +
  +
-- Restore buffer state.
  +
pageBufferReadState = templateBufferReadState
   
Alt + j => Select next candidate
+
instance PageView TemplateView where
  +
-- Page buffer.
  +
pageViewBuffer = PageBufferWrap . templateViewBuffer
  +
  +
-- GtkPlug id.
  +
pageViewPlugId = templateViewPlugId
  +
  +
-- Page Frame.
  +
pageViewFrame = templateViewFrame
  +
  +
-- Local keymap.
  +
pageViewLocalKeymap _ = templateViewLocalKeymap
   
Alt + k => Select previous candidate
+
-- Command map.
  +
pageViewLocalCommandMap _ = templateViewLocalCommandMap
   
Alt + J => Select next search menu
+
-- How to focus when manatee focus current application.
  +
pageViewFocus = widgetGrabFocus . templateViewView
   
Alt + K => Select previous search menu
+
-- Which widget to propagate event.
  +
pageViewPropagateWidget = castToWidget . templateViewView
  +
  +
-- Save view state.
  +
pageViewSaveState view = templateViewSaveState view Nothing
   
Alt + N => Complete select candidate
+
-- Restore view state.
  +
pageViewRestoreState view = templateViewRestoreState view Nothing
   
Tab => Complete candidate for input
+
-- Save view state to file.
  +
pageViewWriteState view path = templateViewSaveState view (Just path)
   
Backspace => Delete char backward
+
-- Restore view state from file.
  +
pageViewReadState view path = templateViewRestoreState view (Just path)
   
Alt + , => Delete char backward
+
-- How to handle cut action, can ignore.
  +
pageViewCut = templateViewCut
   
Alt + < => Delete word backward
+
-- How to handle copy action, can ignore.
  +
pageViewCopy = templateViewCopy
   
Alt + d => Clean input
+
-- How to handle paste action, can ignore.
  +
pageViewPaste = templateViewPaste
   
Alt + x => Cut input
+
-- How to scroll top postion, can ignore.
  +
pageViewScrollToTop = templateViewScrollToTop
   
Alt + c => Copy input
+
-- How to scroll bottom postion, can ignore.
  +
pageViewScrollToBottom = templateViewScrollToBottom
   
Alt + v => Paste input
+
-- How to scroll vertical page, can ignore.
  +
pageViewScrollVerticalPage = templateViewScrollVerticalPage
   
== Tab keymap ==
+
-- How to scroll vertical step, can ignore.
  +
pageViewScrollVerticalStep = templateViewScrollVerticalStep
   
Alt + 7 => Select left tab
+
-- How to scroll to left side, can ignore.
  +
pageViewScrollToLeft = templateViewScrollToLeft
   
Alt + 8 => Select right tab
+
-- How to scroll to right side, can ignore.
  +
pageViewScrollToRight = templateViewScrollToRight
   
Alt + & => Select first tab
+
-- How to scroll horizontal page, can ignore.
  +
pageViewScrollHorizontalPage= templateViewScrollHorizontalPage
   
Alt + * => Select last tab
+
-- How to scroll horizontal step, can ignore.
+
pageViewScrollHorizontalStep= templateViewScrollHorizontalStep
Alt + ' => Close current tab
 
 
Alt + " => Close all tabs except current one
 
 
Alt + 9 => Select previous tab group
 
 
Alt + 0 => Select next tab group
 
 
Ctrl + 7 => Move current tab to left
 
 
Ctrl + 8 => Move current tab to right
 
 
Ctrl + & => Move current tab to first
 
 
Ctrl + * => Move current tab to last
 
 
Ctrl + ' => Undo tab close action with current model
 
 
Ctrl + " => Undo tab close action globally
 
 
== Window keymap ==
 
 
Alt + t => Split current window vertically
 
 
Alt + T => Split current window hortizontally
 
 
Alt + n => Select next window
 
 
Alt + p => Select previous window
 
 
Alt + ; => Close current window
 
 
Alt + : => Close all windows except current one
 
 
Super + . => Enlarge current window
 
 
Super + , => Shrink current window
 
 
Super + j => Enlarge window down
 
 
Super + k => Enlarge window up
 
 
Super + h => Enlarge window left
 
 
Super + l => Enlarge window right
 
 
Super + J => Shrink window down
 
 
Super + K => Shrink window up
 
 
Super + H => Shrink window left
 
 
Super + L => Shrink window right
 
 
== Browser keymap ==
 
 
Alt + r => Reload current page
 
 
Alt + R => Reload current page without use cache
 
 
Alt + , => Backward history
 
 
Alt + . => Forward history
 
 
Alt + - => Zoom out page
 
 
Alt + = => Zoom in page
 
 
== Editor keymap ==
 
 
Alt + a => sourceViewSelectAll
 
 
Alt + s => sourceViewSave
 
 
Alt + d => sourceViewDelLines
 
 
Alt + D => sourceViewDelete
 
 
Alt + / => sourceViewUndo
 
 
Alt + ? => sourceViewRedo
 
 
Alt + r => sourceViewReload
 
 
Alt + , => sourceViewDeleteBackwardChar
 
 
Alt + . => sourceViewDeleteForwardChar
 
 
Alt + < => sourceViewDeleteBackwardWord
 
 
Alt + > => sourceViewDeleteForwardWord
 
 
Alt + Ctrl + , => sourceViewDeleteToLineStart
 
 
Alt + Ctrl + . => sourceViewDeleteToLineEnd
 
 
Alt + j => sourceViewForwardLine
 
 
Alt + k => sourceViewBackwardLine
 
 
Alt + l => sourceViewForwardChar
 
 
Alt + h => sourceViewBackwardChar
 
 
Alt + m => sourceViewNewline
 
 
Alt + L => sourceViewForwardWord
 
 
Alt + H => sourceViewBackwardWord
 
 
Alt + Super + h => sourceViewSmartHome
 
 
Alt + Super + l => sourceViewSmartEnd
 
 
Alt + N => sourceViewOpenNewlineBelow
 
 
Alt + P => sourceViewOpenNewlineAbove
 
 
Alt + w => sourceViewDupLinesBelow
 
 
Alt + W => sourceViewDupLinesAbove
 
 
Alt + e => sourceViewTraLinesBelow
 
 
Alt + E => sourceViewTraLinesAbove
 
 
Ctrl + c => sourceViewToggleSelectionMark
 
 
Ctrl + C => sourceViewExchangeSelectionMark
 
 
Ctrl + o => sourceViewOpenFile
 
 
Ctrl + g => sourceViewGotoLine
 
 
Ctrl + G => sourceViewGotoColumn
 
 
== File Manager keymap ==
 
 
j => next file
 
 
k => previous file
 
 
J => scroll to bottom
 
 
K => scroll to top
 
 
Space => scroll page up
 
 
b => scroll page down
 
 
n => sort by name.
 
 
x => sort by extension type
 
 
s => sort by size
 
 
t => sort by time
 
 
' => jump upper directory
 
 
\ => open upper directory in new tab
 
 
m => open directory or file
 
 
M => open directory in new tab
 
 
== Image Viewer keymap ==
 
 
j => scroll up
 
 
k => scroll down
 
 
h => scroll right
 
 
l => scroll left
 
 
Space => scroll page up
 
 
b => scroll page down
 
 
J => scroll to bottom
 
 
K => scroll to up
 
 
, => zoom image out
 
 
. => zoom image in
 
 
m => zoom image to screen size
 
 
n => next image
 
 
p => prevoius image
 
 
N => last image
 
 
P => first image
 
 
< => rotate left
 
 
> => rotate right
 
 
/ => rotate mirror
 
 
s => auto show
 
 
B => set as background (just work for gnome)
 
 
== IRC client keymap ==
 
 
Alt + m => send message
 
 
Ctrl + m => translate message and send
 
 
Ctrl + n => switch mother-language and translate language
 
 
Ctrl + N => send morse code
 
 
Alt + M => move to prompt position
 
 
Alt + N => clean input
 
 
Alt + a => select all
 
 
Alt + d => delete lines
 
 
Alt + D => delete selection
 
 
Alt + , => delete char backward
 
 
Alt + . => delete char forward
 
 
Alt + < => delete word backward
 
 
Alt + > => delete word forward
 
 
Alt + Ctrl + , => delete to line start
 
 
Alt + Ctrl + . => delete to line end
 
 
Alt + j => forward line
 
 
Alt + k => backward line
 
 
Alt + l => forward char
 
 
Alt + h => backward char
 
 
Alt + L => forward word
 
 
Alt + H => backward word
 
 
Alt + Super + h => smart home
 
 
Alt + Super + l => smart end
 
 
Ctrl + c => toggle select mark
 
 
Ctrl + C => exchange select mark
 
 
Ctrl + o => open url in browser
 
 
Ctrl + j => translate message
 
 
Ctrl + J => translate morse code
 
 
Ctrl + k => read IRC message (need install festival in your system)
 
 
You can use below command install festival in Debian system:
 
 
sudo aptitude install festival esound-clients -y
 
 
== Player keymap ==
 
 
j => select next song
 
 
k => select previous sogn
 
 
J => scroll to bottom
 
 
K => scroll to top
 
 
Space => scroll page up
 
 
b => scroll page down
 
 
m => play current song
 
 
M => play or pause
 
 
z => stop
 
 
h => play forward
 
 
l => play backward
 
 
, => volume decrease
 
 
. => volume increase
 
 
n => play next
 
 
p => play previous
 
 
N => play random
 
 
P => switch play mode
 
 
1 => sort by title
 
 
2 => sort by album
 
 
3 => sort by artist
 
 
4 => sort by year
 
 
5 => sort by track
 
 
6 => sort by bitrate
 
 
7 => sort by duration
 
 
== PDF viewer keymap ==
 
 
j => scroll up
 
 
k => scroll down
 
 
Space => scroll page up
 
 
b => scroll page down
 
 
J => scroll to bottom
 
 
K => scroll to up
 
 
n => next page
 
 
p => previous page
 
 
N => last page
 
 
P => first page
 
 
g => go page.
 
 
== Process manager keymap ==
 
 
j => scroll up
 
 
k => scroll down
 
 
Space => scroll page up
 
 
b => scroll page down
 
 
J => scroll to bottom
 
 
K => scroll to up
 
 
; => kill process
 
 
1 => sort by name
 
 
2 => sort by processid
 
 
3 => sort by user
 
 
4 => sort by state
 
 
5 => sort by memory
 
 
6 => sort by cpu
 
 
7 => sort by priority
 
 
8 => sort by threads
 
 
9 => sort by cmdline
 
 
== RSS/Atom reader ==
 
 
n => next feed
 
 
p => previous feed
 
 
N => last feed
 
 
P => first feed
 
 
j => next news
 
 
k => previous news
 
 
J => last news
 
 
K => first news
 
 
, => scroll news up
 
 
. => scroll news down
 
 
Space => scroll news page up
 
 
b => scroll news page down
 
 
m => open news in browser
 
 
== Manatee Curl (Download Manager) ==
 
 
j => next item
 
 
k => previous item
 
 
J => scroll to bottom
 
 
K => scroll to top
 
 
SPACE => scroll page up
 
 
b => scroll page down
 
 
a => add new download
 
 
d => delete current download
 
 
p => pause
 
 
P => pause all
 
 
n => continue
 
 
N => continu all
 
 
f => jump to file
 
 
m => open file
 
 
3 => sort by name
 
 
4 => sort by size
 
 
6 => sort by speed
 
 
7 => sort by resttime
 
 
8 => sort by thread
 
 
9 => sort by url
 
   
 
== Todo ==
 
== Todo ==
Line 236: Line 233:
   
 
Convert haskell config to graphics make it easy to customize.
 
Convert haskell config to graphics make it easy to customize.
 
'''Hot Swap'''
 
 
Mix [https://patch-tag.com/r/AndyStewart/pdynload/home pdynload] in current framework to support dynmic update in runtime like Emacs.
 
   
 
'''Browser'''
 
'''Browser'''
Line 263: Line 256:
 
Fly make
 
Fly make
   
Integrate compiler
+
Integrated compiler
   
 
'''RSS/Atom reader'''
 
'''RSS/Atom reader'''
Line 340: Line 333:
   
 
Use MVC design terminal emulator replace VTE widget, or patch to VTE to support MVC. :)
 
Use MVC design terminal emulator replace VTE widget, or patch to VTE to support MVC. :)
 
== How to write Manatee extension ==
 
 
First, i explain Manatee package hierarchy:
 
 
manatee-core contain DBus protocol detail and toolkit use in other manatee packages.
 
 
manatee-anything is multi-task search interface for user input.
 
 
manatee contain daemon process,
 
Daemon process is root process to manage other manatee processes:
 
such as render application process' graphics for sandbox protected, window manage ... etc.
 
Daemon process just do manage job and don't running any special application code in it.
 
 
Other manatee-* package, such as manatee-editor, manatee-browser...etc running in
 
it's own process, you can write any code to implement your application,
 
just need follow some interface:
 
 
Manatee application interface:
 

Latest revision as of 04:30, 14 May 2011

Contents

[edit] 1 Introduction

Manatee is Haskell integrated environment written in Haskell.

The goal of the Manatee project is to provide a fast, safe and flexible integrated environment for haskell hacking.

You can consider it is new environment mix Gnome and Emacs. Like Gnome to provide friendly graphics interface and work efficient like Emacs.

Manatee use Multi-Process Framework, any extension (include core) running in separate process to protected core won't crash. So it minimize your losses when some unexpected exception throw in extension.

Manatee = Chrome (sandbox) + Emacs (behaviour) + GTK+ (render engine) + Haskell (concurrent) + Me (idea)

Many people ask me "What's Manatee?", i think correct answer should be :

   Depend on you how to use it. :)

[edit] 2 NOTE

Manatee is not design for WM, it's design for OS, so don't compare it with XMonad, it's really different thing with XMonad. Please watch Window split feature carefully in video to understand the difference, Manatee can split unlimited window for same application :

   http://www.youtube.com/watch?v=weS6zys3U8k or  http://www.youtube.com/watch?v=A3DgKDVkyeM

In principle, Manatee just need Linux kernel and GTK+, don't need the help of "Window Manager" or "Desktop Environment".

Manatee is open application framework, you can write any extension or plugins for Manatee, I won't limit it, you just need follow some interface API i build.

This project still in early development, many features are missing, so i DON'T recommend use it as produce tool, just play it and report bug.  :)

At last, Manatee is not Emacs, Manatee is not XMond, Manatee is not Gnome... it's a new software...

[edit] 3 Video

HD version :

   http://www.youtube.com/watch?v=weS6zys3U8k

Above video include Owl City's music, if you can't watch it, try below video, without sound:

   http://www.youtube.com/watch?v=A3DgKDVkyeM

Chinese people (this version is not clear, please fighting GFW access YouTube.com):

   http://v.youku.com/v_show/id_XMjI2MDMzODI4.html

[edit] 4 Screenshots

   http://goo.gl/MkVw

[edit] 5 Hackage package

   http://hackage.haskell.org/package/manatee

[edit] 6 IRC channel

   irc.freenode.net 6667 ##manatee

[edit] 7 Mailing-List

   manatee-user@googlegroups.com 
   manatee-develop@googlegroups.com

[edit] 8 Twitter

 https://twitter.com/manateelazycat

[edit] 9 Installation

Below is build step for Manatee:

1) Install gold-linker to accelerate installation:

I suggest use gold-linker instead ld to accelerate installation.

In Debian system, you just need do below command:

sudo aptitude install binutils-gold -y

This step is optional, it's okay use ld link program, just much slow. :)

2) Install GHC compiler http://www.haskell.org/ghc/download_ghc_7_0_3:

Download ghc package for your system, then do below command :

./configure && sudo make install

3) Install C library: In Debian use below command:

sudo aptitude install libgtksourceview2.0-dev libgconf2-dev libwebkit-dev libcurl4-openssl-dev libgtkimageview-dev libpoppler-glib-dev poppler-data libtagc0-dev libvte-dev -y

4) Install cabal:

Download http://hackage.haskell.org/packages/archive/cabal-install/0.10.2/cabal-install-0.10.2.tar.gz

Decompress cabal-install-0.10.2.tar.gz and do below command:

cd ./cabal-install-0.10.2 && sudo chmod +x ./bootstrap.sh && ./bootstrap.sh

5) Install dependent Haskell library:

First make sure HOME/.cabal/bin/ in your PATH

Generic way is add `PATH=$PATH:~/.cabal/bin` in your ~/.bashrc

Then do below command (NOTE: don't use root permission with cabal, otherwise Manatee can't work):

cabal update && cabal install alex happy c2hs && cabal install gtk2hs-buildtools glib gio pango cairo gtk

6) Install Manatee:

Install all Manatee packages (same, don't use root permission):

cabal install manatee-all

If you don't want install all Manatee packages, you can install basic package like below:

cabal install manatee-core manatee-welcome manatee

Then choose extension package list in below to install:

manatee-browser
manatee-editor
manatee-filemanager
manatee-imageviewer
manatee-ircclient
manatee-mplayer
manatee-pdfviewer
manatee-processmanager
manatee-reader
manatee-curl
manatee-terminal

Note if you don't install any extension package, nothing will show in manatee, so you at least to choose one extension to install.

That's all, then type command manatee to play it! :)

I have test, Manatee can works well in Gnome, KDE, XMonad and XFCE

[edit] 10 Quick start

When you first use Manatee, will show all manatee extension in a welcome tab. Just click to use it.

If you don't know keymap, just hit C-/ or C-?

Enjoy! :)

[edit] 11 Report bug

Manatee is distributed framework, it allowed you install extension don't need depend each other, but it's easy to break if some package is older than core packages (manatee-core, manatee), so please make sure all packages has update to newest version before you report bug to manatee-user@googlegroups.com . Thanks! :)

[edit] 12 Download source code

Download script from :

   https://patch-tag.com/r/AndyStewart/manatee/snapshot/current/content/pretty/repos.sh

And do

   sudo chmod +x ./repos.sh && ./repos.sh get

Source code will download at *parent* directory of reposh.sh, example, if repos.sh at /home/andy/, source code will download at /home

[edit] 13 Customize

After change configure file, re-install current package will mix configure file to build your own version. (Or press "Ctrl + i" in current application)

Manatee developer can press "Ctrl + u" to debug configure file in runtime, you still need to re-install the current package if you want to start the configuration file take effect the next time,

You can find default configure template in package (manatee-*/Config directory)

[edit] 14 How to write Manatee extension

Please look Framework before continue.

Template package at http://hackage.haskell.org/package/manatee-template

First, i explain Manatee package hierarchy:

  manatee-core contain DBus protocol detail and toolkit use in other manatee packages.
  
  manatee-welcome is use for show welcome page for manatee extension.
  
  manatee contain daemon process, 
  Daemon process is root process to manage other manatee processes:
  such as render application process' graphics for sandbox protected, window manage ... etc.
  Daemon process just do manage job and don't running any special application code in it.
   
  Other manatee-* package, such as manatee-editor, manatee-browser...etc running in
  it's own process, you can write any code to implement your application,
  just need follow some interface:

Manatee application interface:

instance PageBuffer TemplateBuffer where

   -- Get buffer name from Template buffer.
   pageBufferGetName           = readTVarIO . templateBufferFilePath
   -- Set buffer name.
   pageBufferSetName a         = writeTVarIO (templateBufferFilePath a)
   -- DBus client.
   pageBufferClient            = templateBufferClient
   -- How to create TemplateView from TemplateBuffer for multiple view design.
   pageBufferCreateView a pId  = PageViewWrap <$> templateViewNew a pId
   -- Page mode.
   pageBufferMode              = templateBufferMode
   -- Get package name to update user's configure.
   pageBufferPackageName _     = fmap takeFileName getDataDir
   -- Save buffer state.
   pageBufferWriteState        = templateBufferWriteState
   
   -- Restore buffer state.
   pageBufferReadState         = templateBufferReadState

instance PageView TemplateView where

   -- Page buffer.
   pageViewBuffer                = PageBufferWrap . templateViewBuffer
                                 
   -- GtkPlug id.                
   pageViewPlugId                = templateViewPlugId
                                 
   -- Page Frame.                
   pageViewFrame                 = templateViewFrame
                                 
   -- Local keymap.              
   pageViewLocalKeymap _         = templateViewLocalKeymap
   -- Command map.
   pageViewLocalCommandMap _     = templateViewLocalCommandMap
   -- How to focus when manatee focus current application.
   pageViewFocus                 = widgetGrabFocus . templateViewView
   -- Which widget to propagate event.
   pageViewPropagateWidget       = castToWidget . templateViewView
                                
   -- Save view state.          
   pageViewSaveState view        = templateViewSaveState view Nothing
   -- Restore view state.
   pageViewRestoreState view     = templateViewRestoreState view Nothing
   -- Save view state to file.
   pageViewWriteState view path  = templateViewSaveState view (Just path)
   -- Restore view state from file.
   pageViewReadState view path   = templateViewRestoreState view (Just path)
   -- How to handle cut action, can ignore.
   pageViewCut                 = templateViewCut
   -- How to handle copy action, can ignore.
   pageViewCopy                = templateViewCopy
   -- How to handle paste action, can ignore.
   pageViewPaste               = templateViewPaste
   -- How to scroll top postion, can ignore.
   pageViewScrollToTop         = templateViewScrollToTop
   -- How to scroll bottom postion, can ignore.
   pageViewScrollToBottom      = templateViewScrollToBottom
   -- How to scroll vertical page, can ignore.
   pageViewScrollVerticalPage  = templateViewScrollVerticalPage
   -- How to scroll vertical step, can ignore.
   pageViewScrollVerticalStep  = templateViewScrollVerticalStep
   -- How to scroll to left side, can ignore.
   pageViewScrollToLeft        = templateViewScrollToLeft
   -- How to scroll to right side, can ignore.
   pageViewScrollToRight       = templateViewScrollToRight
   -- How to scroll horizontal page, can ignore.
   pageViewScrollHorizontalPage= templateViewScrollHorizontalPage
   -- How to scroll horizontal step, can ignore.
   pageViewScrollHorizontalStep= templateViewScrollHorizontalStep

[edit] 15 Todo

Optimise Code

Core

Perfect library gtk-serialized-event to support all GTK+ event

Support input method

Search class interface

Customize System

Convert haskell config to graphics make it easy to customize.

Browser

Javascript framework

Save password

Auto fill

Cache support

Integrate Google SafeBrowse.

IDE features:

Code completion

Code snippet

Fly check

Fly make

Integrated compiler

RSS/Atom reader

Offline view support

IRC client

SSL support (change code in library fastirc)

Support more command

Support private chat

Support log

Image Viewer

Display current image index

Fullscreen display

Support orientation, need binding library libextractor first.

Pdf Viewer

Support Zoom

Process Manager

Draw CPU log

Mail-Client

Support mail search

Support offline view

Org-Mode

Build OrgMode for TODO manage.

Session Manager

Support different layout switch

Proxy interface

Build rule to provide proxy interface for Manatee.

File Manager

Basic operation: create, copy, delete.

History forward/backward support.

Multi-Language dictionary

CHM viewer

Binding library libchm first.

PS viewer

Binding library libspectre first.

DVI viewer

Binding djvu first.

BT-Client

Twitter client

Terminal emulator

Use MVC design terminal emulator replace VTE widget, or patch to VTE to support MVC. :)