终端模拟器工作原理
前言
平常所说的终端其实不是终端,而是终端模拟器.
负责将键盘或鼠标输入的信息处理后传递给应用.
X的工作
X是linux的显示服务,在第11个版本稳定下来,常常称为X11.
工作流程如下:
- 键盘敲击
- 主板
- CPU,产生中断,终端处理程序扫描按键对应的代号scancode
- 内核处理scancode成为keycode
- X处理keycode成为keysym
- xmodmap是传统的方法,应用广泛,使用
xev
命令可以查看结果 - XKB在多语言环境下工作地更好但也更复杂
- 远程X:keycode序列通过ssh传递到远程X服务器
- xmodmap是传统的方法,应用广泛,使用
- 应用接收处理过的字符串(如果应用在terminal中运行则先要经过terminal处理)
- 应用返回命令给X,X进行渲染/应用返回图片给X,X显示
- X指令GPU
- GPU操作显示器
终端模拟器的工作
如果应用工作在终端模拟器中,需要先有终端模拟器处理X发来的字符串
- X发送keysym
- 终端模拟器发送转义序列(escape sequence)至pty设备
- 远程应用情况下发送至pty的信息会使用ssh传递给远程的应用
- 应用读取pty中的信息
- 会根据自身需要将转义序列再转换为其他字符串
- 应用处理后返回字符串
普通的则显示
转义的则控制光标移动,擦除信息,更改颜色等
转义相关
- 普通按键,则使用普通字符对应的unicode码
- 如果是组合键,则由原先的多个keysym转换为一个字符串
- 如何转换,每个终端都有一套映射,储存在
$terminfo
中- 也可以使用
locate <term-type>
来查看terminfo的位置 - 不方便查看与修改
- 可以在终端中按下
Ctrl+V
后再按下想看的组合键- 比如ESC变成了
^[
(显示效果,内存中可能是16进制的数) - TAB
^I
- RET
^M
- C-a 显示为
^A
- 等等
- 比如ESC变成了
- 也可以使用
- 可以发现部分组合键终端根本不发送
- 终端程序自身的热键,会被拦截
- 单独的修饰键(control modifier)
- 还可以发现部分按键无法被区分,常见与基于vte库文件的终端
C-a
与C-S-a
即C-A
RET
与C-RET
与S-RET
都显示为^M
TAB
与C-TAB
都是TAB的效果,但S-TAB
不同space
与S-space
相同- 而X是有这个区分能力的
直接以GUI方式启动的emacs就能从X接收信息并区分C-a与C-A - 导致在终端中运行的emacs将不能使用 `C-RET=这样的组合键
- 不过emacs自己有 =C-x @ c Return` 的方式完成这样的小众功能
- 其中的c是c键输入的,不是Ctrl
- 有时不能决定Return还是RET
- 使用
C-x @ C-h
查看帮助
- 不同的终端常常使用不同的映射方法,同一个按键有不同的转义字符串
不过一般一个转义字符串对应一个组合键方案
除了127有时代表backspace
有时代表delete
影响
- terminal中运行的emacs不可以使用
C-Return
等快捷键(org-mode下常用) - tmux不可以设置类似terminator那样的用到
C-TAB
,S-C-e
等用于分割和切换面板的快捷键