终端模拟器工作原理

前言

平常所说的终端其实不是终端,而是终端模拟器.
负责将键盘或鼠标输入的信息处理后传递给应用.

X的工作

X是linux的显示服务,在第11个版本稳定下来,常常称为X11.
工作流程如下:

  1. 键盘敲击
  2. 主板
  3. CPU,产生中断,终端处理程序扫描按键对应的代号scancode
  4. 内核处理scancode成为keycode
  5. X处理keycode成为keysym
    1. xmodmap是传统的方法,应用广泛,使用 xev 命令可以查看结果
    2. XKB在多语言环境下工作地更好但也更复杂
    3. 远程X:keycode序列通过ssh传递到远程X服务器
  6. 应用接收处理过的字符串(如果应用在terminal中运行则先要经过terminal处理)
  7. 应用返回命令给X,X进行渲染/应用返回图片给X,X显示
  8. X指令GPU
  9. GPU操作显示器

终端模拟器的工作

如果应用工作在终端模拟器中,需要先有终端模拟器处理X发来的字符串

  1. X发送keysym
  2. 终端模拟器发送转义序列(escape sequence)至pty设备
    1. 远程应用情况下发送至pty的信息会使用ssh传递给远程的应用
  3. 应用读取pty中的信息
    1. 会根据自身需要将转义序列再转换为其他字符串
  4. 应用处理后返回字符串
    普通的则显示
    转义的则控制光标移动,擦除信息,更改颜色等

转义相关

  1. 普通按键,则使用普通字符对应的unicode码
  2. 如果是组合键,则由原先的多个keysym转换为一个字符串
  3. 如何转换,每个终端都有一套映射,储存在 $terminfo
    1. 也可以使用 locate <term-type> 来查看terminfo的位置
    2. 不方便查看与修改
    3. 可以在终端中按下 Ctrl+V 后再按下想看的组合键
      1. 比如ESC变成了 ^[ (显示效果,内存中可能是16进制的数)
      2. TAB ^I
      3. RET ^M
      4. C-a 显示为 ^A
      5. 等等
  4. 可以发现部分组合键终端根本不发送
    1. 终端程序自身的热键,会被拦截
    2. 单独的修饰键(control modifier)
  5. 还可以发现部分按键无法被区分,常见与基于vte库文件的终端
    1. C-aC-S-aC-A
    2. RETC-RETS-RET 都显示为 ^M
    3. TABC-TAB 都是TAB的效果,但 S-TAB 不同
    4. spaceS-space 相同
    5. 而X是有这个区分能力的
      直接以GUI方式启动的emacs就能从X接收信息并区分C-a与C-A
    6. 导致在终端中运行的emacs将不能使用 `C-RET=这样的组合键
      1. 不过emacs自己有 =C-x @ c Return` 的方式完成这样的小众功能
      2. 其中的c是c键输入的,不是Ctrl
      3. 有时不能决定Return还是RET
      4. 使用 C-x @ C-h 查看帮助
  6. 不同的终端常常使用不同的映射方法,同一个按键有不同的转义字符串
    不过一般一个转义字符串对应一个组合键方案
    除了127有时代表 backspace 有时代表 delete

影响

  • terminal中运行的emacs不可以使用 C-Return 等快捷键(org-mode下常用)
  • tmux不可以设置类似terminator那样的用到 C-TAB, S-C-e 等用于分割和切换面板的快捷键

参考

https://unix.stackexchange.com/questions/116629/how-do-keyboard-input-and-text-output-work/116630#116630