### `EdTUI`

#### Overview
`EdTUI` is a text editor widget for the [Ratatui](https://github.com/ratatui-org/ratatui) ecosystem.
It is designed to provide a light-weight user experience inspired by Vim.

```rust
use edtui::{EditorState, EditorTheme, EditorView};
use ratatui::widgets::Widget;

let mut state = EditorState::default();
EditorView::new(&mut state)
        .theme(EditorTheme::default())
        .render(area, buf)
```

### Features
- Vim-like keybindings and editing modes for efficient text manipulation.
- Normal, Insert and Visual mode.
- Clipboard: Uses the `arboard` clibpboard by default which allows copy pasting between the
  system clipboard and the editor.

### Keybindings
`EdTUI` offers a set of keybindings similar to Vim. Here are some of the most common keybindings:

##### Normal/Visual Mode:

| Keybinding              | Description                                  |
|-------------------------|----------------------------------------------|
| `i`                     | Enter Insert mode                            |
| `v`                     | Enter Visual mode                            |
| `h`, `j`, `k`, `l`      | Navigate left, down, up, and right           |
| `w`, `b`                | Move forward or backward by word             |
| `x`                     | Delete the character under the cursor        |
| `Del`                   | Delete the character left of the cursor      |
| `u`, `<ctrl>+r`         | Undo/Redo last action                        |
| `Esc`                   | Escape Insert mode or Visual mode            |
| `0`                     | Move cursor to start of line                 |
| `^`                     | Move cursor to first non-blank character     |
| `$`                     | Move cursor to end of line                   |
| `%`                     | Move cursor to closing/opening bracket       |
| `a`                     | Append after the cursor                      |
| `A`                     | Append at the end of the line                |
| `o`                     | Add a new line below and enter Insert mode   |
| `O`                     | Add a new line above and enter Insert mode   |
| `Backspace`             | Delete the previous character                |
| `d`                     | Delete the selection                         |
| `dd`                    | Delete the current line                      |
| `ciw`                   | Select between delimiters. Supported: [`"`]  |
| `u`                     | Undo the last change                         |
| `r`                     | Redo the last undone action                  |
| `y`                     | Copy the selected text                       |
| `p`                     | Paste the copied text                        |

##### Insert Mode:

| Keybinding | Description                             |
|------------|-----------------------------------------|
| `Esc`      | Return to Normal mode                   |

For more keybindings and customization options, refer to the code.

### Demo

![](resources/app.gif)

### Experimental Mouse Support

`Edtui` now includes experimental mouse support. To enable it activate the feature
```toml
[dependencies.edtui]
version = "0.7"
features = ["mouse-support"]
```
and use the mouse event handler
```rust
let event_handler = EditorEvent::default();
event_handler.on_mouse_event(mouse_event, &mut state);
```

**Note**: This feature is experimental, so expect potential bugs and breaking changes.

#### Roadmap

- [x] Clipboard
- [x] Search

- [ ] Vims `f`/`t` go to first
- [ ] Support termwiz and termion
- [ ] Display line numbers
- [ ] Remap keybindings
- [ ] Soft-wrap lines

License: MIT
