vim: Add global marks (#25702)
Closes https://github.com/zed-industries/zed/issues/13111 Release Notes: - vim: Added global marks `'[A-Z]` - vim: Added persistence for global (and local) marks. When re-opening the same workspace your previous marks will be available. --------- Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
This commit is contained in:
parent
148131786f
commit
265caed15e
18 changed files with 982 additions and 281 deletions
|
@ -17,7 +17,7 @@ use workspace::searchable::Direction;
|
|||
use crate::{
|
||||
motion::{first_non_whitespace, next_line_end, start_of_line, Motion},
|
||||
object::Object,
|
||||
state::{Mode, Operator},
|
||||
state::{Mark, Mode, Operator},
|
||||
Vim,
|
||||
};
|
||||
|
||||
|
@ -107,14 +107,20 @@ pub fn register(editor: &mut Editor, cx: &mut Context<Vim>) {
|
|||
let Some((stored_mode, reversed)) = vim.stored_visual_mode.take() else {
|
||||
return;
|
||||
};
|
||||
let Some((start, end)) = vim.marks.get("<").zip(vim.marks.get(">")) else {
|
||||
let marks = vim
|
||||
.update_editor(window, cx, |vim, editor, window, cx| {
|
||||
vim.get_mark("<", editor, window, cx)
|
||||
.zip(vim.get_mark(">", editor, window, cx))
|
||||
})
|
||||
.flatten();
|
||||
let Some((Mark::Local(start), Mark::Local(end))) = marks else {
|
||||
return;
|
||||
};
|
||||
let ranges = start
|
||||
.iter()
|
||||
.zip(end)
|
||||
.zip(reversed)
|
||||
.map(|((start, end), reversed)| (*start, *end, reversed))
|
||||
.map(|((start, end), reversed)| (*start, end, reversed))
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
if vim.mode.is_visual() {
|
||||
|
@ -499,7 +505,7 @@ impl Vim {
|
|||
selection.goal = SelectionGoal::None;
|
||||
});
|
||||
});
|
||||
vim.copy_selections_content(editor, line_mode, cx);
|
||||
vim.copy_selections_content(editor, line_mode, window, cx);
|
||||
editor.insert("", window, cx);
|
||||
|
||||
// Fixup cursor position after the deletion
|
||||
|
@ -528,7 +534,7 @@ impl Vim {
|
|||
self.update_editor(window, cx, |vim, editor, window, cx| {
|
||||
let line_mode = line_mode || editor.selections.line_mode;
|
||||
editor.selections.line_mode = line_mode;
|
||||
vim.yank_selections_content(editor, line_mode, cx);
|
||||
vim.yank_selections_content(editor, line_mode, window, cx);
|
||||
editor.change_selections(None, window, cx, |s| {
|
||||
s.move_with(|map, selection| {
|
||||
if line_mode {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue