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:
AidanV 2025-03-14 22:58:34 -07:00 committed by GitHub
parent 148131786f
commit 265caed15e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 982 additions and 281 deletions

View file

@ -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 {