Have the pager use a simple newline count to determine reserved lines

When the pager wants to use the full screen to show many options, it reserves
space at the top to see the command. Previously it pretended the command was a
prompt and engaged the prompt layout mechanism to compute these lines. Instead
let's juts count newlines since escape sequences within commands are very rare.
This commit is contained in:
ridiculousfish 2018-02-04 14:14:37 -08:00
parent 27c1c06ed4
commit a87970fbb5
3 changed files with 6 additions and 8 deletions

View file

@ -434,11 +434,12 @@ static void reader_repaint() {
std::vector<int> indents = data->indents;
indents.resize(len);
// Re-render our completions page if necessary. We set the term size to less than the true
// term height by the number of prompt lines. This means we will always show the entire line of
// the prompt.
// Re-render our completions page if necessary. Limit the term size of the pager to the true
// term size, minus the number of lines consumed by our string. (Note this doesn't yet consider
// wrapping).
int full_line_count = 1 + std::count(full_line.begin(), full_line.end(), '\n');
data->pager.set_term_size(maxi(1, common_get_width()),
maxi(1, common_get_height() - (int)calc_prompt_lines(full_line)));
maxi(1, common_get_height() - full_line_count));
data->pager.update_rendering(&data->current_page_rendering);
bool focused_on_pager = data->active_edit_line() == &data->pager.search_field_line;

View file

@ -346,7 +346,7 @@ static prompt_layout_t calc_prompt_layout(const wchar_t *prompt, prompt_type_t w
return prompt_layout;
}
size_t calc_prompt_lines(const wcstring &prompt) {
static size_t calc_prompt_lines(const wcstring &prompt) {
// Hack for the common case where there's no newline at all. I don't know if a newline can
// appear in an escape sequence, so if we detect a newline we have to defer to
// calc_prompt_width_and_lines.

View file

@ -240,7 +240,4 @@ class cached_esc_sequences_t {
// change by calling `cached_esc_sequences.clear()`.
extern cached_esc_sequences_t cached_esc_sequences;
// Calculates the number of prompt lines.
size_t calc_prompt_lines(const wcstring &prompt);
#endif