diff --git a/docs/iamb.1 b/docs/iamb.1 index 62deb4c..2487b92 100644 --- a/docs/iamb.1 +++ b/docs/iamb.1 @@ -114,8 +114,6 @@ Redact the selected message with the optional reason. Reply to the selected message. .It Sy ":cancel" Cancel the currently drafted message including replies. -.It Sy ":unreads clear" -Mark all unread rooms as read. .It Sy ":upload [path]" Upload an attachment and send it to the currently selected room. .El diff --git a/docs/iamb.5 b/docs/iamb.5 index 26fc1b7..0fdab5f 100644 --- a/docs/iamb.5 +++ b/docs/iamb.5 @@ -208,6 +208,9 @@ See .Sx "SORTING LISTS" for more details. +.It Sy state_event_display +Defines whether the state events like joined or left are shown. + .It Sy typing_notice_send Defines whether or not the typing state is sent. @@ -231,6 +234,10 @@ Possible values are Specify the width of the column where usernames are displayed in a room. Usernames that are too long are truncated. Defaults to 30. + +.It Sy tabstop +Number of spaces that a counts for. +Defaults to 4. .El .Ss Example 1: Avoid showing Emojis (useful for terminals w/o support) diff --git a/src/base.rs b/src/base.rs index 1cd3071..fdb7875 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1361,7 +1361,9 @@ impl RoomInfo { } if !settings.tunables.typing_notice_display { - return area; + // still keep one line blank, so `render_jump_to_recent` doesn't immediately hide the + // last line in scrollback + return Rect::new(area.x, area.y, area.width, area.height - 1); } let top = Rect::new(area.x, area.y, area.width, area.height - 1); diff --git a/src/config.rs b/src/config.rs index 64271e4..2817df0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -578,6 +578,7 @@ pub struct TunableValues { pub image_preview: Option, pub user_gutter_width: usize, pub external_edit_file_suffix: String, + pub tabstop: usize, } #[derive(Clone, Default, Deserialize)] @@ -605,6 +606,7 @@ pub struct Tunables { pub image_preview: Option, pub user_gutter_width: Option, pub external_edit_file_suffix: Option, + pub tabstop: Option, } impl Tunables { @@ -638,6 +640,7 @@ impl Tunables { external_edit_file_suffix: self .external_edit_file_suffix .or(other.external_edit_file_suffix), + tabstop: self.tabstop.or(other.tabstop), } } @@ -667,6 +670,7 @@ impl Tunables { external_edit_file_suffix: self .external_edit_file_suffix .unwrap_or_else(|| ".md".to_string()), + tabstop: self.tabstop.unwrap_or(4), } } } diff --git a/src/message/html.rs b/src/message/html.rs index 82aac65..8c36df7 100644 --- a/src/message/html.rs +++ b/src/message/html.rs @@ -748,7 +748,7 @@ fn h2t(hdl: &Handle, state: &mut TreeGenState) -> StyleTreeChildren { StyleTreeNode::Style(c, s) }, - "del" | "strike" => { + "del" | "s" | "strike" => { let c = c2t(&node.children.borrow(), state); let s = Style::default().add_modifier(StyleModifier::CROSSED_OUT); @@ -1415,13 +1415,14 @@ pub mod tests { let s = concat!( "
",
             "fn hello() -> usize {\n",
+            " \t// weired\n",
             "    return 5;\n",
             "}\n",
             "
\n" ); let tree = parse_matrix_html(s); let text = tree.to_text(25, Style::default(), true, &settings); - assert_eq!(text.lines.len(), 5); + assert_eq!(text.lines.len(), 6); assert_eq!( text.lines[0], Line::from(vec![ @@ -1452,6 +1453,20 @@ pub mod tests { ); assert_eq!( text.lines[2], + Line::from(vec![ + Span::raw(line::VERTICAL), + Span::raw(" "), + Span::raw(" "), + Span::raw("/"), + Span::raw("/"), + Span::raw(" "), + Span::raw("weired"), + Span::raw(" "), + Span::raw(line::VERTICAL) + ]) + ); + assert_eq!( + text.lines[3], Line::from(vec![ Span::raw(line::VERTICAL), Span::raw(" "), @@ -1464,7 +1479,7 @@ pub mod tests { ]) ); assert_eq!( - text.lines[3], + text.lines[4], Line::from(vec![ Span::raw(line::VERTICAL), Span::raw("}"), @@ -1473,7 +1488,7 @@ pub mod tests { ]) ); assert_eq!( - text.lines[4], + text.lines[5], Line::from(vec![ Span::raw(line::BOTTOM_LEFT), Span::raw(line::HORIZONTAL.repeat(23)), diff --git a/src/message/mod.rs b/src/message/mod.rs index 4608303..e1dbedc 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -176,7 +176,9 @@ fn placeholder_frame( } let mut placeholder = "\u{230c}".to_string(); placeholder.push_str(&" ".repeat(width - 2)); - placeholder.push_str("\u{230d}\n"); + placeholder.push('\u{230d}'); + placeholder.push_str(&"\n".repeat((height - 1) / 2)); + if *height > 2 { if let Some(text) = text { if text.width() <= width - 2 { @@ -186,7 +188,7 @@ fn placeholder_frame( } } - placeholder.push_str(&"\n".repeat(height - 2)); + placeholder.push_str(&"\n".repeat(height / 2)); placeholder.push('\u{230e}'); placeholder.push_str(&" ".repeat(width - 2)); placeholder.push_str("\u{230f}\n"); @@ -1087,7 +1089,7 @@ impl Message { }, ImageStatus::Loaded(backend) => { proto = Some(backend); - placeholder_frame(Some("Loading..."), width, &backend.area().into()) + placeholder_frame(Some("Cut off..."), width, &backend.area().into()) }, ImageStatus::Error(err) => Some(format!("[Image error: {err}]\n")), }; @@ -1358,6 +1360,33 @@ pub mod tests { OK ⌎ ⌏ +"# + ) + ); + assert_eq!( + placeholder_frame(Some("OK"), 6, &ImagePreviewSize { width: 6, height: 6 }), + pretty_frame_test( + r#" +⌌ ⌍ + + OK + + +⌎ ⌏ +"# + ) + ); + assert_eq!( + placeholder_frame(Some("OK"), 6, &ImagePreviewSize { width: 6, height: 7 }), + pretty_frame_test( + r#" +⌌ ⌍ + + + OK + + +⌎ ⌏ "# ) ); diff --git a/src/message/printer.rs b/src/message/printer.rs index d2a2dd0..3418752 100644 --- a/src/message/printer.rs +++ b/src/message/printer.rs @@ -216,6 +216,8 @@ impl<'a> TextPrinter<'a> { return; } + let tabstop = self.settings().tunables.tabstop; + for mut word in UnicodeSegmentation::split_word_bounds(s) { if let "\n" | "\r\n" = word { if self.literal { @@ -232,11 +234,17 @@ impl<'a> TextPrinter<'a> { continue; } - let cow = if self.emoji_shortcodes() { + let mut cow = if self.emoji_shortcodes() { Cow::Owned(replace_emojis_in_str(word)) } else { Cow::Borrowed(word) }; + + if cow == "\t" { + let tablen = tabstop - (self.curr_width % tabstop); + cow = Cow::Owned(" ".repeat(tablen)); + } + let sw = UnicodeWidthStr::width(cow.as_ref()); if sw > self.width { diff --git a/src/tests.rs b/src/tests.rs index ef6f82c..7e957e1 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -199,6 +199,7 @@ pub fn mock_tunables() -> TunableValues { }, image_preview: None, user_gutter_width: 30, + tabstop: 4, } } diff --git a/src/windows/room/scrollback.rs b/src/windows/room/scrollback.rs index 3d8ec7f..53da0b7 100644 --- a/src/windows/room/scrollback.rs +++ b/src/windows/room/scrollback.rs @@ -1571,7 +1571,7 @@ mod tests { // MSG1: | XXXday, Month NN 20XX | // | @user1:example.com writhe | // |------------------------------------------------------------| - let area = Rect::new(0, 0, 60, 4); + let area = Rect::new(0, 0, 60, 5); let mut buffer = Buffer::empty(area); scrollback.draw(area, &mut buffer, true, &mut store);