mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-11 05:00:16 +00:00
Implemente delete
for buffer
This commit is contained in:
parent
324a6ff7ae
commit
b7c30eba30
1 changed files with 69 additions and 0 deletions
|
@ -30,6 +30,7 @@ const CURSOR_BLINK_INTERVAL: Duration = Duration::from_millis(500);
|
|||
pub fn init(app: &mut MutableAppContext) {
|
||||
app.add_bindings(vec![
|
||||
Binding::new("backspace", "buffer:backspace", Some("BufferView")),
|
||||
Binding::new("delete", "buffer:delete", Some("BufferView")),
|
||||
Binding::new("enter", "buffer:newline", Some("BufferView")),
|
||||
Binding::new("cmd-x", "buffer:cut", Some("BufferView")),
|
||||
Binding::new("cmd-c", "buffer:copy", Some("BufferView")),
|
||||
|
@ -61,6 +62,7 @@ pub fn init(app: &mut MutableAppContext) {
|
|||
app.add_action("buffer:insert", BufferView::insert);
|
||||
app.add_action("buffer:newline", BufferView::newline);
|
||||
app.add_action("buffer:backspace", BufferView::backspace);
|
||||
app.add_action("buffer:delete", BufferView::delete);
|
||||
app.add_action("buffer:cut", BufferView::cut);
|
||||
app.add_action("buffer:copy", BufferView::copy);
|
||||
app.add_action("buffer:paste", BufferView::paste);
|
||||
|
@ -489,6 +491,36 @@ impl BufferView {
|
|||
self.end_transaction(ctx);
|
||||
}
|
||||
|
||||
pub fn delete(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
||||
self.start_transaction(ctx);
|
||||
let mut selections = self.selections(ctx.as_ref()).to_vec();
|
||||
{
|
||||
let buffer = self.buffer.read(ctx);
|
||||
let map = self.display_map.read(ctx);
|
||||
for selection in &mut selections {
|
||||
if selection.range(buffer).is_empty() {
|
||||
let head = selection
|
||||
.head()
|
||||
.to_display_point(map, ctx.as_ref())
|
||||
.unwrap();
|
||||
let cursor = map
|
||||
.anchor_before(
|
||||
movement::right(map, head, ctx.as_ref()).unwrap(),
|
||||
Bias::Right,
|
||||
ctx.as_ref(),
|
||||
)
|
||||
.unwrap();
|
||||
selection.set_head(&buffer, cursor);
|
||||
selection.goal_column = None;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.update_selections(selections, true, ctx);
|
||||
self.insert(&String::new(), ctx);
|
||||
self.end_transaction(ctx);
|
||||
}
|
||||
|
||||
pub fn cut(&mut self, _: &(), ctx: &mut ViewContext<Self>) {
|
||||
self.start_transaction(ctx);
|
||||
let mut text = String::new();
|
||||
|
@ -1715,6 +1747,43 @@ mod tests {
|
|||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_delete() {
|
||||
App::test((), |app| {
|
||||
let buffer = app.add_model(|ctx| {
|
||||
Buffer::new(
|
||||
0,
|
||||
"one two three\nfour five six\nseven eight nine\nten\n",
|
||||
ctx,
|
||||
)
|
||||
});
|
||||
let settings = settings::channel(&app.font_cache()).unwrap().1;
|
||||
let (_, view) =
|
||||
app.add_window(|ctx| BufferView::for_buffer(buffer.clone(), settings, ctx));
|
||||
|
||||
view.update(app, |view, ctx| {
|
||||
view.select_display_ranges(
|
||||
&[
|
||||
// an empty selection - the following character is deleted
|
||||
DisplayPoint::new(0, 2)..DisplayPoint::new(0, 2),
|
||||
// one character selected - it is deleted
|
||||
DisplayPoint::new(1, 3)..DisplayPoint::new(1, 4),
|
||||
// a line suffix selected - it is deleted
|
||||
DisplayPoint::new(2, 6)..DisplayPoint::new(3, 0),
|
||||
],
|
||||
ctx,
|
||||
)
|
||||
.unwrap();
|
||||
view.delete(&(), ctx);
|
||||
});
|
||||
|
||||
assert_eq!(
|
||||
buffer.read(app).text(),
|
||||
"on two three\nfou five six\nseven ten\n"
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_clipboard() {
|
||||
App::test((), |app| {
|
||||
|
|
Loading…
Reference in a new issue