Difference between revisions of "Manatee"
AndyStewart (talk | contribs) (→Video) |
m (Link to source repository dead) |
||
(67 intermediate revisions by 2 users not shown) | |||
Line 8: | Line 8: | ||
efficient like Emacs. |
efficient like Emacs. |
||
− | Manatee use |
+ | Manatee use [http://www.flickr.com/photos/48809572@N02/5031811365/lightbox/ 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. |
minimize your losses when some unexpected exception throw in extension. |
||
− | Manatee = Chrome (sandbox) + Emacs (behaviour) + GTK+ (render engine) + Haskell (concurrent) |
+ | 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 : |
Many people ask me "What's Manatee?", i think correct answer should be : |
||
Line 17: | Line 17: | ||
Depend on you how to use it. :) |
Depend on you how to use it. :) |
||
+ | == NOTE == |
||
− | Note, Manatee is not design for WM, it's design for OS, so don't compare it with XMonad, it's really different thing than WM. Please watch video to understand "what's it" : |
||
− | http://www.youtube.com/watch?v=weS6zys3U8k |
||
+ | 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 : |
||
− | In principle, Manatee just need Linux kernel and GTK+, don't need "Window Manager" or "Desktop Environment". |
||
+ | 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... |
||
== Video == |
== Video == |
||
Line 27: | Line 35: | ||
http://www.youtube.com/watch?v=weS6zys3U8k |
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 |
http://www.youtube.com/watch?v=A3DgKDVkyeM |
||
Line 38: | Line 48: | ||
http://goo.gl/MkVw |
http://goo.gl/MkVw |
||
− | == |
+ | == Hackage package == |
− | http://haskell.org/ |
+ | http://hackage.haskell.org/package/manatee |
== IRC channel == |
== IRC channel == |
||
Line 52: | Line 62: | ||
manatee-develop@googlegroups.com |
manatee-develop@googlegroups.com |
||
− | == |
+ | == Twitter == |
+ | https://twitter.com/manateelazycat |
||
− | 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 the *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 84: | 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/ |
+ | 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 92: | 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 -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: |
||
+ | Download http://hackage.haskell.org/packages/archive/cabal-install/0.10.2/cabal-install-0.10.2.tar.gz |
||
− | If you're haskell newbie, use below command to install cabal (haskell expert ignore this): |
||
− | + | 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: |
5) Install dependent Haskell library: |
||
Line 108: | Line 106: | ||
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 |
+ | 6) Install Manatee: |
+ | Install all Manatee packages (same, don't use root permission): |
||
− | 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 |
||
+ | cabal install manatee-all |
||
− | That's all, then type command manatee to play it! :) |
||
+ | If you don't want install all Manatee packages, you can install basic package like below: |
||
− | Manatee can work in Gnome, KDE and XFCE |
||
+ | cabal install manatee-core manatee-welcome manatee |
||
− | Unfortunately, Manatee can't work in XMonad, please let me know if some XMonad hacker know how to fix it. :) |
||
+ | Then choose extension package list in below to install: |
||
− | == Quick start == |
||
+ | manatee-browser |
||
− | When you first run manatee, it will show a [http://www.flickr.com/photos/48809572@N02/5154125192/lightbox/ Global Search menu] |
||
+ | manatee-editor |
||
− | In search menu, it will search different kind candidate for your input. |
||
+ | 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. |
||
− | 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. |
||
+ | That's all, then type command manatee to play it! :) |
||
− | If you type Haskell filepath, example, /path/Haskell.hs, manatee will call editor module to open /path/Haskell.hs |
||
+ | I have test, Manatee can works well in Gnome, KDE, XMonad and XFCE |
||
− | You can type pdf filepath to open in pdf viewer module, image filepath is same. |
||
+ | == Quick start == |
||
− | You also can type directory to open in file manager. |
||
+ | When you first use Manatee, will show all manatee extension in a welcome tab. |
||
− | More tips see below "Global Keymap". :) |
||
+ | Just click to use it. |
||
+ | If you don't know keymap, just hit C-/ or C-? |
||
− | == Global keymap == |
||
+ | Enjoy! :) |
||
− | F2 => Process Manager |
||
+ | == Report bug == |
||
− | F3 => RSS/Atom reader |
||
+ | Manatee is distributed framework, it allowed you install extension don't need depend each other, |
||
− | F4 => File Manager |
||
+ | 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! :) |
||
+ | == Download source code == |
||
− | F5 => Webkit browser |
||
+ | Download script from : |
||
− | F7 => Login IRC with your own nickname |
||
+ | https://patch-tag.com/r/AndyStewart/manatee/snapshot/current/content/pretty/repos.sh |
||
− | F6 => Login #haskell |
||
+ | And do |
||
− | F8 => Download Manager |
||
+ | 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 |
||
− | F11 => Toggle fullscreen |
||
+ | == Customize == |
||
− | F12 => Lock screen |
||
+ | After change configure file, re-install current package will mix configure file to build your own version. |
||
− | == Focus Interactivebar == |
||
+ | (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, |
||
− | Alt + f => Focus interactive bar |
||
+ | You can find default configure template in package (manatee-*/Config directory) |
||
− | Alt + F => Focus buffer |
||
+ | == How to write Manatee extension == |
||
− | Alt + b => Toggle focus between interactive bar and current buffer |
||
+ | Please look [http://www.flickr.com/photos/48809572@N02/5031811365/lightbox/ Framework] before continue. |
||
− | Alt + g => Close interactive bar |
||
+ | Template package at http://hackage.haskell.org/package/manatee-template |
||
− | == Interactivebar keymap == |
||
+ | First, i explain Manatee package hierarchy: |
||
− | Alt + j => Select next candidate |
||
+ | |||
+ | 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: |
||
− | Alt + k => Select previous candidate |
||
+ | instance PageBuffer TemplateBuffer where |
||
− | Alt + J => Select next search menu |
||
+ | -- Get buffer name from Template buffer. |
||
+ | pageBufferGetName = readTVarIO . templateBufferFilePath |
||
+ | -- Set buffer name. |
||
− | Alt + K => Select previous search menu |
||
+ | pageBufferSetName a = writeTVarIO (templateBufferFilePath a) |
||
+ | -- DBus client. |
||
− | Alt + N => Complete select candidate |
||
+ | pageBufferClient = templateBufferClient |
||
+ | -- How to create TemplateView from TemplateBuffer for multiple view design. |
||
− | Tab => Complete candidate for input |
||
+ | pageBufferCreateView a pId = PageViewWrap <$> templateViewNew a pId |
||
+ | -- Page mode. |
||
− | Backspace => Delete char backward |
||
+ | pageBufferMode = templateBufferMode |
||
+ | -- Get package name to update user's configure. |
||
− | Alt + , => Delete char backward |
||
+ | pageBufferPackageName _ = fmap takeFileName getDataDir |
||
+ | -- Save buffer state. |
||
− | Alt + < => Delete word backward |
||
+ | pageBufferWriteState = templateBufferWriteState |
||
+ | |||
+ | -- Restore buffer state. |
||
+ | pageBufferReadState = templateBufferReadState |
||
+ | instance PageView TemplateView where |
||
− | Alt + d => Clean input |
||
+ | -- Page buffer. |
||
+ | pageViewBuffer = PageBufferWrap . templateViewBuffer |
||
+ | |||
+ | -- GtkPlug id. |
||
+ | pageViewPlugId = templateViewPlugId |
||
+ | |||
+ | -- Page Frame. |
||
+ | pageViewFrame = templateViewFrame |
||
+ | |||
+ | -- Local keymap. |
||
+ | pageViewLocalKeymap _ = templateViewLocalKeymap |
||
+ | -- Command map. |
||
− | Alt + x => Cut input |
||
+ | pageViewLocalCommandMap _ = templateViewLocalCommandMap |
||
+ | -- How to focus when manatee focus current application. |
||
− | Alt + c => Copy input |
||
+ | pageViewFocus = widgetGrabFocus . templateViewView |
||
+ | -- Which widget to propagate event. |
||
− | Alt + v => Paste input |
||
+ | pageViewPropagateWidget = castToWidget . templateViewView |
||
+ | |||
+ | -- Save view state. |
||
+ | pageViewSaveState view = templateViewSaveState view Nothing |
||
+ | -- Restore view state. |
||
− | == Tab keymap == |
||
+ | 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. |
||
− | Alt + & => Select first tab |
||
+ | pageViewCut = templateViewCut |
||
+ | -- How to handle copy action, can ignore. |
||
− | Alt + * => Select last tab |
||
+ | pageViewCopy = templateViewCopy |
||
+ | -- How to handle paste action, can ignore. |
||
− | Alt + ' => Close current tab |
||
+ | pageViewPaste = templateViewPaste |
||
+ | -- How to scroll top postion, can ignore. |
||
− | Alt + " => Close all tabs except current one |
||
+ | pageViewScrollToTop = templateViewScrollToTop |
||
+ | -- How to scroll bottom postion, can ignore. |
||
− | Alt + 9 => Select previous tab group |
||
+ | pageViewScrollToBottom = templateViewScrollToBottom |
||
+ | -- How to scroll vertical page, can ignore. |
||
− | Alt + 0 => Select next tab group |
||
+ | pageViewScrollVerticalPage = templateViewScrollVerticalPage |
||
+ | -- How to scroll vertical step, can ignore. |
||
− | Ctrl + 7 => Move current tab to left |
||
+ | pageViewScrollVerticalStep = templateViewScrollVerticalStep |
||
+ | -- How to scroll to left side, can ignore. |
||
− | Ctrl + 8 => Move current tab to right |
||
+ | pageViewScrollToLeft = templateViewScrollToLeft |
||
+ | -- How to scroll to right side, can ignore. |
||
− | Ctrl + & => Move current tab to first |
||
+ | pageViewScrollToRight = templateViewScrollToRight |
||
+ | -- How to scroll horizontal page, can ignore. |
||
− | Ctrl + * => Move current tab to last |
||
+ | pageViewScrollHorizontalPage= templateViewScrollHorizontalPage |
||
+ | -- How to scroll horizontal step, can ignore. |
||
− | Ctrl + ' => Undo tab close action with current model |
||
+ | pageViewScrollHorizontalStep= templateViewScrollHorizontalStep |
||
− | |||
− | 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 668: | Line 304: | ||
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 695: | Line 327: | ||
Fly make |
Fly make |
||
− | + | Integrated compiler |
|
'''RSS/Atom reader''' |
'''RSS/Atom reader''' |
||
Line 769: | Line 401: | ||
'''Twitter client''' |
'''Twitter client''' |
||
+ | '''Terminal emulator''' |
||
− | == How to write Manatee extension == |
||
+ | |||
+ | Use MVC design terminal emulator replace VTE widget, or patch to VTE to support MVC. :) |
||
+ | [[Category:Pages with broken file links]] |
||
− | Add soon |
Latest revision as of 02:36, 26 April 2021
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. :)
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...
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
Screenshots
http://goo.gl/MkVw
Hackage package
http://hackage.haskell.org/package/manatee
IRC channel
irc.freenode.net 6667 ##manatee
Mailing-List
manatee-user@googlegroups.com
manatee-develop@googlegroups.com
https://twitter.com/manateelazycat
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
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! :)
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! :)
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
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)
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
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. :)