@@ -372,9 +372,12 @@ pub fn jump_motion(
#[cfg(test)]
mod test {
+ use crate::test::{NeovimBackedTestContext, VimTestContext};
+ use editor::Editor;
use gpui::TestAppContext;
-
- use crate::test::NeovimBackedTestContext;
+ use std::path::Path;
+ use util::path;
+ use workspace::{CloseActiveItem, OpenOptions};
#[gpui::test]
async fn test_quote_mark(cx: &mut TestAppContext) {
@@ -394,4 +397,69 @@ mod test {
cx.simulate_shared_keystrokes("^ ` `").await;
cx.shared_state().await.assert_eq("Hello, worldΛ!");
}
+
+ #[gpui::test]
+ async fn test_global_mark_overwrite(cx: &mut TestAppContext) {
+ let mut cx = VimTestContext::new(cx, true).await;
+
+ let path = Path::new(path!("/first.rs"));
+ let fs = cx.workspace(|workspace, _, cx| workspace.project().read(cx).fs().clone());
+ fs.as_fake().insert_file(path, "one".into()).await;
+ let path = Path::new(path!("/second.rs"));
+ fs.as_fake().insert_file(path, "two".into()).await;
+
+ let _ = cx
+ .workspace(|workspace, window, cx| {
+ workspace.open_abs_path(
+ path!("/first.rs").into(),
+ OpenOptions::default(),
+ window,
+ cx,
+ )
+ })
+ .await;
+
+ cx.simulate_keystrokes("m A");
+
+ let _ = cx
+ .workspace(|workspace, window, cx| {
+ workspace.open_abs_path(
+ path!("/second.rs").into(),
+ OpenOptions::default(),
+ window,
+ cx,
+ )
+ })
+ .await;
+
+ cx.simulate_keystrokes("m A");
+
+ let _ = cx
+ .workspace(|workspace, window, cx| {
+ workspace.active_pane().update(cx, |pane, cx| {
+ pane.close_active_item(&CloseActiveItem::default(), window, cx)
+ })
+ })
+ .await;
+
+ cx.simulate_keystrokes("m B");
+
+ cx.simulate_keystrokes("' A");
+
+ cx.workspace(|workspace, _, cx| {
+ let active_editor = workspace.active_item_as::<Editor>(cx).unwrap();
+
+ let buffer = active_editor
+ .read(cx)
+ .buffer()
+ .read(cx)
+ .as_singleton()
+ .unwrap();
+
+ let file = buffer.read(cx).file().unwrap();
+ let file_path = file.as_local().unwrap().abs_path(cx);
+
+ assert_eq!(file_path.to_str().unwrap(), path!("/second.rs"));
+ })
+ }
}
@@ -550,6 +550,10 @@ impl MarksState {
let buffer = multibuffer.read(cx).as_singleton();
let abs_path = buffer.as_ref().and_then(|b| self.path_for_buffer(b, cx));
+ if self.is_global_mark(&name) && self.global_marks.contains_key(&name) {
+ self.delete_mark(name.clone(), multibuffer, cx);
+ }
+
let Some(abs_path) = abs_path else {
self.multibuffer_marks
.entry(multibuffer.entity_id())
@@ -573,7 +577,7 @@ impl MarksState {
let buffer_id = buffer.read(cx).remote_id();
self.buffer_marks.entry(buffer_id).or_default().insert(
- name,
+ name.clone(),
anchors
.into_iter()
.map(|anchor| anchor.text_anchor)
@@ -582,6 +586,10 @@ impl MarksState {
if !self.watched_buffers.contains_key(&buffer_id) {
self.watch_buffer(MarkLocation::Path(abs_path.clone()), &buffer, cx)
}
+ if self.is_global_mark(&name) {
+ self.global_marks
+ .insert(name, MarkLocation::Path(abs_path.clone()));
+ }
self.serialize_buffer_marks(abs_path, &buffer, cx)
}