Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix relative indentation when pasting content copied from outside Zed #25300

Merged
merged 1 commit into from
Feb 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading