Fix auto-indent when pasting multi-line content that was copied start… (#26246)

Closes https://github.com/zed-industries/zed/issues/24914 (again)

Release Notes:

- Fixed an issue where multi-line pasted content was auto-indented
incorrectly if copied from the middle of an existing line.
This commit is contained in:
Max Brunsfeld 2025-03-06 14:13:34 -08:00 committed by GitHub
parent f373383fc1
commit be75f17429
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 93 additions and 59 deletions

View file

@ -495,7 +495,7 @@ struct BufferEdit {
range: Range<usize>,
new_text: Arc<str>,
is_insertion: bool,
original_start_column: u32,
original_indent_column: Option<u32>,
excerpt_id: ExcerptId,
}
@ -751,15 +751,15 @@ impl MultiBuffer {
return;
}
let original_start_columns = match &mut autoindent_mode {
let original_indent_columns = match &mut autoindent_mode {
Some(AutoindentMode::Block {
original_start_columns,
}) => mem::take(original_start_columns),
original_indent_columns,
}) => mem::take(original_indent_columns),
_ => Default::default(),
};
let (buffer_edits, edited_excerpt_ids) =
this.convert_edits_to_buffer_edits(edits, &snapshot, &original_start_columns);
this.convert_edits_to_buffer_edits(edits, &snapshot, &original_indent_columns);
drop(snapshot);
let mut buffer_ids = Vec::new();
@ -778,7 +778,7 @@ impl MultiBuffer {
mut range,
mut new_text,
mut is_insertion,
original_start_column: original_indent_column,
original_indent_column,
excerpt_id,
}) = edits.next()
{
@ -821,7 +821,7 @@ impl MultiBuffer {
let deletion_autoindent_mode =
if let Some(AutoindentMode::Block { .. }) = autoindent_mode {
Some(AutoindentMode::Block {
original_start_columns: Default::default(),
original_indent_columns: Default::default(),
})
} else {
autoindent_mode.clone()
@ -829,7 +829,7 @@ impl MultiBuffer {
let insertion_autoindent_mode =
if let Some(AutoindentMode::Block { .. }) = autoindent_mode {
Some(AutoindentMode::Block {
original_start_columns: original_indent_columns,
original_indent_columns,
})
} else {
autoindent_mode.clone()
@ -851,13 +851,13 @@ impl MultiBuffer {
&self,
edits: Vec<(Range<usize>, Arc<str>)>,
snapshot: &MultiBufferSnapshot,
original_start_columns: &[u32],
original_indent_columns: &[Option<u32>],
) -> (HashMap<BufferId, Vec<BufferEdit>>, Vec<ExcerptId>) {
let mut buffer_edits: HashMap<BufferId, Vec<BufferEdit>> = Default::default();
let mut edited_excerpt_ids = Vec::new();
let mut cursor = snapshot.cursor::<usize>();
for (ix, (range, new_text)) in edits.into_iter().enumerate() {
let original_start_column = original_start_columns.get(ix).copied().unwrap_or(0);
let original_indent_column = original_indent_columns.get(ix).copied().flatten();
cursor.seek(&range.start);
let mut start_region = cursor.region().expect("start offset out of bounds");
@ -908,7 +908,7 @@ impl MultiBuffer {
range: buffer_start..buffer_end,
new_text,
is_insertion: true,
original_start_column,
original_indent_column,
excerpt_id: start_region.excerpt.id,
});
}
@ -924,7 +924,7 @@ impl MultiBuffer {
range: start_excerpt_range,
new_text: new_text.clone(),
is_insertion: true,
original_start_column,
original_indent_column,
excerpt_id: start_region.excerpt.id,
});
}
@ -937,7 +937,7 @@ impl MultiBuffer {
range: end_excerpt_range,
new_text: new_text.clone(),
is_insertion: false,
original_start_column,
original_indent_column,
excerpt_id: end_region.excerpt.id,
});
}
@ -957,7 +957,7 @@ impl MultiBuffer {
range: region.buffer_range,
new_text: new_text.clone(),
is_insertion: false,
original_start_column,
original_indent_column,
excerpt_id: region.excerpt.id,
});
}