diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 2c0b34dc..1e719f5f 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -241,7 +241,12 @@ impl Renderer {
         // completion
         if !prompt.completion.is_empty() {
             // TODO: find out better way of clearing individual lines of the screen
-            for i in (3..7) {
+            let mut row = 0;
+            let mut col = 0;
+            let max_col = self.size.0 / BASE_WIDTH;
+            let col_height = ((prompt.completion.len() as u16 + max_col - 1) / max_col);
+
+            for i in (3..col_height + 3) {
                 self.surface.set_string(
                     0,
                     self.size.1 - i as u16,
@@ -250,14 +255,9 @@ impl Renderer {
                 );
             }
             self.surface.set_style(
-                Rect::new(0, self.size.1 - 6, self.size.0, 4),
+                Rect::new(0, self.size.1 - col_height - 2, self.size.0, col_height),
                 view.theme.get("ui.statusline"),
             );
-            let mut row = 0;
-            let mut col = 0;
-            let max_col: u16 = self.size.0 / BASE_WIDTH;
-            // TODO: this will crash if there are too many cols added
-            // TODO: set char limit
             for (i, command) in prompt.completion.iter().enumerate() {
                 let color = if prompt.completion_selection_index.is_some()
                     && i == prompt.completion_selection_index.unwrap()
@@ -268,13 +268,13 @@ impl Renderer {
                 };
                 self.surface.set_stringn(
                     1 + col * BASE_WIDTH,
-                    self.size.1 - 6 + row as u16,
+                    self.size.1 - col_height - 2 + row,
                     &command,
                     BASE_WIDTH as usize - 1,
                     color,
                 );
                 row += 1;
-                if row > 3 {
+                if row > col_height - 1 {
                     row = 0;
                     col += 1;
                 }
diff --git a/helix-view/src/prompt.rs b/helix-view/src/prompt.rs
index 8186b476..e2a9c80d 100644
--- a/helix-view/src/prompt.rs
+++ b/helix-view/src/prompt.rs
@@ -68,25 +68,14 @@ impl Prompt {
     }
 
     pub fn change_completion_selection(&mut self) {
-        if !self.completion.is_empty() {
-            self.completion_selection_index = self
-                .completion_selection_index
-                .map(|i| {
-                    if i == self.completion.len() - 1 {
-                        0
-                    } else {
-                        i + 1
-                    }
-                })
-                .or(Some(0));
-            self.line = String::from(
-                self.completion
-                    .get(self.completion_selection_index.unwrap())
-                    .unwrap(),
-            );
+        if self.completion.is_empty() {
+            return;
         }
+        let index =
+            self.completion_selection_index.map(|i| i + 1).unwrap_or(0) % self.completion.len();
+        self.completion_selection_index = Some(index);
+        self.line = self.completion[index].clone();
     }
-
     pub fn exit_selection(&mut self) {
         self.completion_selection_index = None;
     }