editor: Add actions for inserting UUIDs (#21656)

Marshall Bowers created

This PR adds two new actions for generating and inserting UUIDs into the
buffer:


https://github.com/user-attachments/assets/a3445a98-07e2-40b8-9773-fd750706cbcc

Release Notes:

- Added `editor: insert uuid v4` and `editor: insert uuid v7` actions
for inserting generated UUIDs into the editor.

Change summary

Cargo.lock                   |  1 +
Cargo.toml                   |  2 +-
crates/editor/Cargo.toml     |  1 +
crates/editor/src/actions.rs | 10 ++++++++++
crates/editor/src/editor.rs  | 27 +++++++++++++++++++++++++++
crates/editor/src/element.rs |  2 ++
6 files changed, 42 insertions(+), 1 deletion(-)

Detailed changes

Cargo.lock 🔗

@@ -3957,6 +3957,7 @@ dependencies = [
  "unindent",
  "url",
  "util",
+ "uuid",
  "workspace",
 ]
 

Cargo.toml 🔗

@@ -506,7 +506,7 @@ unindent = "0.1.7"
 unicode-segmentation = "1.10"
 unicode-script = "0.5.7"
 url = "2.2"
-uuid = { version = "1.1.2", features = ["v4", "v5", "serde"] }
+uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] }
 wasmparser = "0.215"
 wasm-encoder = "0.215"
 wasmtime = { version = "24", default-features = false, features = [

crates/editor/Cargo.toml 🔗

@@ -85,6 +85,7 @@ unindent = { workspace = true, optional = true }
 ui.workspace = true
 url.workspace = true
 util.workspace = true
+uuid.workspace = true
 workspace.workspace = true
 
 [dev-dependencies]

crates/editor/src/actions.rs 🔗

@@ -105,6 +105,7 @@ pub struct MoveDownByLines {
     #[serde(default)]
     pub(super) lines: u32,
 }
+
 #[derive(PartialEq, Clone, Deserialize, Default)]
 pub struct SelectUpByLines {
     #[serde(default)]
@@ -166,6 +167,13 @@ pub struct SpawnNearestTask {
     pub reveal: task::RevealStrategy,
 }
 
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, Default)]
+pub enum UuidVersion {
+    #[default]
+    V4,
+    V7,
+}
+
 impl_actions!(
     editor,
     [
@@ -271,6 +279,8 @@ gpui::actions!(
         HalfPageUp,
         Hover,
         Indent,
+        InsertUuidV4,
+        InsertUuidV7,
         JoinLines,
         KillRingCut,
         KillRingYank,

crates/editor/src/editor.rs 🔗

@@ -12004,6 +12004,33 @@ impl Editor {
         .detach();
     }
 
+    pub fn insert_uuid_v4(&mut self, _: &InsertUuidV4, cx: &mut ViewContext<Self>) {
+        self.insert_uuid(UuidVersion::V4, cx);
+    }
+
+    pub fn insert_uuid_v7(&mut self, _: &InsertUuidV7, cx: &mut ViewContext<Self>) {
+        self.insert_uuid(UuidVersion::V7, cx);
+    }
+
+    fn insert_uuid(&mut self, version: UuidVersion, cx: &mut ViewContext<Self>) {
+        self.transact(cx, |this, cx| {
+            let edits = this
+                .selections
+                .all::<Point>(cx)
+                .into_iter()
+                .map(|selection| {
+                    let uuid = match version {
+                        UuidVersion::V4 => uuid::Uuid::new_v4(),
+                        UuidVersion::V7 => uuid::Uuid::now_v7(),
+                    };
+
+                    (selection.range(), uuid.to_string())
+                });
+            this.edit(edits, cx);
+            this.refresh_inline_completion(true, false, cx);
+        });
+    }
+
     /// Adds a row highlight for the given range. If a row has multiple highlights, the
     /// last highlight added will be used.
     ///

crates/editor/src/element.rs 🔗

@@ -456,6 +456,8 @@ impl EditorElement {
         register_action(view, cx, Editor::open_active_item_in_terminal);
         register_action(view, cx, Editor::reload_file);
         register_action(view, cx, Editor::spawn_nearest_task);
+        register_action(view, cx, Editor::insert_uuid_v4);
+        register_action(view, cx, Editor::insert_uuid_v7);
     }
 
     fn register_key_listeners(&self, cx: &mut WindowContext, layout: &EditorLayout) {