From 5d5b6bab9ba5211c8c146fb38276f968892e7882 Mon Sep 17 00:00:00 2001 From: Thomas <74479846+DeviousStoat@users.noreply.github.com> Date: Wed, 20 Apr 2022 03:44:32 +0200 Subject: [PATCH] Add rulers option (#2060) * Add color_column option * Rename to ruler Co-authored-by: DeviousStoat --- book/src/configuration.md | 1 + helix-core/src/syntax.rs | 2 ++ helix-term/src/ui/editor.rs | 27 +++++++++++++++++++++++++++ helix-view/src/editor.rs | 3 +++ 4 files changed, 33 insertions(+) diff --git a/book/src/configuration.md b/book/src/configuration.md index 3ec2bedb9..153ebb806 100644 --- a/book/src/configuration.md +++ b/book/src/configuration.md @@ -43,6 +43,7 @@ ### `[editor]` Section | `completion-trigger-len` | The min-length of word under cursor to trigger autocompletion | `2` | | `auto-info` | Whether to display infoboxes | `true` | | `true-color` | Set to `true` to override automatic detection of terminal truecolor support in the event of a false negative. | `false` | +| `rulers` | List of column positions at which to display the rulers. Can be overidden by language specific `rulers` in `languages.toml` file. | `[]` | ### `[editor.lsp]` Section diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs index 905b33474..2fd4ed9ba 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -104,6 +104,8 @@ pub struct LanguageConfiguration { /// global setting. #[serde(default, skip_serializing, deserialize_with = "deserialize_auto_pairs")] pub auto_pairs: Option, + + pub rulers: Option>, // if set, override editor's rulers } #[derive(Debug, Serialize, Deserialize)] diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 459a8c876..fc8b64701 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -126,6 +126,7 @@ pub fn render_view( Self::render_text_highlights(doc, view.offset, inner, surface, theme, highlights); Self::render_gutter(editor, doc, view, view.area, surface, theme, is_focused); + Self::render_rulers(editor, doc, view, inner, surface, theme); if is_focused { Self::render_focused_view_elements(view, doc, inner, theme, surface); @@ -152,6 +153,32 @@ pub fn render_view( self.render_statusline(doc, view, statusline_area, surface, theme, is_focused); } + pub fn render_rulers( + editor: &Editor, + doc: &Document, + view: &View, + viewport: Rect, + surface: &mut Surface, + theme: &Theme, + ) { + let editor_rulers = &editor.config().rulers; + let ruler_theme = theme.get("ui.virtual.ruler"); + + let rulers = doc + .language_config() + .and_then(|config| config.rulers.as_ref()) + .unwrap_or(editor_rulers); + + rulers + .iter() + // View might be horizontally scrolled, convert from absolute distance + // from the 1st column to relative distance from left of viewport + .filter_map(|ruler| ruler.checked_sub(1 + view.offset.col as u16)) + .filter(|ruler| ruler < &viewport.width) + .map(|ruler| viewport.clip_left(ruler).with_width(1)) + .for_each(|area| surface.set_style(area, ruler_theme)) + } + /// Get syntax highlights for a document in a view represented by the first line /// and column (`offset`) and the last line. This is done instead of using a view /// directly to enable rendering syntax highlighted docs anywhere (eg. picker preview) diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index dd805c000..0c2fad2b6 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -146,6 +146,8 @@ pub struct Config { #[serde(default)] pub search: SearchConfig, pub lsp: LspConfig, + /// Column numbers at which to draw the rulers. Default to `[]`, meaning no rulers. + pub rulers: Vec, } #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] @@ -285,6 +287,7 @@ fn default() -> Self { true_color: false, search: SearchConfig::default(), lsp: LspConfig::default(), + rulers: Vec::new(), } } }