diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..8e7a315 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1759644710501 + + + + + + \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index fbe15d1..8722262 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1460,6 +1460,7 @@ dependencies = [ "syntect", "tokio", "two-face", + "unicode-segmentation", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index b425a5f..b49aaf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ syntect = "5.2.0" two-face = "0.4.3" # Internationalization icu = { version = "2.0.0", features = ["compiled_data"] } +unicode-segmentation = "1.12" i18n-embed = { version = "0.16", features = [ "fluent-system", "desktop-requester", diff --git a/src/main.rs b/src/main.rs index 8dc144a..1aa2005 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,7 @@ use cosmic_files::{ }; use cosmic_text::{Cursor, Edit, Family, Selection, SwashCache, SyntaxSystem, ViMode}; use serde::{Deserialize, Serialize}; +use unicode_segmentation::UnicodeSegmentation; use std::{ any::TypeId, collections::HashMap, @@ -868,11 +869,13 @@ impl App { editor.with_buffer(|buffer| { line_count = buffer.lines.len(); for line in buffer.lines.iter() { + let text = line.text(); let mut last_whitespace = true; - //TODO: do graphemes? - for c in line.text().chars() { + + // Count graphemes instead of Unicode scalar values for accurate character count + for grapheme in text.graphemes(true) { character_count += 1; - let is_whitespace = c.is_whitespace(); + let is_whitespace = grapheme.chars().all(|c| c.is_whitespace()); if !is_whitespace { character_count_no_spaces += 1; if last_whitespace {