diff options
author | Andrew Neth | 2022-01-25 15:18:01 +0000 |
---|---|---|
committer | GitHub | 2022-01-25 15:18:01 +0000 |
commit | 333c2949c2b036f8aafa77be2286eb3c135ea269 (patch) | |
tree | df675b8ca37690a368e42bb91855e631d7e425cc /helix-view/src | |
parent | 48a0c806520ea6f0404ea1d3a996c7a658f36aec (diff) |
feat(helix-view): dynamic line numbers (#1522)
* feat(helix-view): dynamic line numbers
* docs: describe editor.line-number in more detail
* Make dynamic numbers the default behavior of `relative`
Diffstat (limited to 'helix-view/src')
-rw-r--r-- | helix-view/src/editor.rs | 4 | ||||
-rw-r--r-- | helix-view/src/gutter.rs | 24 |
2 files changed, 16 insertions, 12 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 82ef0cdc..aa2df6f7 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -170,7 +170,9 @@ impl Default for CursorShapeConfig { pub enum LineNumber { /// Show absolute line number Absolute, - /// Show relative line number to the primary cursor + + /// If focused and in normal/select mode, show relative line number to the primary cursor. + /// If unfocused or in insert mode, show absolute line number. Relative, } diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index af016c56..113da642 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -58,29 +58,31 @@ pub fn line_number<'doc>( .char_to_line(doc.selection(view.id).primary().cursor(text)); let config = config.line_number; + let mode = doc.mode; Box::new(move |line: usize, selected: bool, out: &mut String| { if line == last_line && !draw_last { write!(out, "{:>1$}", '~', width).unwrap(); Some(linenr) } else { - use crate::editor::LineNumber; - let line = match config { - LineNumber::Absolute => line + 1, - LineNumber::Relative => { - if current_line == line { - line + 1 - } else { - abs_diff(current_line, line) - } - } + use crate::{document::Mode, editor::LineNumber}; + + let relative = config == LineNumber::Relative + && mode != Mode::Insert + && is_focused + && current_line != line; + + let display_num = if relative { + abs_diff(current_line, line) + } else { + line + 1 }; let style = if selected && is_focused { linenr_select } else { linenr }; - write!(out, "{:>1$}", line, width).unwrap(); + write!(out, "{:>1$}", display_num, width).unwrap(); Some(style) } }) |