Skip to content

Commit

Permalink
Fix relative indentation when pasting content copied from outside Zed (
Browse files Browse the repository at this point in the history
…#25300)

Closes #24914

Release Notes:

- Fixed incorrect indentation when pasting multi-line content that was
copied from another app.
  • Loading branch information
maxbrunsfeld authored Feb 21, 2025
1 parent ee1a559 commit c31c638
Show file tree
Hide file tree
Showing 8 changed files with 233 additions and 190 deletions.
2 changes: 1 addition & 1 deletion crates/assistant_context_editor/src/patch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ impl ResolvedPatch {
buffer.edit(
edits,
Some(AutoindentMode::Block {
original_indent_columns: Vec::new(),
original_start_columns: Vec::new(),
}),
cx,
);
Expand Down
33 changes: 17 additions & 16 deletions crates/editor/src/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -976,9 +976,12 @@ struct ActiveDiagnosticGroup {

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct ClipboardSelection {
/// The number of bytes in this selection.
pub len: usize,
/// Whether this was a full-line selection.
pub is_entire_line: bool,
pub first_line_indent: u32,
/// The column where this selection originally started.
pub start_column: u32,
}

#[derive(Debug)]
Expand Down Expand Up @@ -2273,7 +2276,7 @@ impl Editor {
pub fn edit_with_block_indent<I, S, T>(
&mut self,
edits: I,
original_indent_columns: Vec<u32>,
original_start_columns: Vec<u32>,
cx: &mut Context<Self>,
) where
I: IntoIterator<Item = (Range<S>, T)>,
Expand All @@ -2288,7 +2291,7 @@ impl Editor {
buffer.edit(
edits,
Some(AutoindentMode::Block {
original_indent_columns,
original_start_columns,
}),
cx,
)
Expand Down Expand Up @@ -3397,7 +3400,7 @@ impl Editor {

pub fn insert(&mut self, text: &str, window: &mut Window, cx: &mut Context<Self>) {
let autoindent = text.is_empty().not().then(|| AutoindentMode::Block {
original_indent_columns: Vec::new(),
original_start_columns: Vec::new(),
});
self.insert_with_autoindent_mode(text, autoindent, window, cx);
}
Expand Down Expand Up @@ -7943,9 +7946,7 @@ impl Editor {
clipboard_selections.push(ClipboardSelection {
len,
is_entire_line,
first_line_indent: buffer
.indent_size_for_line(MultiBufferRow(selection.start.row))
.len,
start_column: selection.start.column,
});
}
}
Expand Down Expand Up @@ -8024,7 +8025,7 @@ impl Editor {
clipboard_selections.push(ClipboardSelection {
len,
is_entire_line,
first_line_indent: buffer.indent_size_for_line(MultiBufferRow(start.row)).len,
start_column: start.column,
});
}
}
Expand Down Expand Up @@ -8054,8 +8055,8 @@ impl Editor {
let old_selections = this.selections.all::<usize>(cx);
let all_selections_were_entire_line =
clipboard_selections.iter().all(|s| s.is_entire_line);
let first_selection_indent_column =
clipboard_selections.first().map(|s| s.first_line_indent);
let first_selection_start_column =
clipboard_selections.first().map(|s| s.start_column);
if clipboard_selections.len() != old_selections.len() {
clipboard_selections.drain(..);
}
Expand All @@ -8069,21 +8070,21 @@ impl Editor {

let mut start_offset = 0;
let mut edits = Vec::new();
let mut original_indent_columns = Vec::new();
let mut original_start_columns = Vec::new();
for (ix, selection) in old_selections.iter().enumerate() {
let to_insert;
let entire_line;
let original_indent_column;
let original_start_column;
if let Some(clipboard_selection) = clipboard_selections.get(ix) {
let end_offset = start_offset + clipboard_selection.len;
to_insert = &clipboard_text[start_offset..end_offset];
entire_line = clipboard_selection.is_entire_line;
start_offset = end_offset + 1;
original_indent_column = Some(clipboard_selection.first_line_indent);
original_start_column = Some(clipboard_selection.start_column);
} else {
to_insert = clipboard_text.as_str();
entire_line = all_selections_were_entire_line;
original_indent_column = first_selection_indent_column
original_start_column = first_selection_start_column
}

// If the corresponding selection was empty when this slice of the
Expand All @@ -8099,15 +8100,15 @@ impl Editor {
};

edits.push((range, to_insert));
original_indent_columns.extend(original_indent_column);
original_start_columns.extend(original_start_column);
}
drop(snapshot);

buffer.edit(
edits,
if auto_indent_on_paste {
Some(AutoindentMode::Block {
original_indent_columns,
original_start_columns,
})
} else {
None
Expand Down
Loading

0 comments on commit c31c638

Please sign in to comment.