【问题标题】:How does tmux, vim, emacs, etc transcend the UI limitations of *nix terminals?tmux、vim、emacs 等如何超越 *nix 终端的 UI 限制?
【发布时间】:2015-08-09 12:15:28
【问题描述】:

当我编写用于命令行的程序时,我注意到存在一些限制。例如,我不能像 tmux 那样在窗口中分隔窗格时绘制 1 像素厚的水平或垂直线。我只能向下移动光标,而不是像 VI 看起来那样向上移动。如果光标在底部,我无法刷新页面顶部的信息。

所以,当像 tmux 和 vi 这样的程序这样做时,我不得不怀疑它们是否是:

  • 每次更新都从上到下绘制屏幕(我认为这不太可能,否则我可以在终端中向上滚动并查看每次重绘)

  • 使用一些在终端中启用图形的库,如 SDL,我也认为这不太可能。

  • 使用一些我不知道的标准系统调用

或者最后

  • 利用我完全不知道的 Linux/Unix 的某些功能。

那么,这些程序是如何在看似有限的外壳中生成如此丰富的 UI 的呢?只要答案给了我足够的素材让我在 Google 上狂暴,我就会很高兴。

我还假设这些程序使用一些常用方法来执行这些操作,但如果有误请告诉我。

【问题讨论】:

标签: linux user-interface unix terminal tmux


【解决方案1】:

典型的终端仿真器具有比显而易见的更多的功能。

基本上一个程序只需要输出代表各种命令的短字节序列,例如移动光标(上|下|左|右)、改变颜色、滚动区域、擦除区域等。

这些命令通常以转义字符(与在终端中键入时按 esc 键生成的字符相同)开头,后跟各种其他字符,具体取决于所需的操作。

了解其工作原理的一个很好的起点是关于 ANSI escape codes 的维基百科文章

【讨论】:

    【解决方案2】:

    您可以通过将终端置于原始模式并使用低级操作直接写入终端来手动完成,但标准方法是使用 ncurses 库。

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 2021-10-30
      • 1970-01-01
      • 2014-09-21
      • 2014-11-07
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      相关资源
      最近更新 更多