Невозможно выполнить возврат на одну позицию между перенесенными строками в терминале

Невозможно выполнить возврат на одну позицию между перенесенными строками в терминале

Предположим, что ширина вашего терминального окна составляет 80 столбцов, и вы запускаете скрипт Python, содержащий только:

print("x" * 81 + "\b\by")

Вы ожидаете, что вывод будет представлять собой строку, полную символов, xза исключением последней, которая должна быть y. Моя проблема в том, что вывод, который я получаю, представляет собой строку, полную символов x, и вторую строку, содержащую одинокий символ y. Дело в том, что всякий раз, когда символ backspace должен быть выведен на stdout, он работает так, как и ожидалось, за исключением случаев, когда есть перенесенные строки, и он должен поместить курсор на одну строку выше: в этом случае он, по-видимому, исключается из буфера stdout.

Я могу воспроизвести это поведение несколькими способами в соответствии с фрагментом выше, например, echo -e "xx...x\b\by"пробовал с bash и sh, printf(...);для C/C++, cout << ...;для C++. Та же проблема, когда catфайл содержит символы backspace, а также при наборе текста для stdin read, который занимает более одной строки терминала-окна-строки. В последнем случае '\b'символы заменяются, когда я нажимаю клавишу backspace несколько раз: когда я превышаю ширину окна и строки переносятся, я не могу достичь предыдущих строк, нажимая backspace несколько раз, но эти нажатия обрабатываются так, как и ожидалось вызывающей программой, например, в вызове scanf("%s", s);, sтогда будет содержаться 79 xи 1 y, следуя примеру выше. Самое забавное здесь, что если я изменяю размер окна таким образом, что новая позиция курсора больше не находится в первом столбце окна, то я могу вернуться назад на новое место первого столбца и продолжать так, пока не останется только одна строка терминала; затем оказывается, что есть позиция, в которой я не могу вернуться дальше, - но я не мог понять, как предсказать эту позицию.

Наконец, еще одна ситуация, когда перенос строк и возврат встречаются, это когда набираешь длинную команду и хочешь вернуться на первую строку. У меня нет проблем с этим.

Я использую Ubuntu 18.04 и пробовал все вышеперечисленное с различными эмуляторами терминала, а именно gnome-terminal, xvt и tilda. Любая подсказка была бы очень признательна. Спасибо!

решение1

tmux, screen, urxvtвести себя так, как вы хотите. xtermможно переключить на это поведение, включиврежим обратного переноса: printf '\e[?45h'.

Это наследие, действительно сломанное по замыслу, и никто не заботился о том, чтобы исправить его. Есть больше проблем, чем та, на которую вы указали. СмотритеВТЭ выпуск 62для получения более подробной информации.

при наборе длинной команды и желании вернуться на первую строку. У меня не возникает никаких проблем с этим.

В этом случае вы используете редактирование строки оболочки (например, библиотеку readline), которая выполняет более сложную обработку экрана, чем просто вызов клавиши Backspace.

решение2

Windows 7 Питон 3.7.4

print("x" * 81 + "y")


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy

Это то что ты хочешь?

Связанный контент