mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-30 22:34:29 +08:00
src/screen: Skip a wcswidth
This stops trying to see if the previous line is wider if it is a prefix of the current one. Which turns out to be true often enough that it's a net benefit.
This commit is contained in:
parent
ac983f6c4b
commit
4462f6d600
|
@ -654,11 +654,11 @@ static void s_update(screen_t *scr, const wcstring &left_prompt, const wcstring
|
||||||
// Note that skip_remaining is a width, not a character count.
|
// Note that skip_remaining is a width, not a character count.
|
||||||
size_t skip_remaining = start_pos;
|
size_t skip_remaining = start_pos;
|
||||||
|
|
||||||
|
const size_t shared_prefix = line_shared_prefix(o_line, s_line);
|
||||||
if (!should_clear_screen_this_line) {
|
if (!should_clear_screen_this_line) {
|
||||||
// Compute how much we should skip. At a minimum we skip over the prompt. But also skip
|
// Compute how much we should skip. At a minimum we skip over the prompt. But also skip
|
||||||
// over the shared prefix of what we want to output now, and what we output before, to
|
// over the shared prefix of what we want to output now, and what we output before, to
|
||||||
// avoid repeatedly outputting it.
|
// avoid repeatedly outputting it.
|
||||||
const size_t shared_prefix = line_shared_prefix(o_line, s_line);
|
|
||||||
if (shared_prefix > 0) {
|
if (shared_prefix > 0) {
|
||||||
size_t prefix_width = fish_wcswidth(&o_line.text.at(0), shared_prefix);
|
size_t prefix_width = fish_wcswidth(&o_line.text.at(0), shared_prefix);
|
||||||
if (prefix_width > skip_remaining) skip_remaining = prefix_width;
|
if (prefix_width > skip_remaining) skip_remaining = prefix_width;
|
||||||
|
@ -734,10 +734,14 @@ static void s_update(screen_t *scr, const wcstring &left_prompt, const wcstring
|
||||||
} else if (right_prompt_width < scr->last_right_prompt_width) {
|
} else if (right_prompt_width < scr->last_right_prompt_width) {
|
||||||
clear_remainder = true;
|
clear_remainder = true;
|
||||||
} else {
|
} else {
|
||||||
int prev_width =
|
// This wcswidth shows up strong in the profile.
|
||||||
s_line.text.empty() ? 0 : fish_wcswidth(&s_line.text.at(0), s_line.text.size());
|
// Only do it if the previous line could conceivably be wider.
|
||||||
|
// That means if it is a prefix of the current one we can skip it.
|
||||||
|
if (s_line.text.size() != shared_prefix) {
|
||||||
|
int prev_width = fish_wcswidth(&s_line.text.at(0), s_line.text.size());
|
||||||
clear_remainder = prev_width > current_width;
|
clear_remainder = prev_width > current_width;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (clear_remainder && clr_eol) {
|
if (clear_remainder && clr_eol) {
|
||||||
s_set_color(scr, vars, highlight_spec_t{});
|
s_set_color(scr, vars, highlight_spec_t{});
|
||||||
s_move(scr, current_width, (int)i);
|
s_move(scr, current_width, (int)i);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user