Friday, May 1, 2009

ctrl-s引发的问题

在使用terminal时, 有时会不小心按到ctr-s, 这时....呃..... freeze了!!

怎么解开?

google了一下, 发现解开的方法: ctrl-q

然后想了想: 这样下去不是个办法呀. ctrl-s为什么要被搞成这种没有意义的用途呢(至少我还没有想到)

ctrl-s能不能被map到其它作用?
刚开始, 猜是terminal软件的问题, 但是测试了一下, urxvt和terminal(xfce下默认安装的一个软件)都对ctrl-s起作用. 好像自己的是想法是不对的.

找着找着, 跑入了linux的历史......

什么是tty?
The name of the program comes from teletypewriter, abbreviated "TTY".
* http://en.wikipedia.org/wiki/Teleprinter
就是输入与输出的设备. tty的man手册中写到:
tty - print the file name of the terminal connected to standard input
* 为什么没有说standard output的呢?
命令运行的结果:
jessinio@nio-laptop ~ $ tty
/dev/pts/9

什么是终端?
终端其实应该叫terminal emulate
* http://en.wikipedia.org/wiki/Terminal_emulator

tty是设备(就算pts也是模拟的), terminal amulator算是使用tty的一个软件, terminal amulator是用户与tty设备的纽带.

现在知道用户的会被两次处理:
1. 被terminal emulator处理.
1. 被tty处理.

之前猜测是terminal emulator的处理, 其实是tty的处理.

tty的设置有专用的命令, 如下:

stty - change and print terminal line settings

现有的设置:
jessinio@nio-laptop ~ $ stty -a|less
speed 38400 baud; rows 32; columns 116; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab3 bs0 vt0 ff0
isig -icanon iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

去掉ctrl-s的作用:

非常激动的发现了新的作用, 如下:
jessinio@nio-laptop ~ $ stty stop ^-
(i-search)`':

出现了向前搜索!!我之前一直认为bash是没有这个功能的(不想使用arrow键)

把这命令行加到~/.bashrc下即可!(当然, terminal emulator需要是login shell)

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.