怎样使用terminal里面的功能键

怎样使用terminal里面的功能键

在UNIX/LINUX机器上跑着很多各种各样的应用程序,具体跑什么样的程序当然由
这部机器干什么而决定。比如说在机器A上你可以用GIMP来画图,到了机器B上可
能就没有了。甚至有很多专门用来做服务器的UNIX机器干脆连图形化界面(X)都
不用装,因为和Windows(TM)不同,X也只不过是另外一个应用程序而已。

但有一种程序基本上所有的UNIX/LINUX desktop都有,那就是终端(terminal)。
终端提供一个文本界面让你输入命令,然后由某个应用程序比如说shell或者
emacs来执行你的这个命令。即使是那种headless server往往也还是可以通过一
个VGA compatible的烂显卡显示一个文本终端(Linux console)。

因为历史的原因,UNIX/LINUX下有几乎无穷多个不同的终端。这些这终端在输入
纯文本字符(ASCII)的时候表现都差不多,但在输入功能键比如说四个方向键,
Backspace,DEL,Fn,Home/End之类的按钮的时候则可能完全没有共性。如果你
还想使用更加复杂一点的组合,比如说Control方向键的话就更麻烦了。

我不打算在这里详尽的讲stty/termcap/terminfo/xmodmap….的理论,如果大家
对这些理论有兴趣的话请参看以下这些网页:

http://eappc48.lbl.gov/HOWTO/Keyboard-and-Console-HOWTO-5.html
http://www.mit.edu/afs/sipb/project/outland/doc/rxvt/html/refer.html#KeyCodes
http://www.white.nu/~jwhite/keymapping/

就我自己,我只想在我自己用得最多的这两个程序里面实现这样几个功能:

Bash:

1.  四个方向键都管用(上下是命令历史记录)

2.  Control 左右和Meta 左右应该以word为单位移动(类似于Windows的表现)

3.  Meta Backspace应该向左删除一个单词。

4.  Meta 上下应该是类似tcsh的那种以已经输入的字母为基准向上/下搜索历史
    命令。

Emacs:

1.  四个方向键都管用

2.  同Bash

3.  同Bash

4.  Pageup/pagedown管用;

5.  F1…F12 的的确确都被认成是功能键

这些功能应该无论在我用的哪一个终端上都表现一致--我常用的终端有两个:

aterm, putty (从Windows远程登录)。

********第一步:找到功能键的代码********

这又有两种办法:在你的Bash里先按Control v,然后再按你想要知道的功能键,
你的终端应该能够报告出这个功能键的代码,比如说在putty里我通过这样的方法
知道了Control右是^[OC,也就是Meta OC (^[就等价于Meta)。注意Meta和功能键
相组合往往不能很好的通过这个方法显示出来(可能是因为太长了),但是实际
上我们几乎从来都不需要去找比如说Meta 左,因为已知左的代码,Meta 左就是
在左的代码之前再加一个Meta … :-)

但是emacs就又不同,他显示控制代码用的快捷键是Control q。

以下是aterm和putty分别在TERM=xterm-color下的功能键列表:(\C代表
Control,\M代表Meta)

Aterm:

+————+————+————+————+
|            |正常        |Control     |Meta        |
+————+————+————+————+
|上          |\M [ A      |\M O a      |\M\M [ A    |
+————+————+————+————+
|下          |\M [ B      |\M O b      |\M\M [ B    |
+————+————+————+————+
|左          |\M [ D      |\M O d      |\M\M [ D    |
+————+————+————+————+
|右          |\M [ C      |\M O c      |\M\M [ C    |
+————+————+————+————+
|Backspace   |\C ?        |\C H        |\M\C ?      |
+————+————+————+————+
|Page Up     |\M [ 5 ~    |\M [ 5 ^    |\M\M [ 5 ~  |
+————+————+————+————+
|Page Down   |\M [ 6 ~    |\M [ 6 ^    |\M\M [ 6 ~  |
+————+————+————+————+

Putty:

+————+————+————+————+
|            |正常        |Control     |Meta        |
+————+————+————+————+
|上          |\M [ A      |\M O A      |\M\M [ A    |
+————+————+————+————+
|下          |\M [ B      |\M O B      |\M\M [ B    |
+————+————+————+————+
|左          |\M [ D      |\M O D      |\M\M [ D    |
+————+————+————+————+
|右          |\M [ C      |\M O C      |\M\M [ C    |
+————+————+————+————+
|Backspace   |\C ?        |\C ?        |\M\C ?      |
+————+————+————+————+
|Page Up     |\M [ 5 ~    |N/A         |\M\M [ 5 ~  |
+————+————+————+————+
|Page Down   |\M [ 6 ~    |N/A         |\M\M [ 6 ~  |
+————+————+————+————+

我们可以看出来,putty和aterm的区别其实不大,主要是在Control加功能键上稍
微有一点不同。

Aterm和putty的Fn键相同,均为:

Fn:  \M [ 1 n,    n = 1, 2, 3, 4, 5
     \M [ 1 n+1,  n = 6 …. 12.
     
我现在也不知道为什么在n=6的时候有那么一个跳跃。

********解决Bash的问题********

Bash还有另外一些编译的时候选了readline的程序受readline library的控制,
它们的配置文件在~/.inputrc。

我发现目标1, 3基本上不用配置,所以以下是一个实现目标2,4的.inputrc文件:

"\M-OC": forward-word
"\M-OD": backward-word
"\M-Oc": forward-word
"\M-Od": backward-word
"\M-\M-[C": forward-word
"\M-\M-[D": backward-word
"\M-n": history-search-forward
"\M-p": history-search-backward
"\M-\M-[B": history-search-forward
"\M-\M-[A": history-search-backward

"\C-x\C-r": re-read-init-file
"\M-e": "emacs & \n"

最后两行是另外的东西,不过也很有用,所以在这里一并列出。

********解决emacs的问题*******

emacs能够正确的认出方向箭头,但是它理解的方向键和Control方向键正好和
Bash理解的相反。所以我改动了这个用来配置emacs在xterm-color下的行为的系
统文件:

/usr/share/emacs/21.4/lisp/term/xterm-color.el:

(define-key function-key-map "\e[A" [C-up])
(define-key function-key-map "\e[B" [C-down])
(define-key function-key-map "\e[C" [C-right])
(define-key function-key-map "\e[D" [C-left])
(define-key function-key-map "\eOa" [C-up])
(define-key function-key-map "\eOb" [C-down])
(define-key function-key-map "\eOc" [C-right])
(define-key function-key-map "\eOd" [C-left])

(define-key function-key-map "\e\eOA" [M-up])
(define-key function-key-map "\e\eOB" [M-down])
(define-key function-key-map "\e\eOC" [M-right])
(define-key function-key-map "\e\eOD" [M-left])
(define-key function-key-map "\e\eOa" [M-up])
(define-key function-key-map "\e\eOb" [M-down])
(define-key function-key-map "\e\eOc" [M-right])
(define-key function-key-map "\e\eOd" [M-left])

(define-key function-key-map "\eOl" [kp-add])
(define-key function-key-map "\eOS" [kp-subtract])
(define-key function-key-map "\eOk" [kp-add])
(define-key function-key-map "\eOm" [kp-subtract])
(define-key function-key-map "\e[2~" [insert])
(define-key function-key-map "\e[4~" [select])
(define-key function-key-map "\e[5~" [prior])
(define-key function-key-map "\e[6~" [next])
(define-key function-key-map "\e[11~" [f1])
(define-key function-key-map "\e[12~" [f2])
(define-key function-key-map "\e[13~" [f3])
(define-key function-key-map "\e[14~" [f4])
(define-key function-key-map "\e[15~" [f5])
(define-key function-key-map "\e[17~" [f6])
(define-key function-key-map "\e[18~" [f7])
(define-key function-key-map "\e[19~" [f8])
(define-key function-key-map "\e[20~" [f9])
(define-key function-key-map "\e[21~" [f10])
(define-key function-key-map "\e[23~" [f11])
(define-key function-key-map "\e[24~" [f12])
(define-key function-key-map "\e[29~" [print])

这样一来,我的电脑上emacs就能够正确的认出这些我需要的功能键了。

注意:如果你采用把这些按键定义写入~/.emacs的方式,那么你会发现emacs首先
去读~/.emacs,然后再去读系统的终端配置文件,这样一来,你的定义就会被系
统定义所冲掉。你只能在emacs起来之后再load-file ~/.emacs,才能使用我们自
己定义的功能键。这个我认为是emacs的一个bug,因为个人的配置文件应该无论
如何都具有比系统配置文件更高的优先级。

, ,

  1. 发表评论

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: