1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-08-28 11:36:17 +03:00

chore: migrate to Rust 2024 edition and bump to v0.9.2 (#12)

* chore: migrate to Rust 2024 edition and bump to v0.9.2

- Bump edition to 2024 and rust-version to 1.85.0
- Replace f64::log10 with usize::ilog10 in num_digits
- Fix clippy lints surfaced by edition bump: repeat_n, derived Default, then_some
- Expand watch-check and watch-test aliases to cover all feature paths (crossterm_0_28, no-backend, tuirs variants, serde, arbitrary)
- Expand CI test and clippy workflows to full 6/8-entry feature matrices including termion on Ubuntu
- Apply rustfmt import reordering from edition 2024 rules

* fix: revert turis linux checks
Этот коммит содержится в:
srothgan
2026-02-19 18:38:50 +01:00
коммит произвёл GitHub
родитель f169a4b18c
Коммит 56f531a73f
25 изменённых файлов: 72 добавлений и 67 удалений

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

@@ -1,3 +1,3 @@
[alias] [alias]
watch-check = ["watch", "--why", "-x", "clippy --features=search,termwiz --examples --tests", "-x", "clippy --features tuirs-crossterm,search --no-default-features --examples --tests"] watch-check = ["watch", "--why", "-x", "clippy --features=search,termwiz,serde,arbitrary --examples --tests", "-x", "clippy --no-default-features --features=crossterm_0_28,search,serde,arbitrary --examples --tests", "-x", "clippy --no-default-features --features=no-backend,search,serde,arbitrary --examples --tests", "-x", "clippy --no-default-features --features=tuirs-crossterm,search,serde,arbitrary --examples --tests", "-x", "clippy --no-default-features --features=tuirs-no-backend,search,serde,arbitrary --examples --tests"]
watch-test = ["watch", "--why", "-x", "test --features=search,termwiz", "-w", "src", "-w", "tests"] watch-test = ["watch", "--why", "-x", "test --features=search,termwiz,serde,arbitrary", "-x", "test --no-default-features --features=crossterm_0_28,search,serde,arbitrary", "-x", "test --no-default-features --features=tuirs-crossterm,search,serde,arbitrary", "-w", "src", "-w", "tests"]

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

@@ -1 +1 @@
edition = "2021" edition = "2024"

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

@@ -1,3 +1,14 @@
<a id="v0.9.2"></a>
# [v0.9.2](https://github.com/srothgan/tui-textarea/releases/tag/v0.9.2) - 2026-02-19
- Migrate to Rust 2024 edition; bump `rust-version` to `1.85.0`.
- Replace floating-point `num_digits` with `usize::ilog10` for correctness on large values.
- Expand `watch-check` alias to cover `crossterm_0_28`, `no-backend`, `tuirs-crossterm`, `tuirs-no-backend`, `serde`, and `arbitrary` feature paths.
- Expand `watch-test` alias to cover `crossterm_0_28`, `tuirs-crossterm`, `serde`, and `arbitrary` features.
- Expand CI test and clippy workflows to full feature matrix including `termion` and `tuirs-termion` on Ubuntu.
[Changes][v0.9.2]
<a id="v0.9.1"></a> <a id="v0.9.1"></a>
# [v0.9.1](https://github.com/srothgan/tui-textarea/releases/tag/v0.9.1) - 2026-02-18 # [v0.9.1](https://github.com/srothgan/tui-textarea/releases/tag/v0.9.1) - 2026-02-18

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

@@ -3,9 +3,9 @@ name = "tui-textarea-2"
homepage = "https://github.com/srothgan/tui-textarea#readme" homepage = "https://github.com/srothgan/tui-textarea#readme"
repository = "https://github.com/srothgan/tui-textarea" repository = "https://github.com/srothgan/tui-textarea"
documentation = "https://docs.rs/tui-textarea-2/latest/tui_textarea/" documentation = "https://docs.rs/tui-textarea-2/latest/tui_textarea/"
version = "0.9.1" version = "0.9.2"
edition = "2021" edition = "2024"
rust-version = "1.56.1" # for `tui` crate support rust-version = "1.85.0" # for Rust 2024 edition support
authors = ["Simon Peter Rothgang <simonrothgang@icloud.com>", "rhysd <lin90162@yahoo.co.jp>"] authors = ["Simon Peter Rothgang <simonrothgang@icloud.com>", "rhysd <lin90162@yahoo.co.jp>"]
description = """ description = """
tui-textarea is a simple yet powerful text editor widget for ratatui and tui-rs. Multi-line tui-textarea is a simple yet powerful text editor widget for ratatui and tui-rs. Multi-line

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

@@ -1,13 +1,13 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style}; use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span}; use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Paragraph}; 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;
@@ -53,11 +53,7 @@ impl SearchBox<'_> {
} }
fn height(&self) -> u16 { fn height(&self) -> u16 {
if self.open { if self.open { 3 } else { 0 }
3
} else {
0
}
} }
fn input(&mut self, input: Input) -> Option<&'_ str> { fn input(&mut self, input: Input) -> Option<&'_ str> {

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

@@ -1,10 +1,10 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};

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

@@ -1,12 +1,12 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Layout}; use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style}; use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};

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

@@ -1,12 +1,12 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::layout::Rect; use ratatui::layout::Rect;
use ratatui::style::{Color, Style}; use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};

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

@@ -1,12 +1,12 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Layout}; use ratatui::layout::{Constraint, Layout};
use ratatui::style::{Color, Style}; use ratatui::style::{Color, Style};
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};

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

@@ -1,12 +1,12 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style}; use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::io; use std::io;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};

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

@@ -1,6 +1,6 @@
use ratatui::Terminal;
use ratatui::backend::TermionBackend; use ratatui::backend::TermionBackend;
use ratatui::widgets::{Block, Borders}; 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;
@@ -32,9 +32,11 @@ fn main() -> Result<(), Box<dyn Error>> {
keys_tx.send(Event::Term(event)).unwrap(); keys_tx.send(Event::Term(event)).unwrap();
} }
}); });
thread::spawn(move || loop { thread::spawn(move || {
tx.send(Event::Tick).unwrap(); loop {
thread::sleep(Duration::from_millis(100)); tx.send(Event::Tick).unwrap();
thread::sleep(Duration::from_millis(100));
}
}); });
rx rx
}; };

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

@@ -1,6 +1,6 @@
use ratatui::Terminal;
use ratatui::backend::TermwizBackend; use ratatui::backend::TermwizBackend;
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::error::Error; use std::error::Error;
use std::time::Duration; use std::time::Duration;
use termwiz::input::InputEvent; use termwiz::input::InputEvent;

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

@@ -3,7 +3,7 @@ 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, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use std::borrow::Cow; use std::borrow::Cow;
use std::env; use std::env;
@@ -12,12 +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::Terminal;
use tui::backend::CrosstermBackend; use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout}; use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Color, Modifier, Style}; use tui::style::{Color, Modifier, Style};
use tui::text::{Span, Spans}; use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Paragraph}; 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 {
@@ -56,11 +56,7 @@ impl SearchBox<'_> {
} }
fn height(&self) -> u16 { fn height(&self) -> u16 {
if self.open { if self.open { 3 } else { 0 }
3
} else {
0
}
} }
fn input(&mut self, input: Input) -> Option<&'_ str> { fn input(&mut self, input: Input) -> Option<&'_ str> {

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

@@ -3,12 +3,12 @@ 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, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use std::io; use std::io;
use tui::Terminal;
use tui::backend::CrosstermBackend; use tui::backend::CrosstermBackend;
use tui::widgets::{Block, Borders}; 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<()> {

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

@@ -10,9 +10,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::AlternateScreen; use termion::screen::AlternateScreen;
use tui::Terminal;
use tui::backend::TermionBackend; use tui::backend::TermionBackend;
use tui::widgets::{Block, Borders}; use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};
enum Event { enum Event {
@@ -36,9 +36,11 @@ fn main() -> Result<(), Box<dyn Error>> {
keys_tx.send(Event::Term(event)).unwrap(); keys_tx.send(Event::Term(event)).unwrap();
} }
}); });
thread::spawn(move || loop { thread::spawn(move || {
tx.send(Event::Tick).unwrap(); loop {
thread::sleep(Duration::from_millis(100)); tx.send(Event::Tick).unwrap();
thread::sleep(Duration::from_millis(100));
}
}); });
rx rx
}; };

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

@@ -1,11 +1,11 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::layout::{Constraint, Direction, Layout}; use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::widgets::{Block, Borders}; use ratatui::widgets::{Block, Borders};
use ratatui::Terminal;
use std::cmp; use std::cmp;
use std::io; use std::io;
use tui_textarea::{Input, Key, TextArea}; use tui_textarea::{Input, Key, TextArea};

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

@@ -1,11 +1,11 @@
use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use crossterm::event::{DisableMouseCapture, EnableMouseCapture};
use crossterm::terminal::{ use crossterm::terminal::{
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode,
}; };
use ratatui::Terminal;
use ratatui::backend::CrosstermBackend; use ratatui::backend::CrosstermBackend;
use ratatui::style::{Color, Modifier, Style}; use ratatui::style::{Color, Modifier, Style};
use ratatui::widgets::{Block, Borders}; 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;

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

@@ -5,7 +5,6 @@ use crate::util::{num_digits, spaces};
use ratatui_core::text::Line; use ratatui_core::text::Line;
use std::borrow::Cow; use std::borrow::Cow;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::iter;
#[cfg(feature = "tuirs")] #[cfg(feature = "tuirs")]
use tui::text::Spans as Line; use tui::text::Spans as Line;
use unicode_width::UnicodeWidthChar as _; use unicode_width::UnicodeWidthChar as _;
@@ -64,7 +63,7 @@ impl DisplayTextBuilder {
fn build<'s>(&mut self, s: &'s str) -> Cow<'s, str> { fn build<'s>(&mut self, s: &'s str) -> Cow<'s, str> {
if let Some(ch) = self.mask { if let Some(ch) = self.mask {
// Note: We don't need to track width on masking text since width of tab character is fixed // Note: We don't need to track width on masking text since width of tab character is fixed
let masked = iter::repeat(ch).take(s.chars().count()).collect(); let masked = std::iter::repeat_n(ch, s.chars().count()).collect();
return Cow::Owned(masked); return Cow::Owned(masked);
} }
@@ -100,7 +99,7 @@ impl DisplayTextBuilder {
pub struct LineHighlighter<'a> { pub struct LineHighlighter<'a> {
line: &'a str, line: &'a str,
spans: Vec<Span<'a>>, spans: Vec<Span<'a>>,
boundaries: Vec<(Boundary, usize)>, // TODO: Consider smallvec boundaries: Vec<(Boundary, usize)>,
style_begin: Style, style_begin: Style,
cursor_at_end: bool, cursor_at_end: bool,
cursor_style: Style, cursor_style: Style,

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

@@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize};
/// ///
/// This type is marked as `#[non_exhaustive]` since more keys may be supported in the future. /// This type is marked as `#[non_exhaustive]` since more keys may be supported in the future.
#[non_exhaustive] #[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Hash, Eq)] #[derive(Clone, Copy, Debug, Default, PartialEq, Hash, Eq)]
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Key { pub enum Key {
@@ -63,15 +63,10 @@ pub enum Key {
/// Virtual key to scroll up by mouse /// Virtual key to scroll up by mouse
MouseScrollUp, MouseScrollUp,
/// An invalid key input (this key is always ignored by [`TextArea`](crate::TextArea)) /// An invalid key input (this key is always ignored by [`TextArea`](crate::TextArea))
#[default]
Null, Null,
} }
impl Default for Key {
fn default() -> Self {
Key::Null
}
}
/// Backend-agnostic key input type. /// Backend-agnostic key input type.
/// ///
/// When `crossterm`, `termion`, `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

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

@@ -5,7 +5,9 @@
#![doc = include_str!("../README.md")] #![doc = include_str!("../README.md")]
#[cfg(all(feature = "ratatui", feature = "tuirs"))] #[cfg(all(feature = "ratatui", feature = "tuirs"))]
compile_error!("ratatui support and tui-rs support are exclusive. 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 exclusive. 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;

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

@@ -192,10 +192,10 @@ mod tests {
// Separate tests for tui-rs support // Separate tests for tui-rs support
#[test] #[test]
fn delta() { fn delta() {
use crate::TextArea;
use crate::ratatui::buffer::Buffer; use crate::ratatui::buffer::Buffer;
use crate::ratatui::layout::Rect; use crate::ratatui::layout::Rect;
use crate::ratatui::widgets::Widget as _; use crate::ratatui::widgets::Widget as _;
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();
let r = Rect { let r = Rect {

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

@@ -8,12 +8,12 @@ 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::util::{num_digits, spaces, Pos}; use crate::util::{Pos, num_digits, spaces};
use crate::widget::Viewport; use crate::widget::Viewport;
use crate::word::{find_word_exclusive_end_forward, find_word_start_backward}; use crate::word::{find_word_exclusive_end_forward, find_word_start_backward};
use crate::wrap::{ use crate::wrap::{
cursor_at_visual_row, cursor_visual_row, effective_wrap_width, wrapped_rows, WrapMode, WrapMode, WrappedLine, cursor_at_visual_row, cursor_visual_row, effective_wrap_width,
WrappedLine, wrapped_rows,
}; };
#[cfg(feature = "ratatui")] #[cfg(feature = "ratatui")]
use ratatui_core::text::Line; use ratatui_core::text::Line;
@@ -889,10 +889,12 @@ impl<'a> TextArea<'a> {
return; return;
} }
let mut deleted = vec![self.lines[start.row] let mut deleted = vec![
.drain(start.offset..) self.lines[start.row]
.as_str() .drain(start.offset..)
.to_string()]; .as_str()
.to_string(),
];
deleted.extend(self.lines.drain(start.row + 1..end.row)); deleted.extend(self.lines.drain(start.row + 1..end.row));
if start.row + 1 < self.lines.len() { if start.row + 1 < self.lines.len() {
let mut last_line = self.lines.remove(start.row + 1); let mut last_line = self.lines.remove(start.row + 1);

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

@@ -4,7 +4,7 @@ pub fn spaces(size: u8) -> &'static str {
} }
pub fn num_digits(i: usize) -> u8 { pub fn num_digits(i: usize) -> u8 {
f64::log10(i as f64) as u8 + 1 if i == 0 { 1 } else { i.ilog10() as u8 + 1 }
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

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

@@ -4,7 +4,7 @@ use crate::ratatui::text::{Span, Text};
use crate::ratatui::widgets::{Paragraph, Widget}; use crate::ratatui::widgets::{Paragraph, Widget};
use crate::textarea::TextArea; use crate::textarea::TextArea;
use crate::util::num_digits; use crate::util::num_digits;
use crate::wrap::{cursor_visual_row, effective_wrap_width, wrapped_rows, WrapMode}; use crate::wrap::{WrapMode, cursor_visual_row, effective_wrap_width, wrapped_rows};
use portable_atomic::{AtomicU64, Ordering}; use portable_atomic::{AtomicU64, Ordering};
#[cfg(feature = "ratatui")] #[cfg(feature = "ratatui")]
use ratatui_core::text::Line; use ratatui_core::text::Line;

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

@@ -79,5 +79,5 @@ pub fn find_word_start_backward(line: &str, start_col: usize) -> Option<usize> {
} }
cur = next; cur = next;
} }
(cur != CharKind::Space).then(|| 0) (cur != CharKind::Space).then_some(0)
} }