Fix vim code working on display map chars (#10103)
Release Notes: - vim: Fixed motion bugs when softwrap, folds or inlay hints were used.
This commit is contained in:
parent
754547f349
commit
5a2a85a7db
9 changed files with 95 additions and 140 deletions
|
@ -19,9 +19,9 @@ use crate::{
|
|||
};
|
||||
use collections::BTreeSet;
|
||||
use editor::scroll::Autoscroll;
|
||||
use editor::{Bias, DisplayPoint};
|
||||
use editor::Bias;
|
||||
use gpui::{actions, ViewContext, WindowContext};
|
||||
use language::SelectionGoal;
|
||||
use language::{Point, SelectionGoal};
|
||||
use log::error;
|
||||
use workspace::Workspace;
|
||||
|
||||
|
@ -283,19 +283,20 @@ fn insert_line_above(_: &mut Workspace, _: &InsertLineAbove, cx: &mut ViewContex
|
|||
vim.switch_mode(Mode::Insert, false, cx);
|
||||
vim.update_active_editor(cx, |_, editor, cx| {
|
||||
editor.transact(cx, |editor, cx| {
|
||||
let (map, old_selections) = editor.selections.all_display(cx);
|
||||
let selection_start_rows: BTreeSet<u32> = old_selections
|
||||
let selections = editor.selections.all::<Point>(cx);
|
||||
let snapshot = editor.buffer().read(cx).snapshot(cx);
|
||||
|
||||
let selection_start_rows: BTreeSet<u32> = selections
|
||||
.into_iter()
|
||||
.map(|selection| selection.start.row())
|
||||
.map(|selection| selection.start.row)
|
||||
.collect();
|
||||
let edits = selection_start_rows.into_iter().map(|row| {
|
||||
let (indent, _) = map.line_indent(row);
|
||||
let start_of_line =
|
||||
motion::start_of_line(&map, false, DisplayPoint::new(row, 0))
|
||||
.to_point(&map);
|
||||
let mut new_text = " ".repeat(indent as usize);
|
||||
new_text.push('\n');
|
||||
(start_of_line..start_of_line, new_text)
|
||||
let indent = snapshot
|
||||
.indent_size_for_line(row)
|
||||
.chars()
|
||||
.collect::<String>();
|
||||
let start_of_line = Point::new(row, 0);
|
||||
(start_of_line..start_of_line, indent + "\n")
|
||||
});
|
||||
editor.edit_with_autoindent(edits, cx);
|
||||
editor.change_selections(Some(Autoscroll::fit()), cx, |s| {
|
||||
|
@ -317,20 +318,20 @@ fn insert_line_below(_: &mut Workspace, _: &InsertLineBelow, cx: &mut ViewContex
|
|||
vim.update_active_editor(cx, |_, editor, cx| {
|
||||
let text_layout_details = editor.text_layout_details(cx);
|
||||
editor.transact(cx, |editor, cx| {
|
||||
let (map, old_selections) = editor.selections.all_display(cx);
|
||||
let selection_end_rows: BTreeSet<u32> = old_selections
|
||||
let selections = editor.selections.all::<Point>(cx);
|
||||
let snapshot = editor.buffer().read(cx).snapshot(cx);
|
||||
|
||||
let selection_end_rows: BTreeSet<u32> = selections
|
||||
.into_iter()
|
||||
.map(|selection| selection.end.row())
|
||||
.map(|selection| selection.end.row)
|
||||
.collect();
|
||||
let edits = selection_end_rows.into_iter().map(|row| {
|
||||
let (indent, _) = map.line_indent(row);
|
||||
let end_of_line =
|
||||
motion::end_of_line(&map, false, DisplayPoint::new(row, 0), 1)
|
||||
.to_point(&map);
|
||||
|
||||
let mut new_text = "\n".to_string();
|
||||
new_text.push_str(&" ".repeat(indent as usize));
|
||||
(end_of_line..end_of_line, new_text)
|
||||
let indent = snapshot
|
||||
.indent_size_for_line(row)
|
||||
.chars()
|
||||
.collect::<String>();
|
||||
let end_of_line = Point::new(row, snapshot.line_len(row));
|
||||
(end_of_line..end_of_line, "\n".to_string() + &indent)
|
||||
});
|
||||
editor.change_selections(Some(Autoscroll::fit()), cx, |s| {
|
||||
s.maybe_move_cursors_with(|map, cursor, goal| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue