1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-09-08 08:25:51 +03:00
Этот коммит содержится в:
rhysd
2023-10-24 15:32:39 +09:00
родитель e3783d1baf 1625ad6bc8
Коммит 8f2594bbc5
29 изменённых файлов: 434 добавлений и 348 удалений

Просмотреть файл

@@ -1,3 +1,3 @@
[alias] [alias]
watch-check = ["watch", "-x", "clippy --features ratatui-crossterm,search --no-default-features --examples --tests", "-x", "clippy --features search --examples --tests"] watch-check = ["watch", "-x", "clippy --features search --examples --tests", "-x", "clippy --features tuirs-crossterm,search --no-default-features --examples --tests"]
watch-test = ["watch", "-x", "test --features=search", "-w", "src", "-w", "tests"] watch-test = ["watch", "-x", "test --features=search", "-w", "src", "-w", "tests"]

21
.github/workflows/ci.yml поставляемый
Просмотреть файл

@@ -15,12 +15,11 @@ jobs:
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2 - uses: Swatinem/rust-cache@v2
- run: cargo test --features=search - run: cargo test --features=search
- run: cargo test --no-default-features --features=ratatui-crossterm,search -- --skip .rs - run: cargo test --no-default-features --features=tuirs-crossterm,search -- --skip .rs
- run: cargo test --no-default-features --features=ratatui-termion,search -- --skip .rs - run: cargo test --no-default-features --features=tuirs-termion,search -- --skip .rs
if: ${{ matrix.os != 'windows-latest' }} if: ${{ matrix.os != 'windows-latest' }}
- run: cargo test --no-default-features --features=ratatui-termwiz,search -- --skip .rs
- run: cargo test --no-default-features --features=your-backend,search -- --skip .rs - run: cargo test --no-default-features --features=your-backend,search -- --skip .rs
- run: cargo test --no-default-features --features=ratatui-your-backend,search -- --skip .rs - run: cargo test --no-default-features --features=tuirs-your-backend,search -- --skip .rs
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -32,16 +31,14 @@ jobs:
- run: cargo fmt -- --check - run: cargo fmt -- --check
- run: cargo clippy --examples -- -D warnings - run: cargo clippy --examples -- -D warnings
- run: cargo clippy --examples --features search -- -D warnings - run: cargo clippy --examples --features search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-crossterm -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-crossterm,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termion -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termion,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termwiz -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-termwiz,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features termion -- -D warnings - run: cargo clippy --examples --no-default-features --features termion -- -D warnings
- run: cargo clippy --examples --no-default-features --features termion,search -- -D warnings - run: cargo clippy --examples --no-default-features --features termion,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features your-backend -- -D warnings - run: cargo clippy --examples --no-default-features --features your-backend -- -D warnings
- run: cargo clippy --examples --no-default-features --features your-backend,search -- -D warnings - run: cargo clippy --examples --no-default-features --features your-backend,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-your-backend -- -D warnings - run: cargo clippy --examples --no-default-features --features tuirs-crossterm -- -D warnings
- run: cargo clippy --examples --no-default-features --features ratatui-your-backend,search -- -D warnings - run: cargo clippy --examples --no-default-features --features tuirs-crossterm,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-termion -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-termion,search -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-your-backend -- -D warnings
- run: cargo clippy --examples --no-default-features --features tuirs-your-backend,search -- -D warnings
- run: cargo rustdoc --features=search -p tui-textarea -- -D warnings - run: cargo rustdoc --features=search -p tui-textarea -- -D warnings

Просмотреть файл

@@ -10,7 +10,7 @@ For reporting a bug, please make sure your report includes the following points.
- Environment - Environment
- Your terminal - Your terminal
- Rust version - Rust version
- `tui` or `ratatui` crate version - `ratatui` or `tui` crate version
- Enabled features of `tui-textarea` crate - Enabled features of `tui-textarea` crate
An example of bug report: https://github.com/rhysd/tui-textarea/issues/1 An example of bug report: https://github.com/rhysd/tui-textarea/issues/1
@@ -29,7 +29,7 @@ To run linters:
```sh ```sh
cargo clippy --features=search --tests --examples cargo clippy --features=search --tests --examples
cargo clippy --features=ratatui-crossterm,search --no-default-features --tests --examples cargo clippy --features=tuirs-crossterm,search --no-default-features --tests --examples
cargo fmt -- --check cargo fmt -- --check
``` ```
@@ -67,7 +67,7 @@ tail -F debug.txt
## Running a fuzzer ## Running a fuzzer
To run fuzzing tests, [cargo-fuzz][] is necessary. To run fuzzing tests, [cargo-fuzz][] and Rust nightly toolchain are necessary.
```sh ```sh
cargo +nightly fuzz run edit cargo +nightly fuzz run edit

Просмотреть файл

@@ -2,10 +2,10 @@
name = "tui-textarea" name = "tui-textarea"
version = "0.2.4" version = "0.2.4"
edition = "2021" edition = "2021"
rust-version = "1.56.1" rust-version = "1.56.1" # for `tui` crate support
authors = ["rhysd <lin90162@yahoo.co.jp>"] authors = ["rhysd <lin90162@yahoo.co.jp>"]
description = """ description = """
tui-textarea is a simple yet powerful text editor widget for tui-rs and ratatui. Multi-line tui-textarea is a simple yet powerful text editor widget for ratatui and tui-rs. Multi-line
text editor can be easily put as part of your TUI application. text editor can be easily put as part of your TUI application.
""" """
license = "MIT" license = "MIT"
@@ -24,37 +24,33 @@ include = [
[features] [features]
default = ["crossterm"] default = ["crossterm"]
# Features to use tui-rs
crossterm = ["dep:crossterm", "tui/crossterm"]
termion = ["dep:termion", "tui/termion"]
your-backend = ["tui"]
# Features to use ratatui # Features to use ratatui
ratatui-crossterm = ["dep:crossterm-027", "ratatui/crossterm"] crossterm = ["dep:crossterm", "ratatui/crossterm"]
ratatui-termion = ["dep:termion", "ratatui/termion"] termion = ["dep:termion", "ratatui/termion"]
ratatui-termwiz = ["dep:termwiz", "ratatui/termwiz"] termwiz = ["dep:termwiz", "ratatui/termwiz"]
ratatui-your-backend = ["ratatui"] your-backend = ["ratatui"]
# Features to use tui-rs
tuirs-crossterm = ["dep:crossterm-025", "tui/crossterm"]
tuirs-termion = ["dep:termion", "tui/termion"]
tuirs-your-backend = ["tui"]
# Other optional features # Other optional features
search = ["dep:regex"] search = ["dep:regex"]
[dependencies] [dependencies]
crossterm = { package = "crossterm", version = "0.25", optional = true } arbitrary = { version = "1", features = ["derive"], optional = true }
crossterm = { package = "crossterm", version = "0.27", optional = true }
crossterm-025 = { package = "crossterm", version = "0.25", optional = true }
ratatui = { version = "0.23.0", default-features = false, optional = true }
regex = { version = "1", optional = true } regex = { version = "1", optional = true }
termion = { version = "2.0", optional = true } termion = { version = "2.0", optional = true }
tui = { version = "0.19", default-features = false, optional = true }
arbitrary = { version = "1", features = ["derive"], optional = true }
crossterm-027 = { package = "crossterm", version = "0.27", optional = true }
ratatui = { version = "0.23.0", default-features = false, optional = true }
unicode-width = "0.1.11"
termwiz = { version = "0.20.0", optional = true } termwiz = { version = "0.20.0", optional = true }
tui = { version = "0.19", default-features = false, optional = true }
unicode-width = "0.1.11"
[[example]] [[example]]
name = "minimal" name = "minimal"
required-features = ["crossterm"] required-features = ["crossterm"]
[[example]]
name = "termion"
required-features = ["termion"]
[[example]] [[example]]
name = "editor" name = "editor"
required-features = ["crossterm", "search"] required-features = ["crossterm", "search"]
@@ -67,10 +63,6 @@ required-features = ["crossterm"]
name = "single_line" name = "single_line"
required-features = ["crossterm"] required-features = ["crossterm"]
[[example]]
name = "password"
required-features = ["crossterm"]
[[example]] [[example]]
name = "variable" name = "variable"
required-features = ["crossterm"] required-features = ["crossterm"]
@@ -79,29 +71,37 @@ required-features = ["crossterm"]
name = "modal" name = "modal"
required-features = ["crossterm"] required-features = ["crossterm"]
[[example]]
name = "password"
required-features = ["crossterm"]
[[example]] [[example]]
name = "popup_placeholder" name = "popup_placeholder"
required-features = ["crossterm"] required-features = ["crossterm"]
[[example]]
name = "ratatui_minimal"
required-features = ["ratatui-crossterm"]
[[example]]
name = "ratatui_popup_placeholder"
required-features = ["ratatui-crossterm"]
[[example]]
name = "ratatui_editor"
required-features = ["ratatui-crossterm", "search"]
[[example]]
name = "ratatui_termion"
required-features = ["ratatui-termion"]
[[example]] [[example]]
name = "termwiz" name = "termwiz"
required-features = ["ratatui-termwiz"] required-features = ["termwiz"]
[[example]]
name = "termion"
required-features = ["termion"]
[[example]]
name = "tuirs_minimal"
required-features = ["tuirs-crossterm"]
[[example]]
name = "tuirs_editor"
required-features = ["tuirs-crossterm", "search"]
[[example]]
name = "tuirs_popup_placeholder"
required-features = ["tuirs-crossterm"]
[[example]]
name = "tuirs_termion"
required-features = ["tuirs-termion"]
[workspace] [workspace]
members = [ members = [

117
README.md
Просмотреть файл

@@ -4,7 +4,7 @@ tui-textarea
[![docs][doc-badge]][doc] [![docs][doc-badge]][doc]
[![CI][ci-badge]][ci] [![CI][ci-badge]][ci]
[tui-textarea][crate] is a simple yet powerful text editor widget like `<textarea>` in HTML for [tui-rs][] and [ratatui][]. [tui-textarea][crate] is a simple yet powerful text editor widget like `<textarea>` in HTML for [ratatui][] and [tui-rs][].
Multi-line text editor can be easily put as part of your TUI application. Multi-line text editor can be easily put as part of your TUI application.
**Features:** **Features:**
@@ -19,7 +19,7 @@ Multi-line text editor can be easily put as part of your TUI application.
- Yank support. Paste text deleted with `C-k`, `C-j`, ... - Yank support. Paste text deleted with `C-k`, `C-j`, ...
- Backend agnostic. [crossterm][], [termion][], [termwiz][], and your own backend are all supported - Backend agnostic. [crossterm][], [termion][], [termwiz][], and your own backend are all supported
- Multiple textarea widgets in the same screen - Multiple textarea widgets in the same screen
- Support both [tui-rs][] (the original) and [ratatui][] (the fork by community) - Support both [ratatui][] (the fork by community) and [tui-rs][] (the original)
[Documentation][doc] [Documentation][doc]
@@ -67,14 +67,6 @@ Two split textareas in a screen and switch them. An example for multiple textare
<img src="https://raw.githubusercontent.com/rhysd/ss/master/tui-textarea/split.gif" width=539 height=124 alt="multiple textareas example"> <img src="https://raw.githubusercontent.com/rhysd/ss/master/tui-textarea/split.gif" width=539 height=124 alt="multiple textareas example">
### [`termion`](./examples/termion.rs)
```sh
cargo run --example termion --features=termion
```
Minimal usage with [termion][] support.
### [`variable`](./examples/variable.rs) ### [`variable`](./examples/variable.rs)
```sh ```sh
@@ -111,40 +103,48 @@ Password input form with masking text with ●.
<img src="https://raw.githubusercontent.com/rhysd/ss/master/tui-textarea/password.gif" width=589 height=92 alt="password example"> <img src="https://raw.githubusercontent.com/rhysd/ss/master/tui-textarea/password.gif" width=589 height=92 alt="password example">
### Examples for [ratatui][] support ### [`termion`](./examples/termion.rs)
All above examples use [tui-rs][], but some examples provide [ratatui][] version. Try `ratatui_` prefix. In these cases,
you need to specify features to use ratatui and `--no-default-features` flag explicitly.
```sh ```sh
# ratatui version of `minimal` example cargo run --example termion --no-default-features --features=termion
cargo run --example ratatui_minimal --no-default-features --features=ratatui-crossterm
# ratatui version of `editor` example
cargo run --example ratatui_editor --no-default-features --features=ratatui-crossterm,search file.txt
# ratatui version of `termion` example
cargo run --example ratatui_termion --no-default-features --features=ratatui-termion
# ratatui version of `popup_placeholder` example
cargo run --example ratatui_popup_placeholder --no-default-features --features=ratatui-crossterm
``` ```
Minimal usage with [termion][] support.
### [`termwiz`](./examples/termwiz.rs) ### [`termwiz`](./examples/termwiz.rs)
```sh ```sh
cargo run --example termwiz --no-default-features --features=ratatui-termwiz cargo run --example termwiz --no-default-features --features=termwiz
``` ```
Minimal usage with [termwiz][] support. Minimal usage with [termwiz][] support.
### Examples for [tui-rs][] support
All above examples use [ratatui][], but some examples provide tui-rs version. Try `tuirs_` prefix. In these cases, you
need to specify features to use tui-rs and `--no-default-features` flag explicitly.
```sh
# tui-rs version of `minimal` example
cargo run --example tuirs_minimal --no-default-features --features=tuirs-crossterm
# tui-rs version of `editor` example
cargo run --example tuirs_editor --no-default-features --features=tuirs-crossterm,search file.txt
# tui-rs version of `termion` example
cargo run --example tuirs_termion --no-default-features --features=tuirs-termion
# tui-rs version of `popup_placeholder` example
cargo run --example tuirs_popup_placeholder --no-default-features --features=tuirs-crossterm
```
## Installation ## Installation
Add `tui-textarea` crate to dependencies in your `Cargo.toml`. This enables crossterm backend support by default. Add `tui-textarea` crate to dependencies in your `Cargo.toml`. This enables crossterm backend support by default.
```toml ```toml
[dependencies] [dependencies]
tui = "*" ratatui = "*"
tui-textarea = "*" tui-textarea = "*"
``` ```
@@ -153,40 +153,46 @@ dependency.
```toml ```toml
[dependencies] [dependencies]
tui = "*" ratatui = "*"
tui-textarea = { version = "*", features = ["search"] } tui-textarea = { version = "*", features = ["search"] }
``` ```
If you're using tui-rs with [termion][], enable `termion` feature instead of `crossterm` feature. If you're using ratatui with [termion][] or [termwiz][], enable respective feature instead of `crossterm` feature.
```toml ```toml
[dependencies] [dependencies]
tui = { version = "*", default-features = false, features = ["termion"] }
# For termion
ratatui = { version = "*", default-features = false, features = ["termion"] }
tui-textarea = { version = "*", default-features = false, features = ["termion"] } tui-textarea = { version = "*", default-features = false, features = ["termion"] }
# For termwiz
ratatui = { version = "*", default-features = false, features = ["termwiz"] }
tui-textarea = { version = "*", default-features = false, features = ["termwiz"] }
``` ```
If you're using [ratatui][] instead of [tui-rs][], you need to enable features for using ratatui crate. The following table If you're using [tui-rs][] instead of [ratatui][], you need to enable features for using tui-rs crate and to disable
shows feature names corresponding to the dependencies. default features. The following table shows feature names corresponding to the dependencies.
| | crossterm | termion | termwiz | Your own backend | | | crossterm | termion | termwiz | Your own backend |
|---------|----------------------------------|-------------------|-------------------|------------------------| |---------|----------------------------------|-----------------|-----------|----------------------|
| tui-rs | `crossterm` (enabled by default) | `termion` | N/A | `your-backend` | | ratatui | `crossterm` (enabled by default) | `termion` | `termwiz` | `your-backend` |
| ratatui | `ratatui-crossterm` | `ratatui-termion` | `ratatui-termwiz` | `ratatui-your-backend` | | tui-rs | `tuirs-crossterm` | `tuirs-termion` | N/A | `tuirs-your-backend` |
For example, when you want to use the combination of [ratatui][] and [crossterm][], For example, when you want to use the combination of [tui-rs][] and [crossterm][],
```toml ```toml
[dependencies] [dependencies]
ratatui = "*" tui = "*"
tui-textarea = { version = "*", features = ["ratatui-crossterm"], default-features = false } tui-textarea = { version = "*", features = ["tuirs-crossterm"], default-features = false }
``` ```
Note that [tui-rs][] support and [ratatui][] support are exclusive. When you use [ratatui][] support, you must disable Note that [ratatui][] support and [tui-rs][] support are exclusive. When you use [tui-rs][] support, you must disable
[tui-rs][] support by `default-features = false`. [ratatui][] support by `default-features = false`.
In addition to above dependencies, you also need to install [crossterm][] or [termion][] or [termwiz][] to initialize In addition to above dependencies, you also need to install [crossterm][] or [termion][] or [termwiz][] to initialize
your application and to receive key inputs. Note that version of [crossterm][] crate is different between [tui-rs][] your application and to receive key inputs. Note that version of [crossterm][] crate is different between [ratatui][]
and [ratatui][]. Please select the correct version. and [tui-rs][]. Please select the correct version.
## Minimal Usage ## Minimal Usage
@@ -194,7 +200,7 @@ and [ratatui][]. Please select the correct version.
use tui_textarea::TextArea; use tui_textarea::TextArea;
use crossterm::event::{Event, read}; use crossterm::event::{Event, read};
let mut term = tui::Terminal::new(...); let mut term = ratatui::Terminal::new(...);
// Create an empty `TextArea` instance which manages the editor state // Create an empty `TextArea` instance which manages the editor state
let mut textarea = TextArea::default(); let mut textarea = TextArea::default();
@@ -202,7 +208,7 @@ let mut textarea = TextArea::default();
// Event loop // Event loop
loop { loop {
term.draw(|f| { term.draw(|f| {
// Get `tui::layout::Rect` where the editor should be rendered // Get `ratatui::layout::Rect` where the editor should be rendered
let rect = ...; let rect = ...;
// `TextArea::widget` builds a widget to render the editor with tui // `TextArea::widget` builds a widget to render the editor with tui
let widget = textarea.widget(); let widget = textarea.widget();
@@ -338,7 +344,7 @@ By default, `TextArea` does now show line numbers. To enable, set a style for re
color. color.
```rust,ignore ```rust,ignore
use tui::style::{Style, Color}; use ratatui::style::{Style, Color};
let style = Style::default().bg(Color::DarkGray); let style = Style::default().bg(Color::DarkGray);
textarea.set_line_number_style(style); textarea.set_line_number_style(style);
@@ -351,7 +357,7 @@ is. To change the style of cursor line, use `TextArea::set_cursor_line_style()`.
cursor line with bold text. cursor line with bold text.
```rust,ignore ```rust,ignore
use tui::style::{Style, Modifier}; use ratatui::style::{Style, Modifier};
let style = Style::default().add_modifier(Modifier::BOLD); let style = Style::default().add_modifier(Modifier::BOLD);
textarea.set_line_number_style(style); textarea.set_line_number_style(style);
@@ -360,7 +366,7 @@ textarea.set_line_number_style(style);
To disable cursor line style, set the default style as follows: To disable cursor line style, set the default style as follows:
```rust,ignore ```rust,ignore
use tui::style::{Style, Modifier}; use ratatui::style::{Style, Modifier};
textarea.set_line_number_style(Style::default()); textarea.set_line_number_style(Style::default());
``` ```
@@ -559,17 +565,16 @@ match read()?.into() {
### Use your own backend ### Use your own backend
tui-rs allows to make your own backend by implementing [`tui::backend::Backend`][tui-backend] trait. tui-textarea also ratatui and tui-rs allows to make your own backend by implementing [`ratatui::backend::Backend`][ratatui-backend] trait.
supports it. In this case, please use `your-backend` feature for [tui-rs][] or `ratatui-your-backend` feature for tui-textarea supports it as well. Please use `your-backend` feature for [ratatui][] or `tuirs-your-backend` feature for
[ratatui][]. They avoid adding backend crates (crossterm, termion, and termwiz) since you're using your own backend. [tui-rs][]. They avoid adding backend crates (crossterm, termion, or termwiz) since you're using your own backend.
```toml ```toml
[dependencies] [dependencies]
tui = { version = "*", default-features = false }
# For tui-rs
tui-textarea = { version = "*", default-features = false, features = ["your-backend"] }
# For ratatui # For ratatui
tui-textarea = { version = "*", default-features = false, features = ["ratatui-your-backend"] } tui-textarea = { version = "*", default-features = false, features = ["your-backend"] }
# For tui-rs
tui-textarea = { version = "*", default-features = false, features = ["tuirs-your-backend"] }
``` ```
`tui_textarea::Input` is a type for backend-agnostic key input. What you need to do is converting key event in your own `tui_textarea::Input` is a type for backend-agnostic key input. What you need to do is converting key event in your own
@@ -691,7 +696,7 @@ This project is developed [on GitHub][repo].
For feature requests or bug reports, please [create an issue][new-issue]. For submitting patches, please [create a pull For feature requests or bug reports, please [create an issue][new-issue]. For submitting patches, please [create a pull
request][pulls]. request][pulls].
Please see [CONTRIBUTING.md](./CONTRIBUTING.md) before reporting an issue or making a PR. Please read [CONTRIBUTING.md](./CONTRIBUTING.md) before reporting an issue or making a PR.
## License ## License
@@ -708,7 +713,7 @@ tui-textarea is distributed under [The MIT License](./LICENSE.txt).
[crossterm]: https://docs.rs/crossterm/latest/crossterm/ [crossterm]: https://docs.rs/crossterm/latest/crossterm/
[termion]: https://docs.rs/termion/latest/termion/ [termion]: https://docs.rs/termion/latest/termion/
[termwiz]: https://docs.rs/termwiz/latest/termwiz/ [termwiz]: https://docs.rs/termwiz/latest/termwiz/
[tui-backend]: https://docs.rs/tui/latest/tui/backend/trait.Backend.html [ratatui-backend]: https://docs.rs/ratatui/latest/ratatui/backend/trait.Backend.html
[repo]: https://github.com/rhysd/tui-textarea [repo]: https://github.com/rhysd/tui-textarea
[new-issue]: https://github.com/rhysd/tui-textarea/issues/new [new-issue]: https://github.com/rhysd/tui-textarea/issues/new
[pulls]: https://github.com/rhysd/tui-textarea/pulls [pulls]: https://github.com/rhysd/tui-textarea/pulls

Просмотреть файл

@@ -9,8 +9,8 @@ license = "MIT"
bench = false bench = false
[dependencies] [dependencies]
tui-textarea = { path = "..", features = ["search"] } tui-textarea = { path = "..", features = ["your-backend", "search"] }
tui = { version = "0.19", default-features = false } ratatui = { version = "0.23.0", default-features = false }
[dev-dependencies] [dev-dependencies]
criterion = "0.5" criterion = "0.5"

Просмотреть файл

@@ -1,11 +1,11 @@
// We use empty backend for our benchmark instead of tui::backend::TestBackend to make impact of benchmark from tui-rs // We use empty backend for our benchmark instead of tui::backend::TestBackend to make impact of benchmark from tui-rs
// as small as possible. // as small as possible.
use ratatui::backend::Backend;
use ratatui::buffer::Cell;
use ratatui::layout::Rect;
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::Backend;
use tui::buffer::Cell;
use tui::layout::Rect;
use tui::Terminal;
use tui_textarea::TextArea; use tui_textarea::TextArea;
pub const LOREM: &[&str] = &[ pub const LOREM: &[&str] = &[

Просмотреть файл

@@ -3,6 +3,12 @@ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, is_raw_mode_enabled, EnterAlternateScreen, disable_raw_mode, enable_raw_mode, is_raw_mode_enabled, EnterAlternateScreen,
LeaveAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::Terminal;
use std::borrow::Cow; use std::borrow::Cow;
use std::env; use std::env;
use std::fmt::Display; use std::fmt::Display;
@@ -10,12 +16,6 @@ use std::fs;
use std::io; use std::io;
use std::io::{BufRead, Write}; use std::io::{BufRead, Write};
use std::path::PathBuf; use std::path::PathBuf;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Paragraph};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, TextArea}; use tui_textarea::{CursorMove, Input, Key, TextArea};
macro_rules! error { macro_rules! error {
@@ -223,9 +223,9 @@ impl<'a> Editor<'a> {
// Render message at bottom // Render message at bottom
let message = if let Some(message) = self.message.take() { let message = if let Some(message) = self.message.take() {
Spans::from(Span::raw(message)) Line::from(Span::raw(message))
} else if search_height > 0 { } else if search_height > 0 {
Spans::from(vec![ Line::from(vec![
Span::raw("Press "), Span::raw("Press "),
Span::styled("Enter", Style::default().add_modifier(Modifier::BOLD)), Span::styled("Enter", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to jump to first match and close, "), Span::raw(" to jump to first match and close, "),
@@ -243,7 +243,7 @@ impl<'a> Editor<'a> {
Span::raw(" to search previous"), Span::raw(" to search previous"),
]) ])
} else { } else {
Spans::from(vec![ Line::from(vec![
Span::raw("Press "), Span::raw("Press "),
Span::styled("^Q", Style::default().add_modifier(Modifier::BOLD)), Span::styled("^Q", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to quit, "), Span::raw(" to quit, "),

Просмотреть файл

@@ -2,10 +2,10 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> { fn main() -> io::Result<()> {

Просмотреть файл

@@ -2,15 +2,15 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::env; use std::env;
use std::fmt; use std::fmt;
use std::fs; use std::fs;
use std::io; use std::io;
use std::io::BufRead; use std::io::BufRead;
use tui::backend::CrosstermBackend;
use tui::style::{Color, Modifier, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, Scrolling, TextArea}; use tui_textarea::{CursorMove, Input, Key, Scrolling, TextArea};
enum Mode { enum Mode {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Layout};
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> { fn main() -> io::Result<()> {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::Rect;
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::Rect;
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> { fn main() -> io::Result<()> {
@@ -34,9 +34,6 @@ fn main() -> io::Result<()> {
y: 5, y: 5,
}; };
textarea.set_style(Style::default().fg(Color::Yellow)); textarea.set_style(Style::default().fg(Color::Yellow));
// set placeholder
textarea.set_placeholder_style(Style::default()); textarea.set_placeholder_style(Style::default());
textarea.set_placeholder_text("prompt message"); textarea.set_placeholder_text("prompt message");
loop { loop {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Layout};
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn validate(textarea: &mut TextArea) -> bool { fn validate(textarea: &mut TextArea) -> bool {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn inactivate(textarea: &mut TextArea<'_>) { fn inactivate(textarea: &mut TextArea<'_>) {
@@ -54,9 +54,9 @@ fn main() -> io::Result<()> {
loop { loop {
term.draw(|f| { term.draw(|f| {
let chunks = layout.split(f.size()); let chunks = layout.split(f.size());
for (textarea, chunk) in textarea.iter().zip(chunks) { for (textarea, chunk) in textarea.iter().zip(chunks.iter()) {
let widget = textarea.widget(); let widget = textarea.widget();
f.render_widget(widget, chunk); f.render_widget(widget, *chunk);
} }
})?; })?;
match crossterm::event::read()?.into() { match crossterm::event::read()?.into() {

Просмотреть файл

@@ -1,3 +1,6 @@
use ratatui::backend::TermionBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::error::Error; use std::error::Error;
use std::io; use std::io;
use std::sync::mpsc; use std::sync::mpsc;
@@ -7,9 +10,6 @@ use termion::event::Event as TermEvent;
use termion::input::{MouseTerminal, TermRead}; use termion::input::{MouseTerminal, TermRead};
use termion::raw::IntoRawMode; use termion::raw::IntoRawMode;
use termion::screen::IntoAlternateScreen; use termion::screen::IntoAlternateScreen;
use tui::backend::TermionBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
enum Event { enum Event {

Просмотреть файл

@@ -1,16 +1,10 @@
use crossterm_027 as crossterm; use crossterm_025 as crossterm;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, is_raw_mode_enabled, EnterAlternateScreen, disable_raw_mode, enable_raw_mode, is_raw_mode_enabled, EnterAlternateScreen,
LeaveAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::Terminal;
use std::borrow::Cow; use std::borrow::Cow;
use std::env; use std::env;
use std::fmt::Display; use std::fmt::Display;
@@ -18,6 +12,12 @@ use std::fs;
use std::io; use std::io;
use std::io::{BufRead, Write}; use std::io::{BufRead, Write};
use std::path::PathBuf; use std::path::PathBuf;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Paragraph};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, TextArea}; use tui_textarea::{CursorMove, Input, Key, TextArea};
macro_rules! error { macro_rules! error {
@@ -225,9 +225,9 @@ impl<'a> Editor<'a> {
// Render message at bottom // Render message at bottom
let message = if let Some(message) = self.message.take() { let message = if let Some(message) = self.message.take() {
Line::from(Span::raw(message)) Spans::from(Span::raw(message))
} else if search_height > 0 { } else if search_height > 0 {
Line::from(vec![ Spans::from(vec![
Span::raw("Press "), Span::raw("Press "),
Span::styled("Enter", Style::default().add_modifier(Modifier::BOLD)), Span::styled("Enter", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to jump to first match and close, "), Span::raw(" to jump to first match and close, "),
@@ -245,7 +245,7 @@ impl<'a> Editor<'a> {
Span::raw(" to search previous"), Span::raw(" to search previous"),
]) ])
} else { } else {
Line::from(vec![ Spans::from(vec![
Span::raw("Press "), Span::raw("Press "),
Span::styled("^Q", Style::default().add_modifier(Modifier::BOLD)), Span::styled("^Q", Style::default().add_modifier(Modifier::BOLD)),
Span::raw(" to quit, "), Span::raw(" to quit, "),

Просмотреть файл

@@ -1,13 +1,13 @@
use crossterm_027 as crossterm; use crossterm_025 as crossterm;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> { fn main() -> io::Result<()> {

Просмотреть файл

@@ -1,14 +1,15 @@
use crossterm_025 as crossterm;
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use crossterm_027 as crossterm;
use ratatui::backend::CrosstermBackend;
use ratatui::layout::Rect;
use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::Rect;
use tui::style::{Color, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> { fn main() -> io::Result<()> {
@@ -35,6 +36,9 @@ fn main() -> io::Result<()> {
y: 5, y: 5,
}; };
textarea.set_style(Style::default().fg(Color::Yellow)); textarea.set_style(Style::default().fg(Color::Yellow));
// set placeholder
textarea.set_placeholder_style(Style::default()); textarea.set_placeholder_style(Style::default());
textarea.set_placeholder_text("prompt message"); textarea.set_placeholder_text("prompt message");
loop { loop {

Просмотреть файл

@@ -1,6 +1,3 @@
use ratatui::backend::TermionBackend;
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::error::Error; use std::error::Error;
use std::io; use std::io;
use std::sync::mpsc; use std::sync::mpsc;
@@ -10,6 +7,9 @@ use termion::event::Event as TermEvent;
use termion::input::{MouseTerminal, TermRead}; use termion::input::{MouseTerminal, TermRead};
use termion::raw::IntoRawMode; use termion::raw::IntoRawMode;
use termion::screen::IntoAlternateScreen; use termion::screen::IntoAlternateScreen;
use tui::backend::TermionBackend;
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
enum Event { enum Event {

Просмотреть файл

@@ -2,12 +2,12 @@ use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
}; };
use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::cmp; use std::cmp;
use std::io; use std::io;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
fn main() -> io::Result<()> { fn main() -> io::Result<()> {

141
fuzz/Cargo.lock сгенерированный
Просмотреть файл

@@ -32,6 +32,12 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]] [[package]]
name = "cassowary" name = "cassowary"
version = "0.3.0" version = "0.3.0"
@@ -52,11 +58,11 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "crossterm" name = "crossterm"
version = "0.23.2" version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17" checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df"
dependencies = [ dependencies = [
"bitflags", "bitflags 2.4.1",
"crossterm_winapi", "crossterm_winapi",
"libc", "libc",
"mio", "mio",
@@ -68,9 +74,9 @@ dependencies = [
[[package]] [[package]]
name = "crossterm_winapi" name = "crossterm_winapi"
version = "0.9.0" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
dependencies = [ dependencies = [
"winapi", "winapi",
] ]
@@ -83,7 +89,34 @@ checksum = "8728db27dd9033a7456655aaeb35fde74425d0f130b4cb18a19171ef38a1b454"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 1.0.96",
]
[[package]]
name = "either"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "indoc"
version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
[[package]]
name = "itertools"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
dependencies = [
"either",
] ]
[[package]] [[package]]
@@ -170,30 +203,53 @@ dependencies = [
] ]
[[package]] [[package]]
name = "proc-macro2" name = "paste"
version = "1.0.39" version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]]
name = "proc-macro2"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.18" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "ratatui"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e2e4cd95294a85c3b4446e63ef054eea43e0205b1fd60120c16b74ff7ff96ad"
dependencies = [
"bitflags 2.4.1",
"cassowary",
"crossterm",
"indoc",
"itertools",
"paste",
"strum",
"unicode-segmentation",
"unicode-width",
]
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.2.13" version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
] ]
[[package]] [[package]]
@@ -213,6 +269,12 @@ version = "0.6.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
[[package]]
name = "rustversion"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.1.0" version = "1.1.0"
@@ -221,9 +283,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]] [[package]]
name = "signal-hook" name = "signal-hook"
version = "0.3.14" version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
dependencies = [ dependencies = [
"libc", "libc",
"signal-hook-registry", "signal-hook-registry",
@@ -255,6 +317,28 @@ version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
[[package]]
name = "strum"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
version = "0.25.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
dependencies = [
"heck",
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.38",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.96" version = "1.0.96"
@@ -267,33 +351,32 @@ dependencies = [
] ]
[[package]] [[package]]
name = "tui" name = "syn"
version = "0.18.0" version = "2.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96fe69244ec2af261bced1d9046a6fee6c8c2a6b0228e59e5ba39bc8ba4ed729" checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
dependencies = [ dependencies = [
"bitflags", "proc-macro2",
"cassowary", "quote",
"crossterm", "unicode-ident",
"unicode-segmentation",
"unicode-width",
] ]
[[package]] [[package]]
name = "tui-textarea" name = "tui-textarea"
version = "0.1.4" version = "0.2.4"
dependencies = [ dependencies = [
"arbitrary", "arbitrary",
"crossterm", "crossterm",
"ratatui",
"regex", "regex",
"tui", "unicode-width",
] ]
[[package]] [[package]]
name = "tui-textarea-bench" name = "tui-textarea-bench"
version = "0.0.0" version = "0.0.0"
dependencies = [ dependencies = [
"tui", "ratatui",
"tui-textarea", "tui-textarea",
] ]
@@ -315,15 +398,15 @@ checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c"
[[package]] [[package]]
name = "unicode-segmentation" name = "unicode-segmentation"
version = "1.9.0" version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
version = "0.1.9" version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]] [[package]]
name = "wasi" name = "wasi"

Просмотреть файл

@@ -199,9 +199,9 @@ pub enum CursorMove {
/// ///
/// This is useful when you moved a cursor but you don't want to move the viewport. /// This is useful when you moved a cursor but you don't want to move the viewport.
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, CursorMove}; /// use tui_textarea::{TextArea, CursorMove};
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -324,12 +324,12 @@ impl CursorMove {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
// Seaparate tests for ratatui support // Seaparate tests for tui-rs support
#[test] #[test]
fn in_viewport() { fn in_viewport() {
use crate::tui::buffer::Buffer; use crate::ratatui::buffer::Buffer;
use crate::tui::layout::Rect; use crate::ratatui::layout::Rect;
use crate::tui::widgets::Widget; use crate::ratatui::widgets::Widget;
use crate::{CursorMove, TextArea}; use crate::{CursorMove, TextArea};
let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect(); let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();

Просмотреть файл

@@ -1,19 +1,18 @@
use crate::tui::style::Style; use crate::ratatui::style::Style;
#[cfg(any( #[cfg(any(
feature = "ratatui-crossterm", feature = "crossterm",
feature = "ratatui-termion", feature = "termion",
feature = "ratatui-termwiz", feature = "termwiz",
feature = "ratatui-your-backend", feature = "your-backend",
))] ))]
use crate::tui::text::Line as Spans; use crate::ratatui::text::Line;
use crate::tui::text::Span; use crate::ratatui::text::Span;
#[cfg(not(any( #[cfg(any(
feature = "ratatui-crossterm", feature = "tuirs-crossterm",
feature = "ratatui-termion", feature = "tuirs-termion",
feature = "ratatui-termwiz", feature = "tuirs-your-backend",
feature = "ratatui-your-backend", ))]
)))] use crate::ratatui::text::Spans as Line;
use crate::tui::text::Spans;
use crate::util::{num_digits, spaces}; use crate::util::{num_digits, spaces};
use std::borrow::Cow; use std::borrow::Cow;
use std::cmp::Ordering; use std::cmp::Ordering;
@@ -138,7 +137,7 @@ impl<'a> LineHighlighter<'a> {
} }
} }
pub fn into_spans(self) -> Spans<'a> { pub fn into_spans(self) -> Line<'a> {
let Self { let Self {
line, line,
mut spans, mut spans,
@@ -158,7 +157,7 @@ impl<'a> LineHighlighter<'a> {
if cursor_at_end { if cursor_at_end {
spans.push(Span::styled(" ", cursor_style)); spans.push(Span::styled(" ", cursor_style));
} }
return Spans::from(spans); return Line::from(spans);
} }
boundaries.sort_unstable_by(|(l, i), (r, j)| match i.cmp(j) { boundaries.sort_unstable_by(|(l, i), (r, j)| match i.cmp(j) {
@@ -197,7 +196,7 @@ impl<'a> LineHighlighter<'a> {
if cursor_at_end { if cursor_at_end {
spans.push(Span::styled(" ", cursor_style)); spans.push(Span::styled(" ", cursor_style));
} }
return Spans::from(spans); return Line::from(spans);
} }
} }
} }

Просмотреть файл

@@ -1,13 +1,13 @@
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))] #[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
use crate::crossterm::event::{ use crate::crossterm::event::{
Event as CrosstermEvent, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseEvent, Event as CrosstermEvent, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseEvent,
MouseEventKind as CrosstermMouseEventKind, MouseEventKind as CrosstermMouseEventKind,
}; };
#[cfg(feature = "arbitrary")] #[cfg(feature = "arbitrary")]
use arbitrary::Arbitrary; use arbitrary::Arbitrary;
#[cfg(any(feature = "termion", feature = "ratatui-termion"))] #[cfg(any(feature = "termion", feature = "tuirs-termion"))]
use termion::event::{Event as TermionEvent, Key as TermionKey, MouseEvent as TermionMouseEvent}; use termion::event::{Event as TermionEvent, Key as TermionKey, MouseEvent as TermionMouseEvent};
#[cfg(feature = "ratatui-termwiz")] #[cfg(feature = "termwiz")]
use termwiz::input::{ use termwiz::input::{
InputEvent as TermwizInputEvent, KeyEvent as TermwizKeyEvent, InputEvent as TermwizInputEvent, KeyEvent as TermwizKeyEvent,
MouseButtons as TermwizMouseButtons, MouseEvent as TermwizMouseEvent, PixelMouseEvent, MouseButtons as TermwizMouseButtons, MouseEvent as TermwizMouseEvent, PixelMouseEvent,
@@ -47,7 +47,7 @@ pub enum Key {
/// Backend-agnostic key input type. /// Backend-agnostic key input type.
/// ///
/// When `crossterm`, `termion`, `ratatui-termwiz` features are enabled, converting respective key input types into this /// When `crossterm`, `termion`, `termwiz` features are enabled, converting respective key input types into this
/// `Input` type is defined. /// `Input` type is defined.
/// ```no_run /// ```no_run
/// use tui_textarea::{TextArea, Input, Key}; /// use tui_textarea::{TextArea, Input, Key};
@@ -101,7 +101,7 @@ impl Default for Input {
} }
} }
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))] #[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
impl From<CrosstermEvent> for Input { impl From<CrosstermEvent> for Input {
/// Convert [`crossterm::event::Event`] to [`Input`]. /// Convert [`crossterm::event::Event`] to [`Input`].
fn from(event: CrosstermEvent) -> Self { fn from(event: CrosstermEvent) -> Self {
@@ -113,7 +113,7 @@ impl From<CrosstermEvent> for Input {
} }
} }
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))] #[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
impl From<KeyEvent> for Input { impl From<KeyEvent> for Input {
/// Convert [`crossterm::event::KeyEvent`] to [`Input`]. /// Convert [`crossterm::event::KeyEvent`] to [`Input`].
fn from(key: KeyEvent) -> Self { fn from(key: KeyEvent) -> Self {
@@ -141,7 +141,7 @@ impl From<KeyEvent> for Input {
} }
} }
#[cfg(any(feature = "crossterm", feature = "ratatui-crossterm"))] #[cfg(any(feature = "crossterm", feature = "tuirs-crossterm"))]
impl From<MouseEvent> for Input { impl From<MouseEvent> for Input {
/// Convert [`crossterm::event::MouseEvent`] to [`Input`]. /// Convert [`crossterm::event::MouseEvent`] to [`Input`].
fn from(mouse: MouseEvent) -> Self { fn from(mouse: MouseEvent) -> Self {
@@ -156,7 +156,7 @@ impl From<MouseEvent> for Input {
} }
} }
#[cfg(any(feature = "termion", feature = "ratatui-termion"))] #[cfg(any(feature = "termion", feature = "tuirs-termion"))]
impl From<TermionEvent> for Input { impl From<TermionEvent> for Input {
/// Convert [`termion::event::Event`] to [`Input`]. /// Convert [`termion::event::Event`] to [`Input`].
fn from(event: TermionEvent) -> Self { fn from(event: TermionEvent) -> Self {
@@ -168,7 +168,7 @@ impl From<TermionEvent> for Input {
} }
} }
#[cfg(any(feature = "termion", feature = "ratatui-termion"))] #[cfg(any(feature = "termion", feature = "tuirs-termion"))]
impl From<TermionKey> for Input { impl From<TermionKey> for Input {
/// Convert [`termion::event::Key`] to [`Input`]. /// Convert [`termion::event::Key`] to [`Input`].
fn from(key: TermionKey) -> Self { fn from(key: TermionKey) -> Self {
@@ -207,7 +207,7 @@ impl From<TermionKey> for Input {
} }
} }
#[cfg(any(feature = "termion", feature = "ratatui-termion"))] #[cfg(any(feature = "termion", feature = "tuirs-termion"))]
impl From<TermionMouseEvent> for Input { impl From<TermionMouseEvent> for Input {
/// Convert [`termion::event::MouseEvent`] to [`Input`]. /// Convert [`termion::event::MouseEvent`] to [`Input`].
fn from(mouse: TermionMouseEvent) -> Self { fn from(mouse: TermionMouseEvent) -> Self {
@@ -225,7 +225,7 @@ impl From<TermionMouseEvent> for Input {
} }
} }
#[cfg(feature = "ratatui-termwiz")] #[cfg(feature = "termwiz")]
impl From<TermwizInputEvent> for Input { impl From<TermwizInputEvent> for Input {
/// Convert [`termwiz::input::InputEvent`] to [`Input`]. /// Convert [`termwiz::input::InputEvent`] to [`Input`].
fn from(input: TermwizInputEvent) -> Self { fn from(input: TermwizInputEvent) -> Self {
@@ -238,7 +238,7 @@ impl From<TermwizInputEvent> for Input {
} }
} }
#[cfg(feature = "ratatui-termwiz")] #[cfg(feature = "termwiz")]
impl From<TermwizKeyEvent> for Input { impl From<TermwizKeyEvent> for Input {
/// Convert [`termwiz::input::KeyEvent`] to [`Input`]. /// Convert [`termwiz::input::KeyEvent`] to [`Input`].
fn from(key: TermwizKeyEvent) -> Self { fn from(key: TermwizKeyEvent) -> Self {
@@ -270,7 +270,7 @@ impl From<TermwizKeyEvent> for Input {
} }
} }
#[cfg(feature = "ratatui-termwiz")] #[cfg(feature = "termwiz")]
impl From<TermwizMouseButtons> for Key { impl From<TermwizMouseButtons> for Key {
/// Convert [`termwiz::input::MouseButtons`] to [`Key`]. /// Convert [`termwiz::input::MouseButtons`] to [`Key`].
fn from(buttons: TermwizMouseButtons) -> Self { fn from(buttons: TermwizMouseButtons) -> Self {
@@ -286,7 +286,7 @@ impl From<TermwizMouseButtons> for Key {
} }
} }
#[cfg(feature = "ratatui-termwiz")] #[cfg(feature = "termwiz")]
impl From<TermwizMouseEvent> for Input { impl From<TermwizMouseEvent> for Input {
/// Convert [`termwiz::input::MouseEvent`] to [`Input`]. /// Convert [`termwiz::input::MouseEvent`] to [`Input`].
fn from(mouse: TermwizMouseEvent) -> Self { fn from(mouse: TermwizMouseEvent) -> Self {
@@ -305,7 +305,7 @@ impl From<TermwizMouseEvent> for Input {
} }
} }
#[cfg(feature = "ratatui-termwiz")] #[cfg(feature = "termwiz")]
impl From<PixelMouseEvent> for Input { impl From<PixelMouseEvent> for Input {
/// Convert [`termwiz::input::PixelMouseEvent`] to [`Input`]. /// Convert [`termwiz::input::PixelMouseEvent`] to [`Input`].
fn from(mouse: PixelMouseEvent) -> Self { fn from(mouse: PixelMouseEvent) -> Self {

Просмотреть файл

@@ -5,15 +5,19 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
#[cfg(all( #[cfg(all(
any(feature = "crossterm", feature = "termion", feature = "your-backend"),
any( any(
feature = "ratatui-crossterm", feature = "crossterm",
feature = "ratatui-termion", feature = "termion",
feature = "ratatui-termwiz", feature = "termwiz",
feature = "ratatui-your-backend" feature = "your-backend"
),
any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend"
), ),
))] ))]
compile_error!("tui-rs support and ratatui support are exclussive. only one of them can be enabled at the same time. see https://github.com/rhysd/tui-textarea#installation"); compile_error!("ratatui support and tui-rs support are exclussive. only one of them can be enabled at the same time. see https://github.com/rhysd/tui-textarea#installation");
mod cursor; mod cursor;
mod highlight; mod highlight;
@@ -28,26 +32,25 @@ mod widget;
mod word; mod word;
#[cfg(any( #[cfg(any(
feature = "ratatui-crossterm", feature = "crossterm",
feature = "ratatui-termion", feature = "termion",
feature = "ratatui-termwiz", feature = "termwiz",
feature = "ratatui-your-backend", feature = "your-backend",
))] ))]
use ratatui as tui;
#[cfg(not(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
)))]
#[allow(clippy::single_component_path_imports)] #[allow(clippy::single_component_path_imports)]
use tui; use ratatui;
#[cfg(any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend",
))]
use tui as ratatui;
#[cfg(feature = "crossterm")] #[cfg(feature = "crossterm")]
#[allow(clippy::single_component_path_imports)] #[allow(clippy::single_component_path_imports)]
use crossterm; use crossterm;
#[cfg(feature = "ratatui-crossterm")] #[cfg(feature = "tuirs-crossterm")]
use crossterm_027 as crossterm; use crossterm_025 as crossterm;
pub use cursor::CursorMove; pub use cursor::CursorMove;
pub use input::{Input, Key}; pub use input::{Input, Key};

Просмотреть файл

@@ -13,9 +13,9 @@ pub enum Scrolling {
/// `Scrolling::Delta` where 1st element means rows and 2nd means columns. /// `Scrolling::Delta` where 1st element means rows and 2nd means columns.
/// ///
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling}; /// use tui_textarea::{TextArea, Scrolling};
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -39,9 +39,9 @@ pub enum Scrolling {
/// Scroll down the textarea by one page. /// Scroll down the textarea by one page.
/// ///
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling}; /// use tui_textarea::{TextArea, Scrolling};
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -65,9 +65,9 @@ pub enum Scrolling {
/// Scroll up the textarea by one page. /// Scroll up the textarea by one page.
/// ///
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling, CursorMove}; /// use tui_textarea::{TextArea, Scrolling, CursorMove};
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -95,9 +95,9 @@ pub enum Scrolling {
/// Scroll down the textarea by half of the page. /// Scroll down the textarea by half of the page.
/// ///
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling}; /// use tui_textarea::{TextArea, Scrolling};
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -121,9 +121,9 @@ pub enum Scrolling {
/// Scroll up the textarea by half of the page. /// Scroll up the textarea by half of the page.
/// ///
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::{TextArea, Scrolling, CursorMove}; /// use tui_textarea::{TextArea, Scrolling, CursorMove};
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -185,12 +185,12 @@ impl From<(i16, i16)> for Scrolling {
mod tests { mod tests {
use super::*; use super::*;
// Seaparate tests for ratatui support // Seaparate tests for tui-rs support
#[test] #[test]
fn delta() { fn delta() {
use crate::tui::buffer::Buffer; use crate::ratatui::buffer::Buffer;
use crate::tui::layout::Rect; use crate::ratatui::layout::Rect;
use crate::tui::widgets::Widget; use crate::ratatui::widgets::Widget;
use crate::TextArea; use crate::TextArea;
let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect(); let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();

Просмотреть файл

@@ -1,4 +1,4 @@
use crate::tui::style::{Color, Style}; use crate::ratatui::style::{Color, Style};
use regex::Regex; use regex::Regex;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

Просмотреть файл

@@ -2,26 +2,25 @@ use crate::cursor::CursorMove;
use crate::highlight::LineHighlighter; use crate::highlight::LineHighlighter;
use crate::history::{Edit, EditKind, History}; use crate::history::{Edit, EditKind, History};
use crate::input::{Input, Key}; use crate::input::{Input, Key};
use crate::ratatui::layout::Alignment;
use crate::ratatui::style::{Color, Modifier, Style};
#[cfg(any(
feature = "crossterm",
feature = "termion",
feature = "termwiz",
feature = "your-backend",
))]
use crate::ratatui::text::Line;
#[cfg(any(
feature = "tuirs-crossterm",
feature = "tuirs-termion",
feature = "tuirs-your-backend",
))]
use crate::ratatui::text::Spans as Line;
use crate::ratatui::widgets::{Block, Widget};
use crate::scroll::Scrolling; use crate::scroll::Scrolling;
#[cfg(feature = "search")] #[cfg(feature = "search")]
use crate::search::Search; use crate::search::Search;
use crate::tui::layout::Alignment;
use crate::tui::style::{Color, Modifier, Style};
#[cfg(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
))]
use crate::tui::text::Line as Spans;
#[cfg(not(any(
feature = "ratatui-crossterm",
feature = "ratatui-termion",
feature = "ratatui-termwiz",
feature = "ratatui-your-backend",
)))]
use crate::tui::text::Spans;
use crate::tui::widgets::{Block, Widget};
use crate::util::spaces; use crate::util::spaces;
use crate::widget::{Renderer, Viewport}; use crate::widget::{Renderer, Viewport};
use crate::word::{find_word_end_forward, find_word_start_backward}; use crate::word::{find_word_end_forward, find_word_start_backward};
@@ -172,7 +171,7 @@ impl<'a> TextArea<'a> {
/// Handle a key input with default key mappings. For default key mappings, see the table in /// Handle a key input with default key mappings. For default key mappings, see the table in
/// [the module document](./index.html). /// [the module document](./index.html).
/// `crossterm`, `termion`, and `ratatui-termwiz` features enable conversion from their own key event types into /// `crossterm`, `termion`, and `termwiz` features enable conversion from their own key event types into
/// [`Input`] so this method can take the event values directly. /// [`Input`] so this method can take the event values directly.
/// This method returns if the input modified text contents or not in the textarea. /// This method returns if the input modified text contents or not in the textarea.
/// ```ignore /// ```ignore
@@ -1010,7 +1009,7 @@ impl<'a> TextArea<'a> {
} }
} }
pub(crate) fn line_spans<'b>(&'b self, line: &'b str, row: usize, lnum_len: u8) -> Spans<'b> { pub(crate) fn line_spans<'b>(&'b self, line: &'b str, row: usize, lnum_len: u8) -> Line<'b> {
let mut hl = LineHighlighter::new(line, self.cursor_style, self.tab_len, self.mask); let mut hl = LineHighlighter::new(line, self.cursor_style, self.tab_len, self.mask);
if let Some(style) = self.line_number_style { if let Some(style) = self.line_number_style {
@@ -1029,12 +1028,12 @@ impl<'a> TextArea<'a> {
hl.into_spans() hl.into_spans()
} }
/// Build a tui-rs widget to render the current state of the textarea. The widget instance returned from this /// Build a ratatui (or tui-rs) widget to render the current state of the textarea. The widget instance returned
/// method can be rendered with [`tui::terminal::Frame::render_widget`]. /// from this method can be rendered with [`ratatui::terminal::Frame::render_widget`].
/// ```no_run /// ```no_run
/// use tui::backend::CrosstermBackend; /// use ratatui::backend::CrosstermBackend;
/// use tui::layout::{Constraint, Direction, Layout}; /// use ratatui::layout::{Constraint, Direction, Layout};
/// use tui::Terminal; /// use ratatui::Terminal;
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1061,7 +1060,7 @@ impl<'a> TextArea<'a> {
/// Set the style of textarea. By default, textarea is not styled. /// Set the style of textarea. By default, textarea is not styled.
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1081,7 +1080,7 @@ impl<'a> TextArea<'a> {
/// Set the block of textarea. By default, no block is set. /// Set the block of textarea. By default, no block is set.
/// ``` /// ```
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// use tui::widgets::{Block, Borders}; /// use ratatui::widgets::{Block, Borders};
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
/// let block = Block::default().borders(Borders::ALL).title("Block Title"); /// let block = Block::default().borders(Borders::ALL).title("Block Title");
@@ -1095,7 +1094,7 @@ impl<'a> TextArea<'a> {
/// Remove the block of textarea which was set by [`TextArea::set_block`]. /// Remove the block of textarea which was set by [`TextArea::set_block`].
/// ``` /// ```
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// use tui::widgets::{Block, Borders}; /// use ratatui::widgets::{Block, Borders};
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
/// let block = Block::default().borders(Borders::ALL).title("Block Title"); /// let block = Block::default().borders(Borders::ALL).title("Block Title");
@@ -1112,8 +1111,7 @@ impl<'a> TextArea<'a> {
self.block.as_ref() self.block.as_ref()
} }
/// Set the length of tab character. Due to limitation of tui-rs, hard tab is not supported. Setting 0 disables tab /// Set the length of tab character. Setting 0 disables tab inputs.
/// inputs.
/// ``` /// ```
/// use tui_textarea::{TextArea, Input, Key}; /// use tui_textarea::{TextArea, Input, Key};
/// ///
@@ -1199,7 +1197,7 @@ impl<'a> TextArea<'a> {
/// Set the style of line at cursor. By default, the cursor line is styled with underline. To stop styling the /// Set the style of line at cursor. By default, the cursor line is styled with underline. To stop styling the
/// cursor line, set the default style. /// cursor line, set the default style.
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1224,7 +1222,7 @@ impl<'a> TextArea<'a> {
/// that line numbers are disabled by default. If you want to show line numbers but don't want to style them, set /// that line numbers are disabled by default. If you want to show line numbers but don't want to style them, set
/// the default style. /// the default style.
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1241,7 +1239,7 @@ impl<'a> TextArea<'a> {
/// Remove the style of line number which was set by [`TextArea::set_line_number_style`]. After calling this /// Remove the style of line number which was set by [`TextArea::set_line_number_style`]. After calling this
/// method, Line numbers will no longer be shown. /// method, Line numbers will no longer be shown.
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1279,7 +1277,7 @@ impl<'a> TextArea<'a> {
/// Set the style of the placeholder text. The default style is a dark gray text. /// Set the style of the placeholder text. The default style is a dark gray text.
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1373,7 +1371,7 @@ impl<'a> TextArea<'a> {
/// Set the style of cursor. By default, a cursor is rendered in the reversed color. Setting the same style as /// Set the style of cursor. By default, a cursor is rendered in the reversed color. Setting the same style as
/// cursor line hides a cursor. /// cursor line hides a cursor.
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1449,8 +1447,8 @@ impl<'a> TextArea<'a> {
/// Set text alignment. When [`Alignment::Center`] or [`Alignment::Right`] is set, line number is automatically /// Set text alignment. When [`Alignment::Center`] or [`Alignment::Right`] is set, line number is automatically
/// disabled because those alignments don't work well with line numbers. /// disabled because those alignments don't work well with line numbers.
/// ``` /// ```
/// use ratatui::layout::Alignment;
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// use tui::layout::Alignment;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
/// ///
@@ -1466,8 +1464,8 @@ impl<'a> TextArea<'a> {
/// Get current text alignment. The default alignment is [`Alignment::Left`]. /// Get current text alignment. The default alignment is [`Alignment::Left`].
/// ``` /// ```
/// use ratatui::layout::Alignment;
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// use tui::layout::Alignment;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
/// ///
@@ -1669,7 +1667,7 @@ impl<'a> TextArea<'a> {
/// Get the text style at matches of text search. The default style is colored with blue in background. /// Get the text style at matches of text search. The default style is colored with blue in background.
/// ///
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let textarea = TextArea::default(); /// let textarea = TextArea::default();
@@ -1685,7 +1683,7 @@ impl<'a> TextArea<'a> {
/// Set the text style at matches of text search. The default style is colored with blue in background. /// Set the text style at matches of text search. The default style is colored with blue in background.
/// ///
/// ``` /// ```
/// use tui::style::{Style, Color}; /// use ratatui::style::{Style, Color};
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// let mut textarea = TextArea::default(); /// let mut textarea = TextArea::default();
@@ -1706,9 +1704,9 @@ impl<'a> TextArea<'a> {
/// the cursor position will be adjusted to stay in the viewport using the same logic as [`CursorMove::InViewport`]. /// the cursor position will be adjusted to stay in the viewport using the same logic as [`CursorMove::InViewport`].
/// ///
/// ``` /// ```
/// # use tui::buffer::Buffer; /// # use ratatui::buffer::Buffer;
/// # use tui::layout::Rect; /// # use ratatui::layout::Rect;
/// # use tui::widgets::Widget; /// # use ratatui::widgets::Widget;
/// use tui_textarea::TextArea; /// use tui_textarea::TextArea;
/// ///
/// // Let's say terminal height is 8. /// // Let's say terminal height is 8.
@@ -1749,12 +1747,12 @@ impl<'a> TextArea<'a> {
mod tests { mod tests {
use super::*; use super::*;
// Seaparate tests for ratatui support // Seaparate tests for tui-rs support
#[test] #[test]
fn scroll() { fn scroll() {
use crate::tui::buffer::Buffer; use crate::ratatui::buffer::Buffer;
use crate::tui::layout::Rect; use crate::ratatui::layout::Rect;
use crate::tui::widgets::Widget; use crate::ratatui::widgets::Widget;
let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect(); let mut textarea: TextArea = (0..20).map(|i| i.to_string()).collect();
let r = Rect { let r = Rect {

Просмотреть файл

@@ -1,8 +1,8 @@
use crate::ratatui::buffer::Buffer;
use crate::ratatui::layout::Rect;
use crate::ratatui::text::Text;
use crate::ratatui::widgets::{Paragraph, Widget};
use crate::textarea::TextArea; use crate::textarea::TextArea;
use crate::tui::buffer::Buffer;
use crate::tui::layout::Rect;
use crate::tui::text::Text;
use crate::tui::widgets::{Paragraph, Widget};
use crate::util::num_digits; use crate::util::num_digits;
use std::cmp; use std::cmp;
use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::atomic::{AtomicU64, Ordering};