@@ -126,8 +126,18 @@ impl Prompt {
126 let selected_color = theme.get("ui.menu.selected");
126 let selected_color = theme.get("ui.menu.selected");
127 // completion
127 // completion
132+ .map(|(_, completion)| completion.len() as u16)
134+ .unwrap_or(BASE_WIDTH)
129− let max_col = std::cmp::max(1, area.width / BASE_WIDTH);
137+ let cols = std::cmp::max(1, area.width / max_len);
138+ let col_width = (area.width - (cols)) / cols;
130− let height = ((self.completion.len() as u16 + max_col - 1) / max_col)
140+ let height = ((self.completion.len() as u16 + cols - 1) / cols)
131 .min(10) // at most 10 rows (or less)
141 .min(10) // at most 10 rows (or less)
132 .min(area.height);
142 .min(area.height);
@@ -147,7 +157,13 @@ impl Prompt {
147 let mut row = 0;
157 let mut row = 0;
148 let mut col = 0;
158 let mut col = 0;
150− for (i, (_range, completion)) in self.completion.iter().enumerate() {
161+ for (i, (_range, completion)) in self
165+ .take(height as usize * cols as usize)
151 let color = if Some(i) == self.selection {
167 let color = if Some(i) == self.selection {
152 // Style::default().bg(Color::Rgb(104, 60, 232))
168 // Style::default().bg(Color::Rgb(104, 60, 232))
153 selected_color // TODO: just invert bg
169 selected_color // TODO: just invert bg
@@ -155,10 +171,10 @@ impl Prompt {
155 text_color
171 text_color
157 surface.set_stringn(
173 surface.set_stringn(
158− area.x + 1 + col * BASE_WIDTH,
174+ area.x + col * (1 + col_width),
159 area.y + row,
175 area.y + row,
160 &completion,
176 &completion,
161− BASE_WIDTH as usize - 1,
177+ col_width.saturating_sub(1) as usize,
164 row += 1;
180 row += 1;
@@ -166,9 +182,6 @@ impl Prompt {
167 col += 1;
183 col += 1;