From 8648e483f772b4791e5618c4c8b3db8926ae356d Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sun, 13 Jun 2021 16:35:05 -0700 Subject: [PATCH] Render indent-style status in status line. Also cleaned up the status line code a little. --- helix-term/src/ui/editor.rs | 56 ++++++++++++++++++++++++++----------- helix-view/src/document.rs | 4 ++- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index dd385ac9a..65b114a64 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -11,7 +11,10 @@ use helix_core::{ syntax::{self, HighlightEvent}, Position, Range, }; -use helix_view::{document::Mode, Document, Editor, Theme, View}; +use helix_view::{ + document::{IndentStyle, Mode}, + Document, Editor, Theme, View, +}; use std::borrow::Cow; use crossterm::{ @@ -455,6 +458,10 @@ impl EditorView { theme: &Theme, is_focused: bool, ) { + //------------------------------- + // Left side of the status line. + //------------------------------- + let mode = match doc.mode() { Mode::Insert => "INS", Mode::Select => "SEL", @@ -487,24 +494,41 @@ impl EditorView { ); } - surface.set_stringn( - viewport.x + viewport.width.saturating_sub(15), - viewport.y, - format!("{}", doc.diagnostics().len()), - 4, - text_color, - ); - - // render line:col - let pos = coords_at_pos(doc.text().slice(..), doc.selection(view.id).cursor()); - - let text = format!("{}:{}", pos.row + 1, pos.col + 1); // convert to 1-indexing - let len = text.len(); + //------------------------------- + // Right side of the status line. + //------------------------------- + + // Compute the individual info strings. + let diag_count = format!("{}", doc.diagnostics().len()); + let indent_info = match doc.indent_style { + IndentStyle::Tabs => "tab", + IndentStyle::Spaces(1) => "spaces:1", + IndentStyle::Spaces(2) => "spaces:2", + IndentStyle::Spaces(3) => "spaces:3", + IndentStyle::Spaces(4) => "spaces:4", + IndentStyle::Spaces(5) => "spaces:5", + IndentStyle::Spaces(6) => "spaces:6", + IndentStyle::Spaces(7) => "spaces:7", + IndentStyle::Spaces(8) => "spaces:8", + _ => "indent:ERROR", + }; + let position_info = { + let pos = coords_at_pos(doc.text().slice(..), doc.selection(view.id).cursor()); + format!("{}:{}", pos.row + 1, pos.col + 1) // convert to 1-indexing + }; + // Render them to the status line together. + let right_side_text = format!( + "{} {} {} ", + &diag_count[..diag_count.len().min(4)], + indent_info, + position_info + ); + let text_len = right_side_text.len() as u16; surface.set_string( - viewport.x + viewport.width.saturating_sub(len as u16 + 1), + viewport.x + viewport.width.saturating_sub(text_len), viewport.y, - text, + right_side_text, text_color, ); } diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 86dee16f2..d5ab1425b 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -32,7 +32,6 @@ pub struct Document { pub(crate) id: DocumentId, text: Rope, pub(crate) selections: HashMap, - pub(crate) indent_style: IndentStyle, path: Option, @@ -40,6 +39,9 @@ pub struct Document { pub mode: Mode, pub restore_cursor: bool, + /// Current indent style. + pub indent_style: IndentStyle, + syntax: Option, // /// Corresponding language scope name. Usually `source.`. pub(crate) language: Option>,