Как долгие командные строки (> $COLUMNS) автоматически перенесены к новой строке?

Все, что нужно для создания пустого файла:

> my.txt
0
14.04.2015, 01:34
2 ответа

В большинстве эмуляторов терминала длинные командные строки […] переносятся в новую строку до того, как пользователь отправит команду, нажав Enter.

Это не функция эмулятора терминала.

Это функция вашей оболочки. Ваша оболочка не является полноэкранным приложением, но она выполняет адресацию курсора .

Когда вы редактируете командную строку в оболочке, библиотека редактирования строк в оболочке полностью отвечает за отображение редактируемой строки. В оболочке Bourne Again это библиотека чтения GNU. Оболочка Almquist использует libedit. Другие оболочки, такие как Z Shell, имеют свои собственные библиотеки.

Эти библиотеки расположены поверх библиотек termcap / terminfo, которые записывают возможности терминала вашего эмулятора терминала. Эти возможности включают, помимо прочего, управляющие последовательности для позиционирования курсора в относительном или абсолютном выражении, последовательности для очистки до конца строки и конца экрана, а также наличие у вашего терминала автоматических полей ].

С помощью этого и информации о ширине терминала, определенной из TIOCGWINSZ ioctl (возвращаясь к переменной COLUMNS для некоторых библиотек или базе данных termcap / terminfo для других), библиотека редактирования строк в оболочке отслеживает длину командной строки и количество терминальных строк, на которых она отображается. Он разумно перемещает курсор, чтобы перекрашивать строку ввода по мере ее редактирования. Иногда он может полагаться на автоматические поля, если они есть в вашем терминале.Иногда он может явно изменить положение курсора с помощью управляющих последовательностей.

Именно то, что он делает, вызывает эффекты, подобные тем, которые обсуждаются на https://superuser.com/questions/695338/ . Можно испортить его представление о том, где находится курсор, и какие движения курсора он должен испускать, чтобы писать в определенное место на экране, с неверно разделенными управляющими последовательностями в строке подсказки.

Ваш эмулятор терминала не поддерживает командные строки или редактирование строк. Это не часть этих слоев. Он видит простой поток символов и управляющих последовательностей, которые он должен отобразить. Эмулятор терминала отвечает за реализацию управляющих последовательностей, которые объявлены для него в записи termcap / terminfo. GNU readline, libedit, ZLE, vim , screen и другие будут использовать то, что они найдут рекламируемым. Если вы указываете в termcap / terminfo, например, что ваш терминал имеет автоматические поля, то эмулятор должен выполнять перенос строки, когда символ печатается с правого поля. Если вы заявляете, что ваш терминал может перемещать курсор вверх и вниз, то он действительно должен это делать, когда получает соответствующие управляющие последовательности.

Между прочим: если GNU readline обнаруживает, что не может переместить курсор вверх, потому что запись termcap / terminfo не указывает способ сделать это, на самом деле перенос строки вообще не виден. readline возвращается в режим, в котором строка ввода прокручивается вбок, все на одной строке.

5
28.01.2020, 02:14

Ответственность за это несет терминал [эмулятор]. Перемещение в первый столбец следующей строки - это как раз то, что делает терминал после заполнения последней позиции в строке.

Легко заметить, что это делает не оболочка, просто введя cat и набрав несколько длинных строк. Такие оболочки, как bash и zsh на самом деле отслеживают позицию курсора и количество столбцов, которые, по их мнению, есть у терминала, и выводят различные управляющие последовательности в конце строк, но только для того, чтобы они могли реализовать некоторые из своих более прихотливых функций редактирования строк (например, подсказки справа, горизонтальная прокрутка, отображение и стирание меню завершения вкладок, перезапись/обновление текущей строки и т.д....). Обёртывание строк всё равно произойдёт, если они этого не сделают.

Слой tty также может знать размер экрана, но опять же, он не используется для обеспечения того, чтобы обертка строк происходила.

Если ваш терминал не делает этого, это ошибка в вашем терминале.

2
28.01.2020, 02:14

Теги

Похожие вопросы