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

如果您的终端是“ True”自动固定终端(它不允许在屏幕上更新屏幕上的最后一个位置而不滚动屏幕)考虑使用终端的Terminal的版本,该版本已关闭了自动保证金。

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

有帮助吗?

解决方案

根据 XTerm 控制序列, ,这个序列应该执行所要求的操作:

CSI ? 7 l

那是,

printf '\033[?7l'

7 被记录为

        Ps = 7  -> Wraparound Mode (DECAWM).

和最终的角色 l (小写 L)将其表示为 重置 而不是一个 控制。

不管出于什么原因,它的 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-南 ncurses 中的终端描述(显然没有人使用)将终端初始化为 使用 自动边距使用此字符串的边距:

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 看起来正确......

顺便说一下,对于 苹果, ,你会使用 术语信息 名称如 rmcup 而不是 术语帽 RA, ,因为 OSX 使用 ncurses 的 tput (terminfo) 而不是 BSD 变体。

进一步阅读:

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

如果您的终端是“真正的”自动保证金终端(它不允许 屏幕上的最后一个位置 要在不滚动屏幕的情况下进行更新)考虑使用终端的termcap版本,该版本自动保证金关闭了。这将确保在任何情况下确保屏幕的准确和最佳更新。如今,大多数终端都具有“魔术”边距(自动保证金加上可用的最后一列)。这是VT100样式类型,非常适合屏幕。如果您所拥有的只是一个“正确”的自动修订终端屏幕,则可以使用它,但是在屏幕滚动或将字符移动到屏幕上,将不可能更新到屏幕上的角色可能是不可能的以其他方式安全位置。可以使用具有插入字符能力的端子来缩短此延迟。

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

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

后面的措辞反映了这样一个事实: terminfo 系统很流行,并且名称 LP 未选择 termcap 名称来对应 xenl (这是 xn).

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

  • 使用不同的模式(插入),
  • 将光标放在 最后一个位置旁边 显示器的
  • 写出要填写的字符, 推动 一个字符进入最后一个位置,并且
  • 完成后关闭插入模式(否则很麻烦)。

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

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

其他提示

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

“真正的自动边距终端”的唯一结果是角色无法显示在右下角(尽管某些程序可以通过使用 ich <将角色移动到位来解决这个问题/代码> / <代码> ICH1

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

如果这样可以解决您的问题,请将其标记出来。 (^_^)如果没有...好评论回来,我会再次检查你。干杯!

更新:还有一个快捷方式可能适用于您切换包装和打开。查看快捷工作表此处。有关Screen的更多信息,请访问此处(搜索换行)。您还可以查看有关如何使用setterm的此处(第17.14节更改终端设置)。另请参阅此处,了解更改设置的示例。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top