当您输入vim时,它会“清除”屏幕。退出后,它“恢复”原始内容。
我知道可以使用\x1b[2J
清除控制台并重置光标位置,但这会覆盖终端内容。
我认为Vim使用了ncurses,在这种情况下我认为更好的问题是ncurses如何做到这一点,但它是如何完成的?
答案 0 :(得分:10)
关于@Keith Thompson的答案 - 不完全是:
smcup
和rmcup
的ncurses的屏幕优化。相反,它是termcap application。 遵循大多数(并非所有)termcap应用程序使用的约定。有些vi
的实现并不是(例如,在IRIX64上)。smcup
是 set-mode-cursor-positioning 或开始光标定位模式的(模糊)缩写。 (还有游标寻址)。 r
中的rmcup
表示"重置" (m
表示"模式")。 set / reset与save / restore有不同的含义;使用后者,用户可以相信价值可以叠加。答案 1 :(得分:8)
大多数终端仿真器都能够保存和恢复屏幕内容。
为此,terminfo代码为smcup
以进入全屏模式,rmcup
将其保留。 (较旧的termcap代码为ti
和te
。)
如果在terminfo
数据库中启用了这些功能,则使用ncurses
的任何程序都会在输入时打印smcup
字符串,并在退出时打印rmcup
字符串。 / p>
在我目前正在使用的系统上,字符串是(\E
代表Escape字符):
smcup: \E7\E[?1;47h
rmcup: \E[2J\E[?1;47l\E8
这将恢复屏幕的先前内容以及光标位置。
序列的具体含义(对于xterm)是documented here:
\E7
保存光标\E[?1;47h
应用程序游标键;使用备用屏幕缓冲区\E[2J
删除屏幕\E[?1;47l
应用程序游标键;使用普通屏幕缓冲区\E8
还原光标(这假设我正确理解分号的使用;我并非100%肯定。)