Согласно Последовательности управления XTerm , эта последовательность должна делать то, что было задано:
CSI ? 7 l
То есть
printf '\033[?7l'
7 задокументировано как
Ps = 7 -> Wraparound Mode (DECAWM).
и последний символ l
(строчная буква L) обозначает это как сброс вместо set control.
По какой-то причине имя terminfo для этого более неясно: «автоматические поля». Эти возможности terminfo относятся к этой функции (см. terminfo (5) ):
auto_right_margin am am terminal has auto‐
matic margins
enter_am_mode smam SA turn on automatic
margins
exit_am_mode rmam RA turn off automatic
margins
Интересно, что описание терминала vt100-nam в ncurses (которое, очевидно, никто не использует) инициализирует терминал для использования полей automargins с использованием этой строки:
rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
(\E[?7h
устанавливает его) и утверждает, что терминал не использует автоматические поля, отменяя am
. Он также имеет возможности terminfo rmam
и smam
. Таким образом, вы можете сделать это, чтобы доказать, что это работает:
tput rmam
stty columns 999
ps -efwwwwwl
и (для обычного пользователя) см. Список ps
, аккуратно обрезанный по правому краю окна терминала.
Другие варианты vt220-nam и vt320-nam выглядят корректно ...
Кстати, для Mac вы должны использовать имена terminfo , такие как rmcup
, а не termcap RA
, потому что OSX использует tput (terminfo) для ncurses, а не вариант BSD.
Дальнейшее чтение:
Иногда кто-то спрашивает о подавлении автоматических полей, потому что они полагают, что терминалы могут перемещаться / прокручиваться влево / вправо, чтобы показать информацию, которая не была перенесена на новую строку. Терминалы, которые делают это редко, и Терминал OSX не является одним из тех . Он ведет себя как подмножество xterm, которое само эмулирует серию терминалов DEC vt52 / vt100 / vt220 / etc. В этом вопросе OP обеспокоен / запутан в этом абзаце из руководства screen
:
Если ваш терминал является «истинным» терминалом с автоматической маржой (он не позволяет
последняя позиция на экране обновляется без прокрутки экрана)
рассмотреть возможность использования версии termcap вашего терминала, которая имеет автоматический
поля отключены. Это обеспечит точное и оптимальное обновление
экран при любых обстоятельствах. Большинство терминалов в настоящее время имеют «магию»
поля (автоматические поля плюс последний пригодный для использования столбец). Это VT100
тип стиля и идеально подходит для экрана. Если все, что у вас есть, это
«истинный» экран терминала с автоматическим запасом контента будет его использовать, но
обновление персонажа, помещенного в последнюю позицию на экране, может не
будет возможно, пока экран не прокрутится или персонаж не переместится в
безопасное положение другим способом. Эта задержка может быть сокращена с помощью
терминал с возможностью вставки символов.
То, что последняя позиция на экране относится к нижнему правому углу терминала. В обычном случае, если курсор находится в правом нижнем углу и вы печатаете символ, вы ожидаете, что дисплей прокрутится вверх на одну строку и покажет символ на следующей строке. Также (поскольку терминалы могут быть реализованы разными способами), некоторые могут прокручиваться вверх, когда вы печатаете символ в последней позиции . VT100 не делает этого. В этом случае он не только не прокручивается вверх, но и игнорирует непечатаемые символы, в то время как на поле (см. FAQ по xterm Это описание переноса странное, скажем больше? ). Существует флаг terminfo xenl
, который показывает, когда терминал выполняет это специальное поведение. Около трети описаний терминалов в базе данных терминалов имеют этот флаг. Хотя большинство из них предназначены для терминалов, с которыми вы, вероятно, никогда не столкнетесь, имейте в виду, что рекомендации на странице руководства были написаны еще в эпоху, когда эти другие терминалы были с такой же вероятностью найдены как VT100. Ранняя история изменений для экрана плохая, но текст был во второй публикации экрана в Usenet в 1992 году. Первоначальная публикация в 1987 году говорила что-то похожее:
Экран
никогда не пишет в последней позиции экрана, если не логическое
Возможность LP
находится в записи termcap терминала.
Обычно,
экран
не может предсказать, прокручивает ли конкретный терминал, когда
символ записывается в последнем столбце последней строки;
LP
указывает на то, что писать в этой позиции безопасно.
Обратите внимание, что возможность LP
не зависит от am
(автоматически
поля); для определенных терминалов, таких как VT100, это разумно
установить am
, а также LP
в соответствующей записи termcap
(VT100 не перемещает курсор, когда символ написан в
последний столбец каждой строки).
Более поздняя формулировка отражает тот факт, что система terminfo
была распространена, и имя LP
не было именем termcap, выбранным для соответствующего xenl
(это xn
).
Смысл всего этого в том, что screen
пытается преобразовать программы, пишущие в терминалы разных типов, и сделать их похожими на терминалы одного типа & mdash; это означает, что он пытается поместить текст на дисплей терминала во всех местах. Правый нижний угол является проблемой, потому что некоторые терминалы прокручиваются вверх, что портит попытку записи в них. В качестве обходного пути некоторые терминалы предоставили альтернативу:
- с использованием другого режима (вставка),
- поместите курсор на рядом с последней позицией дисплея,
- введите символы для заполнения, вставьте символ в последнюю позицию и
- выключите режим вставки, как только это будет сделано (иначе неприятность).
Около двух третей описаний в базе данных терминала имеют возможность использовать этот режим вставки (smir
). Это все еще не было совершенным, но это, безусловно, стоило упомянуть в 1992 году. Около четверти внедрили аналогичную функцию ich1
. Некоторые реализуют оба (и vi
могут запутать их, пытаясь использовать оба метода).
VT100-двойники предоставляют третий способ записи этой последней позиции; screen
проверяет и использует все, что там есть.