diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 3db112d3..e49c780a 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -262,24 +262,23 @@ pub fn split_selection(cx: &mut Context) {
     //  # update state
     // }
 
-    cx.callback = Some(Box::new(|compositor: &mut Compositor| {
-        let prompt = Prompt::new(
-            "split:".to_string(),
-            |input: &str| Vec::new(), // this is fine because Vec::new() doesn't allocate
-            |editor: &mut Editor, input: &str| {
-                match Regex::new(input) {
-                    Ok(regex) => {
-                        let view = editor.view_mut().unwrap();
-                        let text = &view.doc.text().slice(..);
-                        let selection =
-                            selection::split_on_matches(text, view.doc.selection(), &regex);
-                        view.doc.set_selection(selection);
-                    }
-                    Err(_) => (), // TODO: mark command line as error
+    let prompt = Prompt::new(
+        "split:".to_string(),
+        |input: &str| Vec::new(), // this is fine because Vec::new() doesn't allocate
+        |editor: &mut Editor, input: &str| {
+            match Regex::new(input) {
+                Ok(regex) => {
+                    let view = editor.view_mut().unwrap();
+                    let text = &view.doc.text().slice(..);
+                    let selection = selection::split_on_matches(text, view.doc.selection(), &regex);
+                    view.doc.set_selection(selection);
                 }
-            },
-        );
+                Err(_) => (), // TODO: mark command line as error
+            }
+        },
+    );
 
+    cx.callback = Some(Box::new(move |compositor: &mut Compositor| {
         compositor.push(Box::new(prompt));
     }));
 }
diff --git a/helix-term/src/compositor.rs b/helix-term/src/compositor.rs
index 2e65f02a..f0d94dbc 100644
--- a/helix-term/src/compositor.rs
+++ b/helix-term/src/compositor.rs
@@ -19,7 +19,7 @@ use smol::Executor;
 use tui::buffer::Buffer as Surface;
 use tui::layout::Rect;
 
-pub type Callback = Box<dyn Fn(&mut Compositor)>;
+pub type Callback = Box<dyn FnOnce(&mut Compositor)>;
 
 // --> EventResult should have a callback that takes a context with methods like .popup(),
 // .prompt() etc. That way we can abstract it from the renderer.