brick-0.18: A declarative terminal user interface library

Safe Haskell | None
Language | Haskell2010

Brick.Widgets.Edit

Contents

- Constructing an editor
- Reading editor contents
- Handling events
- Editing text
- Lenses for working with editors
- Rendering editors
- Attributes

Description

This module provides a basic text editor widget. You'll need to embed an `Editor` in your application state and transform it with `handleEvent` when relevant events arrive. To get the contents of the editor, just use `getEditContents`. To modify it, use the `TextZipper` interface with `applyEdit`.

The editor's `handleEditorEvent` function handles a set of basic input events that should suffice for most purposes; see the source for a complete list.

Bear in mind that the editor provided by this module is intended to provide basic input support for brick applications but it is not intended to be a replacement for your favorite editor such as Vim or Emacs. It is also not suitable for building sophisticated editors. If you want to build your own editor, I suggest starting from scratch.

Synopsis

- data Editor t n
- editor :: GenericTextZipper a => n -> ([a] -> Widget n) -> Maybe Int -> a -> Editor a n
- editorText :: n -> ([Text] -> Widget n) -> Maybe Int -> Text -> Editor Text n
- getEditContents :: Monoid t => Editor t n -> [t]
- handleEditorEvent :: (Eq t, Monoid t) => Event -> Editor t n -> EventM n (Editor t n)
- applyEdit :: (TextZipper t -> TextZipper t) -> Editor t n -> Editor t n
- editContentsL :: forall t n. Lens' (Editor t n) (TextZipper t)
- editDrawContentsL :: forall t n. Lens' (Editor t n) ([t] -> Widget n)
- renderEditor :: (Ord n, Show n, Monoid t, TextWidth t, GenericTextZipper t) => Bool -> Editor t n -> Widget n
- editAttr :: AttrName
- editFocusedAttr :: AttrName

# Documentation

data Editor t n Source #

Editor state. Editors support the following events by default:

- Ctrl-a: go to beginning of line
- Ctrl-e: go to end of line
- Ctrl-d, Del: delete character at cursor position
- Backspace: delete character prior to cursor position
- Ctrl-k: delete all from cursor to end of line
- Ctrl-u: delete all from cursor to beginning of line
- Arrow keys: move cursor
- Enter: break the current line at the cursor position

Instances

(Show t, Show n) => Show (Editor t n) Source # |
Methods showsPrec :: Int -> Editor t n -> ShowS # show :: Editor t n -> String # showList :: [Editor t n] -> ShowS #
Named (Editor t n) n Source # |
Methods getName :: Editor t n -> n Source #

# Constructing an editor

editor Source #

Arguments

:: GenericTextZipper a |
=> n | The editor's name (must be unique)
-> ([a] -> Widget n) | The content rendering function
-> Maybe Int | The limit on the number of lines in the editor (`Nothing` means no limit)
-> a | The initial content
-> Editor a n |

Construct an editor over `String` values

editorText Source #

Arguments

:: n | The editor's name (must be unique)
-> ([Text] -> Widget n) | The content rendering function
-> Maybe Int | The limit on the number of lines in the editor (`Nothing` means no limit)
-> Text | The initial content
-> Editor Text n |

Construct an editor over `Text` values

# Reading editor contents

getEditContents :: Monoid t => Editor t n -> [t] Source #

Get the contents of the editor.

# Handling events

handleEditorEvent :: (Eq t, Monoid t) => Event -> Editor t n -> EventM n (Editor t n) Source #

# Editing text

applyEdit Source #

Arguments

:: (TextZipper t -> TextZipper t) | The `Zipper` editing transformation to apply
-> Editor t n |
-> Editor t n |

Apply an editing operation to the editor's contents. Bear in mind that you should only apply zipper operations that operate on the current line; the editor will only ever render the first line of text.

# Lenses for working with editors

editContentsL :: forall t n. Lens' (Editor t n) (TextZipper t) Source #

editDrawContentsL :: forall t n. Lens' (Editor t n) ([t] -> Widget n) Source #

# Rendering editors

renderEditor Source #

Arguments

:: (Ord n, Show n, Monoid t, TextWidth t, GenericTextZipper t) |
=> Bool | Whether the editor has focus. It will report a cursor position if and only if it has focus.
-> Editor t n | The editor.
-> Widget n |

Turn an editor state value into a widget. This uses the editor's name for its scrollable viewport handle and the name is also used to report mouse events.

# Attributes

editAttr :: AttrName Source #

The attribute assigned to the editor when it does not have focus.

editFocusedAttr :: AttrName Source #

The attribute assigned to the editor when it has focus. Extends `editAttr`.