Tuesday, February 04, 2014

[Linux/Mac] Terminal收到的Control Code和Escape Sequence Code

在Linux和Mac里使用Terminal的时候常常会出现按下一个组合键出来一堆奇怪字符的情况. 这通常是由于这个按键组合未被Terminal识别成功. 现在操作系统的Terminal通常已经足够强大, 比如MacOS自带的Terminal以及iTerm等都可以自己设置从按键组合到Control Code或者Escape Sequence Code的映射来传给Shell. 由于我常常被这个问题困扰, 所以写下这篇笔记.

何为Ctrol Code和Escape sequence code?


这里有几篇很不错的讲解Text-Terminals on Linux以及Linux Console Codes

基本这是一套沿用多年, 对按键组合编码的方案. 简单说来, Escape Sequence Code就是讲一个按键组合变成以\033(键盘上得Esc键)打头的一串字符. 比如
up     \033[A
down   \033[B
right  \033[C
left   \033[D
shift+up     \033[1;2A
shift+down   \033[1;2B
shift+right  \033[1;2C
shift+left   \033[1;2D
meta+up      \033[1;4A
meta+down    \033[1;4B
meta+right   \033[1;4C
meta+left    \033[1;4D
ctrl+up     \033[1;5A
ctrl+down   \033[1;5B
ctrl+right  \033[1;5C
ctrl+left   \033[1;5D
不难看出其中的一些个规律 (Alt: 1, Ctrl: 2, Shift: 4, ...). 更多的code可以参考: Key Codes以及 xterm code:

如何得到一个按键(或者按键组合)当前对应的Escape Sequence Code


在MacOS的terminal里可以很方便的
Keystroke to Type Expected Output (for VT220 mapping)
ctrl-V backspace ^?
ctrl-V delete ^[[3~
ctrl-V ctrl-H ^H

或者使用sed命令
$ sed -n l
在Linux的terminal下, 运行xev, 桌面角落里会出现一个小对话框。 同时terminal里会输出当前的事件, 比如按下了哪个键,松开了哪个键, 进而可以获得这些键的code


在Emacs里如何使用键映射(keymap)

这是我写的一篇笔记Mac OS Terminal中设置Emacs热键
http://blog.csdn.net/joans123/article/details/7562212
Mastering Key Bindings In Emacs

No comments: