diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 754e4473..ad84c85c 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -4455,13 +4455,7 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
         (" ", "... or any character acting as a pair"),
     ];
 
-    cx.editor.autoinfo = Some(Info::new(
-        title,
-        help_text
-            .into_iter()
-            .map(|(col1, col2)| (col1.to_string(), col2.to_string()))
-            .collect(),
-    ));
+    cx.editor.autoinfo = Some(Info::new(title, &help_text));
 }
 
 fn surround_add(cx: &mut Context) {
diff --git a/helix-view/src/info.rs b/helix-view/src/info.rs
index 5ad6a60c..3080cf8e 100644
--- a/helix-view/src/info.rs
+++ b/helix-view/src/info.rs
@@ -16,7 +16,11 @@ pub struct Info {
 }
 
 impl Info {
-    pub fn new(title: &str, body: Vec<(String, String)>) -> Self {
+    pub fn new<T, U>(title: &str, body: &[(T, U)]) -> Self
+    where
+        T: AsRef<str>,
+        U: AsRef<str>,
+    {
         if body.is_empty() {
             return Self {
                 title: title.to_string(),
@@ -26,11 +30,21 @@ impl Info {
             };
         }
 
-        let item_width = body.iter().map(|(item, _)| item.width()).max().unwrap();
+        let item_width = body
+            .iter()
+            .map(|(item, _)| item.as_ref().width())
+            .max()
+            .unwrap();
         let mut text = String::new();
 
-        for (item, desc) in &body {
-            let _ = writeln!(text, "{:width$}  {}", item, desc, width = item_width);
+        for (item, desc) in body {
+            let _ = writeln!(
+                text,
+                "{:width$}  {}",
+                item.as_ref(),
+                desc.as_ref(),
+                width = item_width
+            );
         }
 
         Self {
@@ -42,19 +56,19 @@ impl Info {
     }
 
     pub fn from_keymap(title: &str, body: Vec<(&str, BTreeSet<KeyEvent>)>) -> Self {
-        let body = body
+        let body: Vec<_> = body
             .into_iter()
             .map(|(desc, events)| {
                 let events = events.iter().map(ToString::to_string).collect::<Vec<_>>();
-                (events.join(", "), desc.to_string())
+                (events.join(", "), desc)
             })
             .collect();
 
-        Self::new(title, body)
+        Self::new(title, &body)
     }
 
     pub fn from_registers(registers: &Registers) -> Self {
-        let body = registers
+        let body: Vec<_> = registers
             .inner()
             .iter()
             .map(|(ch, reg)| {
@@ -62,13 +76,12 @@ impl Info {
                     .read()
                     .get(0)
                     .and_then(|s| s.lines().next())
-                    .map(String::from)
                     .unwrap_or_default();
                 (ch.to_string(), content)
             })
             .collect();
 
-        let mut infobox = Self::new("Registers", body);
+        let mut infobox = Self::new("Registers", &body);
         infobox.width = 30; // copied content could be very long
         infobox
     }