我需要根据我 Mac 中 Screen 手册中的以下语句关闭自动边距
如果您的终端是“真正的”自动边距终端(它不允许在不滚动屏幕的情况下更新屏幕上的最后一个位置),请考虑使用关闭了自动边距的终端 termcap 版本。
如何通过终端的 termcap 关闭自动边距?
大多数终端仿真器,包括 mac 默认终端,在此处讨论的意义上不是“真正的自动边距终端”——它们模拟具有“智能”环绕的 vt100 系列终端。您可以通过运行cat
并键入到最后一行的末尾进行检查 - 键入最后一个字符后,光标将保持在该行的末尾(突出显示您刚刚键入的字符),直到您键入另一个字符。
“真正的自动边距终端”的唯一后果是字符不能显示在右下角(尽管有些程序可以通过使用ich
/将字符移动到位来解决这个问题ich1
)
根据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 功能rmam
和smam
. 所以你可以这样做来证明它有效:
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
检查并使用那里的任何东西。
如果我理解正确,您希望使用 terminfo 数据库将自动换行功能设置为 NO。如果是这样,我相信您可以使用 -nam 标志将其关闭-应该使用 vt100-nam 之类的东西。您还可以通过查看 terminfo 的手册页进行检查。
如果这解决了您的问题,请标记它。(^_^) 如果不是...请回复评论,我会再次为您检查。干杯!
更新:还有一个快捷方式可能适用于您来关闭和打开换行。在此处查看快捷方式表。可以在此处找到有关 Screen 的其他信息(搜索 wrap)。您还可以在此处查看如何使用 setterm(第 17.14 节更改终端设置)。另请在此处查看更改设置的示例。
再次祝你好运。(^_^)