Предположим, что ширина вашего терминального окна составляет 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
Это то что ты хочешь?