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:
parent
f373383fc1
commit
be75f17429
8 changed files with 93 additions and 59 deletions
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue