mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-30 14:53:11 +00:00
Revert "src/screen: Stop falling back to wchar_t"
This was, under some circumstances, apparently off by one.
If a suggestion was really long, like
```fish
infocmp | string split , | string trim | string match -re . | while read -d = -l key val; test -z "$val"; and continue; string match -q '*%*' -- $val; and continue; test (string replace -ra '\e([\[\]]|\(B).*[\comJKsu]' '' -- a(tput $key)b) = ab; or echo $key $val; end > xterm
```
(I'm assuming longer than $COLUMNS), it would staircase like with a wrong wcwidth.
This reverts commit 15a5c0ed5f
.
This commit is contained in:
parent
11209b7553
commit
6d20b3984a
1 changed files with 17 additions and 13 deletions
|
@ -823,15 +823,19 @@ static size_t truncation_offset_for_width(const std::vector<size_t> &width_by_of
|
||||||
}
|
}
|
||||||
|
|
||||||
static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
||||||
wcstring left_prompt,
|
const wcstring &left_prompt_str,
|
||||||
wcstring right_prompt, const wcstring &commandline,
|
const wcstring &right_prompt_str, const wcstring &commandline,
|
||||||
wcstring autosuggestion) {
|
const wcstring &autosuggestion_str) {
|
||||||
UNUSED(s);
|
UNUSED(s);
|
||||||
screen_layout_t result = {};
|
screen_layout_t result = {};
|
||||||
|
|
||||||
// Start by ensuring that the prompts themselves can fit.
|
// Start by ensuring that the prompts themselves can fit.
|
||||||
prompt_layout_t left_prompt_layout = calc_prompt_layout(left_prompt, cached_layouts);
|
const wchar_t *left_prompt = left_prompt_str.c_str();
|
||||||
prompt_layout_t right_prompt_layout = calc_prompt_layout(right_prompt, cached_layouts);
|
const wchar_t *right_prompt = right_prompt_str.c_str();
|
||||||
|
const wchar_t *autosuggestion = autosuggestion_str.c_str();
|
||||||
|
|
||||||
|
prompt_layout_t left_prompt_layout = calc_prompt_layout(left_prompt_str, cached_layouts);
|
||||||
|
prompt_layout_t right_prompt_layout = calc_prompt_layout(right_prompt_str, cached_layouts);
|
||||||
|
|
||||||
size_t left_prompt_width = left_prompt_layout.last_line_width;
|
size_t left_prompt_width = left_prompt_layout.last_line_width;
|
||||||
size_t right_prompt_width = right_prompt_layout.last_line_width;
|
size_t right_prompt_width = right_prompt_layout.last_line_width;
|
||||||
|
@ -878,7 +882,7 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
||||||
if (multiline) {
|
if (multiline) {
|
||||||
autosuggestion = L"";
|
autosuggestion = L"";
|
||||||
} else {
|
} else {
|
||||||
autosuggest_truncated_widths.reserve(1 + autosuggestion.size());
|
autosuggest_truncated_widths.reserve(1 + autosuggestion_str.size());
|
||||||
for (size_t i = 0; autosuggestion[i] != L'\0'; i++) {
|
for (size_t i = 0; autosuggestion[i] != L'\0'; i++) {
|
||||||
autosuggest_truncated_widths.push_back(autosuggest_total_width);
|
autosuggest_truncated_widths.push_back(autosuggest_total_width);
|
||||||
autosuggest_total_width += fish_wcwidth_min_0(autosuggestion[i]);
|
autosuggest_total_width += fish_wcwidth_min_0(autosuggestion[i]);
|
||||||
|
@ -909,10 +913,10 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
||||||
calculated_width = left_prompt_width + right_prompt_width + first_command_line_width +
|
calculated_width = left_prompt_width + right_prompt_width + first_command_line_width +
|
||||||
autosuggest_total_width;
|
autosuggest_total_width;
|
||||||
if (calculated_width < screen_width) {
|
if (calculated_width < screen_width) {
|
||||||
result.left_prompt = std::move(left_prompt);
|
result.left_prompt = left_prompt;
|
||||||
result.left_prompt_space = left_prompt_width;
|
result.left_prompt_space = left_prompt_width;
|
||||||
result.right_prompt = std::move(right_prompt);
|
result.right_prompt = right_prompt;
|
||||||
result.autosuggestion = std::move(autosuggestion);
|
result.autosuggestion = autosuggestion;
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -922,9 +926,9 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
||||||
if (!done) {
|
if (!done) {
|
||||||
calculated_width = left_prompt_width + right_prompt_width + first_command_line_width;
|
calculated_width = left_prompt_width + right_prompt_width + first_command_line_width;
|
||||||
if (calculated_width < screen_width) {
|
if (calculated_width < screen_width) {
|
||||||
result.left_prompt = std::move(left_prompt);
|
result.left_prompt = left_prompt;
|
||||||
result.left_prompt_space = left_prompt_width;
|
result.left_prompt_space = left_prompt_width;
|
||||||
result.right_prompt = std::move(right_prompt);
|
result.right_prompt = right_prompt;
|
||||||
|
|
||||||
// Need at least two characters to show an autosuggestion.
|
// Need at least two characters to show an autosuggestion.
|
||||||
size_t available_autosuggest_space =
|
size_t available_autosuggest_space =
|
||||||
|
@ -943,7 +947,7 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
||||||
if (!done) {
|
if (!done) {
|
||||||
calculated_width = left_prompt_width + first_command_line_width;
|
calculated_width = left_prompt_width + first_command_line_width;
|
||||||
if (calculated_width < screen_width) {
|
if (calculated_width < screen_width) {
|
||||||
result.left_prompt = std::move(left_prompt);
|
result.left_prompt = left_prompt;
|
||||||
result.left_prompt_space = left_prompt_width;
|
result.left_prompt_space = left_prompt_width;
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
@ -951,7 +955,7 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
|
||||||
|
|
||||||
// Case 4
|
// Case 4
|
||||||
if (!done) {
|
if (!done) {
|
||||||
result.left_prompt = std::move(left_prompt);
|
result.left_prompt = left_prompt;
|
||||||
result.left_prompt_space = left_prompt_width;
|
result.left_prompt_space = left_prompt_width;
|
||||||
// See remark about for why we can't use the right prompt here result.right_prompt =
|
// See remark about for why we can't use the right prompt here result.right_prompt =
|
||||||
// right_prompt. If the command wraps, and the prompt is not short, place the command on its
|
// right_prompt. If the command wraps, and the prompt is not short, place the command on its
|
||||||
|
|
Loading…
Reference in a new issue