From 1a223e23fbcc712b904cbbe99f199e27a3ec0a11 Mon Sep 17 00:00:00 2001 From: Finn Evers Date: Wed, 29 Oct 2025 12:07:23 +0100 Subject: [PATCH] Revert "Support relative line number on wrapped lines (#39268)" (#41450) Closes #41422 This completely broke line numbering as described in the linked issue and scrolling up does not have the correct numbers any more. Release Notes: - NOTE: The `relative_line_numbers` change (https://github.com/zed-industries/zed/pull/39268) was reverted and did not make the release cut! --- assets/settings/default.json | 2 +- crates/editor/src/display_map/wrap_map.rs | 1 - crates/editor/src/editor.rs | 22 +- crates/editor/src/editor_settings.rs | 4 +- crates/editor/src/element.rs | 344 ++++++------------ crates/migrator/src/migrations.rs | 6 - .../src/migrations/m_2025_10_21/settings.rs | 16 - crates/migrator/src/migrator.rs | 1 - crates/multi_buffer/src/multi_buffer.rs | 4 - crates/multi_buffer/src/multi_buffer_tests.rs | 3 - .../settings/src/settings_content/editor.rs | 41 +-- crates/settings/src/vscode_import.rs | 2 +- crates/settings_ui/src/page_data.rs | 2 +- crates/settings_ui/src/settings_ui.rs | 1 - docs/src/configuring-zed.md | 26 +- docs/src/vim.md | 4 +- docs/src/visual-customization.md | 2 +- 17 files changed, 124 insertions(+), 357 deletions(-) delete mode 100644 crates/migrator/src/migrations/m_2025_10_21/settings.rs diff --git a/assets/settings/default.json b/assets/settings/default.json index b300500b9f..10aa98498b 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -592,7 +592,7 @@ // to both the horizontal and vertical delta values while scrolling. Fast scrolling // happens when a user holds the alt or option key while scrolling. "fast_scroll_sensitivity": 4.0, - "relative_line_numbers": "disabled", + "relative_line_numbers": false, // If 'search_wrap' is disabled, search result do not wrap around the end of the file. "search_wrap": true, // Search options to enable by default when opening new project and buffer searches. diff --git a/crates/editor/src/display_map/wrap_map.rs b/crates/editor/src/display_map/wrap_map.rs index f0dc292e4e..e79e5555a6 100644 --- a/crates/editor/src/display_map/wrap_map.rs +++ b/crates/editor/src/display_map/wrap_map.rs @@ -1017,7 +1017,6 @@ impl Iterator for WrapRows<'_> { multibuffer_row: None, diff_status, expand_info: None, - wrapped_buffer_row: buffer_row.buffer_row, } } else { buffer_row diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index f542b864bb..bcabf12240 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -163,10 +163,7 @@ use rpc::{ErrorCode, ErrorExt, proto::PeerId}; use scroll::{Autoscroll, OngoingScroll, ScrollAnchor, ScrollManager}; use selections_collection::{MutableSelectionsCollection, SelectionsCollection}; use serde::{Deserialize, Serialize}; -use settings::{ - GitGutterSetting, RelativeLineNumbers, Settings, SettingsLocation, SettingsStore, - update_settings_file, -}; +use settings::{GitGutterSetting, Settings, SettingsLocation, SettingsStore, update_settings_file}; use smallvec::{SmallVec, smallvec}; use snippet::Snippet; use std::{ @@ -19489,16 +19486,9 @@ impl Editor { EditorSettings::get_global(cx).gutter.line_numbers } - pub fn relative_line_numbers(&self, cx: &mut App) -> RelativeLineNumbers { - match ( - self.use_relative_line_numbers, - EditorSettings::get_global(cx).relative_line_numbers, - ) { - (None, setting) => setting, - (Some(false), _) => RelativeLineNumbers::Disabled, - (Some(true), RelativeLineNumbers::Wrapped) => RelativeLineNumbers::Wrapped, - (Some(true), _) => RelativeLineNumbers::Enabled, - } + pub fn should_use_relative_line_numbers(&self, cx: &mut App) -> bool { + self.use_relative_line_numbers + .unwrap_or(EditorSettings::get_global(cx).relative_line_numbers) } pub fn toggle_relative_line_numbers( @@ -19507,8 +19497,8 @@ impl Editor { _: &mut Window, cx: &mut Context, ) { - let is_relative = self.relative_line_numbers(cx); - self.set_relative_line_number(Some(!is_relative.enabled()), cx) + let is_relative = self.should_use_relative_line_numbers(cx); + self.set_relative_line_number(Some(!is_relative), cx) } pub fn set_relative_line_number(&mut self, is_relative: Option, cx: &mut Context) { diff --git a/crates/editor/src/editor_settings.rs b/crates/editor/src/editor_settings.rs index d4ffeaa03c..dc67ab3ed6 100644 --- a/crates/editor/src/editor_settings.rs +++ b/crates/editor/src/editor_settings.rs @@ -3,12 +3,12 @@ use core::num; use gpui::App; use language::CursorShape; use project::project_settings::DiagnosticSeverity; +use settings::Settings; pub use settings::{ CurrentLineHighlight, DelayMs, DisplayIn, DocumentColorsRenderMode, DoubleClickInMultibuffer, GoToDefinitionFallback, HideMouseMode, MinimapThumb, MinimapThumbBorder, MultiCursorModifier, ScrollBeyondLastLine, ScrollbarDiagnostics, SeedQuerySetting, ShowMinimap, SnippetSortOrder, }; -use settings::{RelativeLineNumbers, Settings}; use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; /// Imports from the VSCode settings at @@ -33,7 +33,7 @@ pub struct EditorSettings { pub horizontal_scroll_margin: f32, pub scroll_sensitivity: f32, pub fast_scroll_sensitivity: f32, - pub relative_line_numbers: RelativeLineNumbers, + pub relative_line_numbers: bool, pub seed_search_query_from_cursor: SeedQuerySetting, pub use_smartcase_search: bool, pub multi_cursor_modifier: MultiCursorModifier, diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 9cade5dc67..1fcc90a863 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -764,14 +764,8 @@ impl EditorElement { .row; if line_numbers .get(&MultiBufferRow(multi_buffer_row)) - .is_some_and(|line_layout| { - line_layout.segments.iter().any(|segment| { - segment - .hitbox - .as_ref() - .is_some_and(|hitbox| hitbox.contains(&event.position)) - }) - }) + .and_then(|line_number| line_number.hitbox.as_ref()) + .is_some_and(|hitbox| hitbox.contains(&event.position)) { let line_offset_from_top = display_row - position_map.scroll_position.y as u32; @@ -3151,10 +3145,9 @@ impl EditorElement { fn calculate_relative_line_numbers( &self, - buffer_rows: &[RowInfo], + snapshot: &EditorSnapshot, rows: &Range, relative_to: Option, - count_wrapped_lines: bool, ) -> HashMap { let mut relative_rows: HashMap = Default::default(); let Some(relative_to) = relative_to else { @@ -3162,19 +3155,18 @@ impl EditorElement { }; let start = rows.start.min(relative_to); + let end = rows.end.max(relative_to); + + let buffer_rows = snapshot + .row_infos(start) + .take(1 + end.minus(start) as usize) + .collect::>(); let head_idx = relative_to.minus(start); let mut delta = 1; let mut i = head_idx + 1; - let should_count_line = |row_info: &RowInfo| { - if count_wrapped_lines { - row_info.buffer_row.is_some() || row_info.wrapped_buffer_row.is_some() - } else { - row_info.buffer_row.is_some() - } - }; while i < buffer_rows.len() as u32 { - if should_count_line(&buffer_rows[i as usize]) { + if buffer_rows[i as usize].buffer_row.is_some() { if rows.contains(&DisplayRow(i + start.0)) { relative_rows.insert(DisplayRow(i + start.0), delta); } @@ -3184,13 +3176,13 @@ impl EditorElement { } delta = 1; i = head_idx.min(buffer_rows.len().saturating_sub(1) as u32); - while i > 0 && buffer_rows[i as usize].buffer_row.is_none() && !count_wrapped_lines { + while i > 0 && buffer_rows[i as usize].buffer_row.is_none() { i -= 1; } while i > 0 { i -= 1; - if should_count_line(&buffer_rows[i as usize]) { + if buffer_rows[i as usize].buffer_row.is_some() { if rows.contains(&DisplayRow(i + start.0)) { relative_rows.insert(DisplayRow(i + start.0), delta); } @@ -3222,7 +3214,7 @@ impl EditorElement { return Arc::default(); } - let (newest_selection_head, relative) = self.editor.update(cx, |editor, cx| { + let (newest_selection_head, is_relative) = self.editor.update(cx, |editor, cx| { let newest_selection_head = newest_selection_head.unwrap_or_else(|| { let newest = editor .selections @@ -3238,97 +3230,79 @@ impl EditorElement { ) .head }); - let relative = editor.relative_line_numbers(cx); - (newest_selection_head, relative) + let is_relative = editor.should_use_relative_line_numbers(cx); + (newest_selection_head, is_relative) }); - let relative_to = if relative.enabled() { + let relative_to = if is_relative { Some(newest_selection_head.row()) } else { None }; - let relative_rows = self.calculate_relative_line_numbers( - &buffer_rows, - &rows, - relative_to, - relative.wrapped(), - ); + let relative_rows = self.calculate_relative_line_numbers(snapshot, &rows, relative_to); let mut line_number = String::new(); - let segments = buffer_rows.iter().enumerate().flat_map(|(ix, row_info)| { - let display_row = DisplayRow(rows.start.0 + ix as u32); - line_number.clear(); - let non_relative_number = if relative.wrapped() { - row_info.buffer_row.or(row_info.wrapped_buffer_row)? + 1 - } else { - row_info.buffer_row? + 1 - }; - let number = relative_rows - .get(&display_row) - .unwrap_or(&non_relative_number); - write!(&mut line_number, "{number}").unwrap(); - if row_info - .diff_status - .is_some_and(|status| status.is_deleted()) - { - return None; - } + let line_numbers = buffer_rows + .iter() + .enumerate() + .flat_map(|(ix, row_info)| { + let display_row = DisplayRow(rows.start.0 + ix as u32); + line_number.clear(); + let non_relative_number = row_info.buffer_row? + 1; + let number = relative_rows + .get(&display_row) + .unwrap_or(&non_relative_number); + write!(&mut line_number, "{number}").unwrap(); + if row_info + .diff_status + .is_some_and(|status| status.is_deleted()) + { + return None; + } - let color = active_rows - .get(&display_row) - .map(|spec| { - if spec.breakpoint { - cx.theme().colors().debugger_accent - } else { - cx.theme().colors().editor_active_line_number - } - }) - .unwrap_or_else(|| cx.theme().colors().editor_line_number); - let shaped_line = - self.shape_line_number(SharedString::from(&line_number), color, window); - let scroll_top = scroll_position.y * ScrollPixelOffset::from(line_height); - let line_origin = gutter_hitbox.map(|hitbox| { - hitbox.origin - + point( - hitbox.size.width - shaped_line.width - gutter_dimensions.right_padding, - ix as f32 * line_height - - Pixels::from(scroll_top % ScrollPixelOffset::from(line_height)), + let color = active_rows + .get(&display_row) + .map(|spec| { + if spec.breakpoint { + cx.theme().colors().debugger_accent + } else { + cx.theme().colors().editor_active_line_number + } + }) + .unwrap_or_else(|| cx.theme().colors().editor_line_number); + let shaped_line = + self.shape_line_number(SharedString::from(&line_number), color, window); + let scroll_top = scroll_position.y * ScrollPixelOffset::from(line_height); + let line_origin = gutter_hitbox.map(|hitbox| { + hitbox.origin + + point( + hitbox.size.width - shaped_line.width - gutter_dimensions.right_padding, + ix as f32 * line_height + - Pixels::from(scroll_top % ScrollPixelOffset::from(line_height)), + ) + }); + + #[cfg(not(test))] + let hitbox = line_origin.map(|line_origin| { + window.insert_hitbox( + Bounds::new(line_origin, size(shaped_line.width, line_height)), + HitboxBehavior::Normal, ) - }); + }); + #[cfg(test)] + let hitbox = { + let _ = line_origin; + None + }; - #[cfg(not(test))] - let hitbox = line_origin.map(|line_origin| { - window.insert_hitbox( - Bounds::new(line_origin, size(shaped_line.width, line_height)), - HitboxBehavior::Normal, - ) - }); - #[cfg(test)] - let hitbox = { - let _ = line_origin; - None - }; - - let segment = LineNumberSegment { - shaped_line, - hitbox, - }; - - let buffer_row = DisplayPoint::new(display_row, 0).to_point(snapshot).row; - let multi_buffer_row = MultiBufferRow(buffer_row); - - Some((multi_buffer_row, segment)) - }); - - let mut line_numbers: HashMap = HashMap::default(); - for (buffer_row, segment) in segments { - line_numbers - .entry(buffer_row) - .or_insert_with(|| LineNumberLayout { - segments: Default::default(), - }) - .segments - .push(segment); - } + let multi_buffer_row = DisplayPoint::new(display_row, 0).to_point(snapshot).row; + let multi_buffer_row = MultiBufferRow(multi_buffer_row); + let line_number = LineNumberLayout { + shaped_line, + hitbox, + }; + Some((multi_buffer_row, line_number)) + }) + .collect(); Arc::new(line_numbers) } @@ -5866,36 +5840,34 @@ impl EditorElement { let line_height = layout.position_map.line_height; window.set_cursor_style(CursorStyle::Arrow, &layout.gutter_hitbox); - for line_layout in layout.line_numbers.values() { - for LineNumberSegment { - shaped_line, - hitbox, - } in &line_layout.segments - { - let Some(hitbox) = hitbox else { - continue; - }; + for LineNumberLayout { + shaped_line, + hitbox, + } in layout.line_numbers.values() + { + let Some(hitbox) = hitbox else { + continue; + }; - let Some(()) = (if !is_singleton && hitbox.is_hovered(window) { - let color = cx.theme().colors().editor_hover_line_number; + let Some(()) = (if !is_singleton && hitbox.is_hovered(window) { + let color = cx.theme().colors().editor_hover_line_number; - let line = self.shape_line_number(shaped_line.text.clone(), color, window); - line.paint(hitbox.origin, line_height, window, cx).log_err() - } else { - shaped_line - .paint(hitbox.origin, line_height, window, cx) - .log_err() - }) else { - continue; - }; + let line = self.shape_line_number(shaped_line.text.clone(), color, window); + line.paint(hitbox.origin, line_height, window, cx).log_err() + } else { + shaped_line + .paint(hitbox.origin, line_height, window, cx) + .log_err() + }) else { + continue; + }; - // In singleton buffers, we select corresponding lines on the line number click, so use | -like cursor. - // In multi buffers, we open file at the line number clicked, so use a pointing hand cursor. - if is_singleton { - window.set_cursor_style(CursorStyle::IBeam, hitbox); - } else { - window.set_cursor_style(CursorStyle::PointingHand, hitbox); - } + // In singleton buffers, we select corresponding lines on the line number click, so use | -like cursor. + // In multi buffers, we open file at the line number clicked, so use a pointing hand cursor. + if is_singleton { + window.set_cursor_style(CursorStyle::IBeam, hitbox); + } else { + window.set_cursor_style(CursorStyle::PointingHand, hitbox); } } } @@ -9808,17 +9780,11 @@ impl EditorLayout { } } -#[derive(Debug)] -struct LineNumberSegment { +struct LineNumberLayout { shaped_line: ShapedLine, hitbox: Option, } -#[derive(Debug)] -struct LineNumberLayout { - segments: SmallVec<[LineNumberSegment; 1]>, -} - struct ColoredRange { start: T, end: T, @@ -10875,21 +10841,13 @@ mod tests { .unwrap(); assert_eq!(layouts.len(), 6); - let get_row_infos = |snapshot: &EditorSnapshot| { - snapshot - .row_infos(DisplayRow(0)) - .take(6) - .collect::>() - }; - let relative_rows = window .update(cx, |editor, window, cx| { let snapshot = editor.snapshot(window, cx); element.calculate_relative_line_numbers( - &get_row_infos(&snapshot), + &snapshot, &(DisplayRow(0)..DisplayRow(6)), Some(DisplayRow(3)), - false, ) }) .unwrap(); @@ -10905,10 +10863,9 @@ mod tests { .update(cx, |editor, window, cx| { let snapshot = editor.snapshot(window, cx); element.calculate_relative_line_numbers( - &get_row_infos(&snapshot), + &snapshot, &(DisplayRow(3)..DisplayRow(6)), Some(DisplayRow(1)), - false, ) }) .unwrap(); @@ -10922,10 +10879,9 @@ mod tests { .update(cx, |editor, window, cx| { let snapshot = editor.snapshot(window, cx); element.calculate_relative_line_numbers( - &get_row_infos(&snapshot), + &snapshot, &(DisplayRow(0)..DisplayRow(3)), Some(DisplayRow(6)), - false, ) }) .unwrap(); @@ -10935,88 +10891,6 @@ mod tests { assert_eq!(relative_rows[&DisplayRow(2)], 3); } - #[gpui::test] - fn test_shape_line_numbers_wrapping(cx: &mut TestAppContext) { - init_test(cx, |_| {}); - let window = cx.add_window(|window, cx| { - let buffer = MultiBuffer::build_simple(&sample_text(6, 6, 'a'), cx); - Editor::new(EditorMode::full(), buffer, None, window, cx) - }); - - update_test_language_settings(cx, |s| { - s.defaults.preferred_line_length = Some(5_u32); - s.defaults.soft_wrap = Some(language_settings::SoftWrap::PreferredLineLength); - }); - - let editor = window.root(cx).unwrap(); - let style = cx.update(|cx| editor.read(cx).style().unwrap().clone()); - let line_height = window - .update(cx, |_, window, _| { - style.text.line_height_in_pixels(window.rem_size()) - }) - .unwrap(); - let element = EditorElement::new(&editor, style); - let snapshot = window - .update(cx, |editor, window, cx| editor.snapshot(window, cx)) - .unwrap(); - - let layouts = cx - .update_window(*window, |_, window, cx| { - element.layout_line_numbers( - None, - GutterDimensions { - left_padding: Pixels::ZERO, - right_padding: Pixels::ZERO, - width: px(30.0), - margin: Pixels::ZERO, - git_blame_entries_width: None, - }, - line_height, - gpui::Point::default(), - DisplayRow(0)..DisplayRow(6), - &(0..6) - .map(|row| RowInfo { - buffer_row: Some(row), - ..Default::default() - }) - .collect::>(), - &BTreeMap::default(), - Some(DisplayPoint::new(DisplayRow(0), 0)), - &snapshot, - window, - cx, - ) - }) - .unwrap(); - assert_eq!(layouts.len(), 3); - - let relative_rows = window - .update(cx, |editor, window, cx| { - let snapshot = editor.snapshot(window, cx); - let start_row = DisplayRow(0); - let end_row = DisplayRow(6); - let row_infos = snapshot - .row_infos(start_row) - .take((start_row..end_row).len()) - .collect::>(); - - element.calculate_relative_line_numbers( - &row_infos, - &(DisplayRow(0)..DisplayRow(6)), - Some(DisplayRow(3)), - true, - ) - }) - .unwrap(); - - assert_eq!(relative_rows[&DisplayRow(0)], 3); - assert_eq!(relative_rows[&DisplayRow(1)], 2); - assert_eq!(relative_rows[&DisplayRow(2)], 1); - // current line has no relative number - assert_eq!(relative_rows[&DisplayRow(4)], 1); - assert_eq!(relative_rows[&DisplayRow(5)], 2); - } - #[gpui::test] async fn test_vim_visual_selections(cx: &mut TestAppContext) { init_test(cx, |_| {}); @@ -11130,13 +11004,7 @@ mod tests { state .line_numbers .get(&MultiBufferRow(0)) - .map(|line_number| line_number - .segments - .first() - .unwrap() - .shaped_line - .text - .as_ref()), + .map(|line_number| line_number.shaped_line.text.as_ref()), Some("1") ); } diff --git a/crates/migrator/src/migrations.rs b/crates/migrator/src/migrations.rs index e4358b36b9..084a3348b5 100644 --- a/crates/migrator/src/migrations.rs +++ b/crates/migrator/src/migrations.rs @@ -129,9 +129,3 @@ pub(crate) mod m_2025_10_17 { pub(crate) use settings::make_file_finder_include_ignored_an_enum; } - -pub(crate) mod m_2025_10_21 { - mod settings; - - pub(crate) use settings::make_relative_line_numbers_an_enum; -} diff --git a/crates/migrator/src/migrations/m_2025_10_21/settings.rs b/crates/migrator/src/migrations/m_2025_10_21/settings.rs deleted file mode 100644 index 1f78f93327..0000000000 --- a/crates/migrator/src/migrations/m_2025_10_21/settings.rs +++ /dev/null @@ -1,16 +0,0 @@ -use anyhow::Result; -use serde_json::Value; - -pub fn make_relative_line_numbers_an_enum(value: &mut Value) -> Result<()> { - let Some(relative_line_numbers) = value.get_mut("relative_line_numbers") else { - return Ok(()); - }; - - *relative_line_numbers = match relative_line_numbers { - Value::Bool(true) => Value::String("enabled".to_string()), - Value::Bool(false) => Value::String("disabled".to_string()), - Value::String(s) if s == "enabled" || s == "disabled" || s == "wrapped" => return Ok(()), - _ => anyhow::bail!("Expected relative_line_numbers to be a boolean"), - }; - Ok(()) -} diff --git a/crates/migrator/src/migrator.rs b/crates/migrator/src/migrator.rs index 3f5c1edaa7..ff9635dcef 100644 --- a/crates/migrator/src/migrator.rs +++ b/crates/migrator/src/migrator.rs @@ -214,7 +214,6 @@ pub fn migrate_settings(text: &str) -> Result> { ), MigrationType::Json(migrations::m_2025_10_16::restore_code_actions_on_format), MigrationType::Json(migrations::m_2025_10_17::make_file_finder_include_ignored_an_enum), - MigrationType::Json(migrations::m_2025_10_21::make_relative_line_numbers_an_enum), ]; run_migrations(text, migrations) } diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index 90f1bcbe39..bdfc7a7606 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -340,7 +340,6 @@ pub struct RowInfo { pub multibuffer_row: Option, pub diff_status: Option, pub expand_info: Option, - pub wrapped_buffer_row: Option, } /// A slice into a [`Buffer`] that is being edited in a [`MultiBuffer`]. @@ -6651,7 +6650,6 @@ impl Iterator for MultiBufferRows<'_> { multibuffer_row: Some(MultiBufferRow(0)), diff_status: None, expand_info: None, - wrapped_buffer_row: None, }); } @@ -6709,7 +6707,6 @@ impl Iterator for MultiBufferRows<'_> { buffer_row: Some(last_row), multibuffer_row: Some(multibuffer_row), diff_status: None, - wrapped_buffer_row: None, expand_info, }); } else { @@ -6754,7 +6751,6 @@ impl Iterator for MultiBufferRows<'_> { .diff_hunk_status .filter(|_| self.point < region.range.end), expand_info, - wrapped_buffer_row: None, }); self.point += Point::new(1, 0); result diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index 22c041267f..a9121b9104 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -32,7 +32,6 @@ fn test_empty_singleton(cx: &mut App) { multibuffer_row: Some(MultiBufferRow(0)), diff_status: None, expand_info: None, - wrapped_buffer_row: None, }] ); } @@ -2433,8 +2432,6 @@ impl ReferenceMultibuffer { buffer_id: region.buffer_id, diff_status: region.status, buffer_row, - wrapped_buffer_row: None, - multibuffer_row: Some(MultiBufferRow( text[..ix].matches('\n').count() as u32 )), diff --git a/crates/settings/src/settings_content/editor.rs b/crates/settings/src/settings_content/editor.rs index 0c6e478bcf..920f02a0f6 100644 --- a/crates/settings/src/settings_content/editor.rs +++ b/crates/settings/src/settings_content/editor.rs @@ -97,11 +97,9 @@ pub struct EditorSettingsContent { #[serde(serialize_with = "crate::serialize_optional_f32_with_two_decimal_places")] pub fast_scroll_sensitivity: Option, /// Whether the line numbers on editors gutter are relative or not. - /// When "enabled" shows relative number of buffer lines, when "wrapped" shows - /// relative number of display lines. /// - /// Default: "disabled" - pub relative_line_numbers: Option, + /// Default: false + pub relative_line_numbers: Option, /// When to populate a new search's query based on the text under the cursor. /// /// Default: always @@ -201,41 +199,6 @@ pub struct EditorSettingsContent { pub lsp_document_colors: Option, } -#[derive( - Debug, - Clone, - Copy, - Serialize, - Deserialize, - JsonSchema, - MergeFrom, - PartialEq, - Eq, - strum::VariantArray, - strum::VariantNames, -)] -#[serde(rename_all = "snake_case")] -pub enum RelativeLineNumbers { - Disabled, - Enabled, - Wrapped, -} - -impl RelativeLineNumbers { - pub fn enabled(&self) -> bool { - match self { - RelativeLineNumbers::Enabled | RelativeLineNumbers::Wrapped => true, - RelativeLineNumbers::Disabled => false, - } - } - pub fn wrapped(&self) -> bool { - match self { - RelativeLineNumbers::Enabled | RelativeLineNumbers::Disabled => false, - RelativeLineNumbers::Wrapped => true, - } - } -} - // Toolbar related settings #[skip_serializing_none] #[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)] diff --git a/crates/settings/src/vscode_import.rs b/crates/settings/src/vscode_import.rs index 71198883ba..8f9c60960c 100644 --- a/crates/settings/src/vscode_import.rs +++ b/crates/settings/src/vscode_import.rs @@ -275,7 +275,7 @@ impl VsCodeSettings { }), redact_private_values: None, relative_line_numbers: self.read_enum("editor.lineNumbers", |s| match s { - "relative" => Some(RelativeLineNumbers::Enabled), + "relative" => Some(true), _ => None, }), rounded_selection: self.read_bool("editor.roundedSelection"), diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs index ed3650f361..394e6821c8 100644 --- a/crates/settings_ui/src/page_data.rs +++ b/crates/settings_ui/src/page_data.rs @@ -1503,7 +1503,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec { }), SettingsPageItem::SettingItem(SettingItem { title: "Relative Line Numbers", - description: "Controls line number display in the editor's gutter. \"disabled\" shows absolute line numbers, \"enabled\" shows relative line numbers for each absolute line, and \"wrapped\" shows relative line numbers for every line, absolute or wrapped.", + description: "Whether the line numbers in the editor's gutter are relative or not.", field: Box::new(SettingField { json_path: Some("relative_line_numbers"), pick: |settings_content| { diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 71b4d6e0ca..e60304a9f7 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -491,7 +491,6 @@ fn init_renderers(cx: &mut App) { .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) .add_basic_renderer::(render_dropdown) - .add_basic_renderer::(render_dropdown) // please semicolon stay on next line ; } diff --git a/docs/src/configuring-zed.md b/docs/src/configuring-zed.md index 6eacbe1072..054b6b1b5c 100644 --- a/docs/src/configuring-zed.md +++ b/docs/src/configuring-zed.md @@ -2994,33 +2994,11 @@ List of `string` glob patterns - Description: Whether to show relative line numbers in the gutter - Setting: `relative_line_numbers` -- Default: `"disabled"` +- Default: `false` **Options** -1. Show relative line numbers in the gutter whilst counting wrapped lines as one line: - -```json [settings] -{ - "relative_line_numbers": "enabled" -} -``` - -2. Show relative line numbers in the gutter, including wrapped lines in the counting: - -```json [settings] -{ - "relative_line_numbers": "wrapped" -} -``` - -2. Do not use relative line numbers: - -```json [settings] -{ - "relative_line_numbers": "disabled" -} -``` +`boolean` values ## Remove Trailing Whitespace On Save diff --git a/docs/src/vim.md b/docs/src/vim.md index f1296c4575..6af563d355 100644 --- a/docs/src/vim.md +++ b/docs/src/vim.md @@ -606,7 +606,7 @@ Here are a few general Zed settings that can help you fine-tune your Vim experie | Property | Description | Default Value | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | | cursor_blink | If `true`, the cursor blinks. | `true` | -| relative_line_numbers | If `"enabled"`, line numbers in the left gutter are relative to the cursor. If `"wrapped"`, they also display for wrapped lines. | `"disabled"` | +| relative_line_numbers | If `true`, line numbers in the left gutter are relative to the cursor. | `false` | | scrollbar | Object that controls the scrollbar display. Set to `{ "show": "never" }` to hide the scroll bar. | `{ "show": "auto" }` | | scroll_beyond_last_line | If set to `"one_page"`, allows scrolling up to one page beyond the last line. Set to `"off"` to prevent this behavior. | `"one_page"` | | vertical_scroll_margin | The number of lines to keep above or below the cursor when scrolling. Set to `0` to allow the cursor to go up to the edges of the screen vertically. | `3` | @@ -620,7 +620,7 @@ Here's an example of these settings changed: // Disable cursor blink "cursor_blink": false, // Use relative line numbers - "relative_line_numbers": "enabled", + "relative_line_numbers": true, // Hide the scroll bar "scrollbar": { "show": "never" }, // Prevent the buffer from scrolling beyond the last line diff --git a/docs/src/visual-customization.md b/docs/src/visual-customization.md index 8998dc0a89..b353377dd7 100644 --- a/docs/src/visual-customization.md +++ b/docs/src/visual-customization.md @@ -204,7 +204,7 @@ TBD: Centered layout related settings "folds": true, // Show/hide show fold buttons in the gutter. "min_line_number_digits": 4 // Reserve space for N digit line numbers }, - "relative_line_numbers": "enabled", // Show relative line numbers in gutter + "relative_line_numbers": false, // Show relative line numbers in gutter // Indent guides "indent_guides": {