0

我需要根据我 Mac 中 Screen 手册中的以下语句关闭自动边距

如果您的终端是“真正的”自动边距终端(它不允许在不滚动屏幕的情况下更新屏幕上的最后一个位置),请考虑使用关闭了自动边距的终端 termcap 版本。

如何通过终端的 termcap 关闭自动边距?

4

3 回答 3

2

大多数终端仿真器,包括 mac 默认终端,在此处讨论的意义上不是“真正的自动边距终端”——它们模拟具有“智能”环绕的 vt100 系列终端。您可以通过运行cat并键入到最后一行的末尾进行检查 - 键入最后一个字符后,光标将保持在该行的末尾(突出显示您刚刚键入的字符),直到您键入另一个字符。

“真正的自动边距终端”的唯一后果是字符不能显示在右下角(尽管有些程序可以通过使用ich/将字符移动到位来解决这个问题ich1

于 2016-09-28T01:42:48.693 回答
1

根据XTerm Control Sequences,这个序列应该做被问到的事情:

CSI ? 7 l

那是,

printf '\033[?7l'

7记录为

        Ps = 7  -> Wraparound Mode (DECAWM).

最后一个字符l(小写 L)表示这是一个重置而不是设置控件。

无论出于何种原因,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

有趣的是,ncurses 中的vt100-nam终端描述(显然没有人使用)使用以下字符串初始化终端以使用automargins 边距:

rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, 

\E[?7h设置它),并断言终端不通过取消使用自动边距am。它还具有 terminfo 功能rmamsmam. 所以你可以这样做来证明它有效:

tput rmam
stty columns 999
ps -efwwwwwl

并且(对于普通用户)看到ps列表很好地截断了终端窗口的右边距。

其他变体 vt220-nam 和 vt320-nam 似乎正确...

顺便说一句,对于Mac,您将使用terminfo名称,rmcup而不是termcap RA,因为 OSX 使用 ncurses 的 tput (terminfo) 而不是 BSD 变体。

进一步阅读:

偶尔有人会询问有关抑制自动边距的问题,因为他们认为终端可以向左/向右平移/滚动以显示未换行的信息。这样做的终端很少见,OSX 终端不是其中之一。它的行为类似于 xterm 的一个子集,它本身模拟一系列 DEC 终端 vt52/vt100/vt220/等。在这个问题中,OP 对手册中的这一段感到担忧/困惑screen

如果您的终端是“真正的”自动边距终端(它不允许 屏幕上的最后一个位置要在不滚动屏幕的情况下进行更新)考虑使用终端的 termcap 版本,该版本已关闭自动边距。这将确保在所有情况下都能准确和优化更新屏幕。现在大多数终端都有“神奇”的边距(自动边距加上可用的最后一列)。这是 VT100 风格类型,非常适合屏幕。如果您所拥有的只是一个“真正的”自动边距终端屏幕将满足于使用它,但是在屏幕滚动或角色移动到以其他方式的安全位置。使用具有插入字符功能的终端可以缩短此延迟。

屏幕上的最后一个位置是指终端的右下角。在正常情况下,如果您的光标位于右下角并且您打印一个字符,您会希望显示屏向上滚动一行并在下一行显示该字符。此外(因为终端可以以不同的方式实现),当您在最后一个位置打印一个字符时,有些可能会向上滚动。VT100 不这样做。在这种情况下,它不仅不会向上滚动,而且会在页边空白处忽略非打印字符请参阅 xterm 常见问题解答包装的描述很奇怪,说更多?)。有一个 terminfo 标志xenl设置为显示终端何时执行此特殊行为。终端数据库中大约三分之一的终端描述具有此标志。虽然其中大部分是针对您可能永远不会遇到的终端,但请记住,手册页中的建议是在其他终端与 VT100 相似的时代写的。screen 的早期变化历史很差,但该文本是 screen 在 1992 年第二次发布到 Usenet 的。1987 年的初始发布中说了类似的话:

LP除非在终端的 termcap 条目中找到 布尔功能,否则屏幕永远不会写入屏幕的最后一个位置。通常, 当最后一行的最后一列中写入一个字符时,屏幕 无法预测特定终端是否滚动; LP表示在此位置书写是安全的。请注意,该LP功能独立于am(自动边距);对于某些终端,例如VT100,在对应的termcap条目中设置am以及设置是合理LP的(VT100在每行的最后一列写入字符时不会移动光标)。

后面的措辞反映了terminfo系统流行的事实,并且名称LP不是为对应于xenl(它是xn)而选择的termcap名称。

所有这一切的重点是screen尝试在写入不同终端类型的程序之间进行转换,并使它们看起来都像一种终端类型——这意味着它试图在终端的所有位置显示文本。右下角是个问题,因为一些终端会向上滚动,破坏在那里写的尝试。作为一种解决方法,一些终端提供了替代方案:

  • 使用不同的模式(插入),
  • 将光标放在显示器的倒数第二个位置
  • 写入要填充的字符,将字符到最后一个位置,然后
  • 完成后关闭插入模式(否则很麻烦)。

终端数据库中大约三分之二的描述具有执行此插入模式 ( smir) 的能力。这仍然不完美,但在 1992 年确实值得一提。大约四分之一的人实现了类似的类似功能ich1。有些实现了两者(并且vi可能会通过尝试同时执行这两种方法而感到困惑)。

VT100-lookalikes 提供了写最后一个位置的第三种方法;screen检查并使用那里的任何东西。

于 2016-09-28T20:30:18.453 回答
0

如果我理解正确,您希望使用 terminfo 数据库将自动换行功能设置为 NO。如果是这样,我相信您可以使用 -nam 标志将其关闭-应该使用 vt100-nam 之类的东西。您还可以通过查看 terminfo 的手册页进行检查。

如果这解决了您的问题,请标记它。(^_^) 如果不是...请回复评论,我会再次为您检查。干杯!

更新:还有一个快捷方式可能适用于您来关闭和打开换行。在此处查看快捷方式表。可以在此处找到有关 Screen 的其他信息(搜索 wrap)。您还可以在此处查看如何使用 setterm(第 17.14 节更改终端设置)。另请在此处查看更改设置的示例。

再次祝你好运。(^_^)

于 2009-05-01T07:48:38.427 回答