Невозможно отключить автоматические поля с помощью termcap в Mac - PullRequest
0 голосов
/ 01 мая 2009

Мне нужно отключить автоматические поля в соответствии со следующей инструкцией из руководства Screen на моем Mac

Если ваш терминал "истинный" терминал автоматической маржи (он не позволяет последняя позиция на экране быть обновленным без прокрутки экрана) рассмотреть возможность использования версии termcap вашего терминала, который автоматические поля отключены.

Как вы можете отключить автоматическую наценку с помощью termcap вашего терминала?

Ответы [ 3 ]

2 голосов
/ 28 сентября 2016

Большинство эмуляторов терминала, включая терминал по умолчанию для Mac, не являются «настоящими терминалами с автоматическим запасом полей» в том смысле, в котором они здесь обсуждаются, - они эмулируют терминал серии vt100, который имел «умный» переход. Вы можете проверить, набрав cat и набрав в конце последней строки - после ввода последнего символа курсор остается в конце строки (выделяя только что введенный символ), пока вы не наберете другой символ.

Единственным следствием «истинного терминала с автоматическим запасом» является то, что символ не может быть отображен в правом нижнем углу (хотя некоторые программы могут обойти это, переместив символ на место с помощью ich / ich1)

1 голос
/ 28 сентября 2016

Согласно Последовательности управления 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 проверяет и использует все, что там есть.

0 голосов
/ 01 мая 2009

Если я правильно вас понял, вы хотите установить для функции автоматической переноса значение NO, используя базу данных terminfo. Если это так, я думаю, что вы можете использовать флаг -nam, чтобы отключить его - что-то вроде vt100-nam должно сделать это. Вы также можете проверить, посмотрев справочные страницы для terminfo.

Если это решит ваш вопрос, отметьте это. (^_^) Если нет ... хорошо прокомментируйте, и я проверю еще раз для вас. Ура!

Обновление: есть также ярлык, который может применяться к вам для включения и выключения переноса. Проверьте ярлык листа здесь . И дополнительную информацию для экрана можно найти здесь (поиск обтекания). Вы также можете проверить здесь о том, как использовать setterm (раздел 17.14 Изменение настроек терминала). Также проверьте здесь для примеров изменения настроек.

Удачи снова. (^ _ ^)

...