Я пытаюсь получить ввод от пользователя в командной строке Bash.Я хочу включить в запрос некоторые экранированные символы ANSI (чтобы подчеркнуть это) и некоторый исходный текст, например:
read -e -i "Lucy and Ricky" -p $'\e[4mWhom do you love?\e[m ' response
Это прекрасно работает.Однако, когда исходный текст превышает определенную длину, редактирование строки запутывается, например:
read -e -i "Lucy and Ricky and Ethel and Fred" -p $'\e[4mWhom do you love?\e[m ' response
Когда пользователь нажимает Ctrl-a, чтобы попытаться переместиться к началу исходного текста, вместо курсоразаканчивается несколькими символами справа от его начала (на «d» в первом «и»).Затем нажатие Ctrl-e перемещает курсор на несколько символов (в частности, в данном случае на семь) вправо от конца исходного текста.
Также, если пользователь пытается отредактировать конец исходного текстапосле перемещения за его конец, например, путем удаления «и Fred», содержимое переменной ответа заканчивается усечением дополнительного количества символов (опять же, семь в этом случае).Это происходит только в том случае, если пользователь переместил курсор в начало строки, нажав сначала Ctrl-a.Кажется, что попытка перейти к началу исходного текста нажатием Ctrl-a - это то, что портит отслеживание позиции курсора в readline.
Вот скрипт, который позволяет вам проверить это поведение:
echo -e "\nCase 1: No ANSI escapes in prompt, short initial text"
read -e -i "Lucy and Ricky" -p 'Whom do you love? ' response
echo $response
echo -e "\nCase 2: With ANSI escapes in prompt, short initial text"
read -e -i "Lucy and Ricky" -p $'\e[4mWhom do you love?\e[m ' response
echo $response
echo -e "\nCase 3: No ANSI escapes in prompt, longer initial text"
read -e -i "Lucy and Ricky and Ethel and Fred" -p 'Whom do you love? ' response
echo $response
echo -e "\nCase 4: With ANSI escapes in prompt, longer initial text"
read -e -i "Lucy and Ricky and Ethel and Fred" -p $'\e[4mWhom do you love?\e[m ' response
echo $response
В каждом случае, при редактировании исходного текста, попробуйте сначала нажать Ctrl-a, а затем сначала Ctrl-e.Вы увидите, что все работает, как ожидалось, до последнего случая.
Вывод:
Case 1: No ANSI escapes in prompt, short initial text
Whom do you love? Lucy and Ricky - Works
Lucy and Ricky - Works
Case 2: With ANSI escapes in prompt, short initial text
Whom do you love? Lucy and Ricky - Works
Lucy and Ricky - Works
Case 3: No ANSI escapes in prompt, longer initial text
Whom do you love? Lucy and Ricardo and Ethel and Fred - Works
Lucy and Ricky and Ethel and Fred - Works
Case 4: With ANSI escapes in prompt, longer initial text
Whom do you love? Lucy and Ricky and Ethel and Fred - No worky
Lucy and Ricky and Ethel and Fred- No worky
Есть идеи, почему это может происходить?Исправления или обходные пути?
Я использую GNU bash, версия 4.4.23 (1) -релиз (x86_64-apple-darwin18.0.0).