Skip to content

更改键盘映射

我的Thinkpad X20E的回车键坏掉了,但是手头很紧,不想换键盘,而且也不常用,干脆就把回车键映射到其它的键上吧。
考虑了一番,大写键(CapsLock)就是这次的牺牲品了。

当然,目前这台计算机运行的(还)是DragonFlyBSD 4.2。

下面要开始实施计划。当然,你还需要一个外接的键盘。

由于控制台(console)界面下和X(图形界面)下键映射的负责程序不同,需要分别来做。

1. 命令行下

根据网络搜索结果和命令手册,命令行下键的映射由kbdcontrol程序来控制。
首先,导出目前键盘映射表到一个文件(需要在控制台界面下操作,SSH不行(?)):

kbdcontrol -d > /root/no_enter.map

然后编辑此文件。我的键盘映射表中,大写键编码为058 (找文件的2-8列中clock对应的编码)。
然后将058那一行的第二列的clock改为cr(Carriage Return)。参看下面我修改过的文件。
第一个带有#的058的行是kbdcontrol命令导出的数据,被我注释掉了。

[acheng@violet ~]$ cat /root/no_enter.map
#                                                         alt
# scan                       cntrl          alt    alt   cntrl lock
# code  base   shift  cntrl  shift  alt    shift  cntrl  shift state
# ------------------------------------------------------------------
  000   nop    nop    nop    nop    nop    nop    nop    nop     O
  001   esc    esc    esc    esc    esc    esc    debug  panic   O
  002   '1'    '!'    nop    nop    '1'    '!'    nop    nop     O
  003   '2'    '@'    nul    nul    '2'    '@'    nul    nul     O
  004   '3'    '#'    nop    nop    '3'    '#'    nop    nop     O
  005   '4'    '$'    nop    nop    '4'    '$'    nop    nop     O
  006   '5'    '%'    nop    nop    '5'    '%'    nop    nop     O
  007   '6'    '^'    rs     rs     '6'    '^'    rs     rs      O
  008   '7'    '&'    nop    nop    '7'    '&'    nop    nop     O
  009   '8'    '*'    nop    nop    '8'    '*'    nop    nop     O
  010   '9'    '('    nop    nop    '9'    '('    nop    nop     O
  011   '0'    ')'    nop    nop    '0'    ')'    nop    nop     O
  012   '-'    '_'    us     us     '-'    '_'    us     us      O
  013   '='    '+'    nop    nop    '='    '+'    nop    nop     O
  014   bs     bs     del    del    bs     bs     del    del     O
  015   ht     btab   nop    nop    ht     btab   nop    nop     O
  016   'q'    'Q'    dc1    dc1    'q'    'Q'    dc1    dc1     C
  017   'w'    'W'    etb    etb    'w'    'W'    etb    etb     C
  018   'e'    'E'    enq    enq    'e'    'E'    enq    enq     C
  019   'r'    'R'    dc2    dc2    'r'    'R'    dc2    dc2     C
  020   't'    'T'    dc4    dc4    't'    'T'    dc4    dc4     C
  021   'y'    'Y'    em     em     'y'    'Y'    em     em      C
  022   'u'    'U'    nak    nak    'u'    'U'    nak    nak     C
  023   'i'    'I'    ht     ht     'i'    'I'    ht     ht      C
  024   'o'    'O'    si     si     'o'    'O'    si     si      C
  025   'p'    'P'    dle    dle    'p'    'P'    dle    dle     C
  026   '['    '{'    esc    esc    '['    '{'    esc    esc     O
  027   ']'    '}'    gs     gs     ']'    '}'    gs     gs      O
  028   cr     cr     nl     nl     cr     cr     nl     nl      O
  029   lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl   O
  030   'a'    'A'    soh    soh    'a'    'A'    soh    soh     C
  031   's'    'S'    dc3    dc3    's'    'S'    dc3    dc3     C
  032   'd'    'D'    eot    eot    'd'    'D'    eot    eot     C
  033   'f'    'F'    ack    ack    'f'    'F'    ack    ack     C
  034   'g'    'G'    bel    bel    'g'    'G'    bel    bel     C
  035   'h'    'H'    bs     bs     'h'    'H'    bs     bs      C
  036   'j'    'J'    nl     nl     'j'    'J'    nl     nl      C
  037   'k'    'K'    vt     vt     'k'    'K'    vt     vt      C
  038   'l'    'L'    ff     ff     'l'    'L'    ff     ff      C
  039   ';'    ':'    nop    nop    ';'    ':'    nop    nop     O
  040   '''    '"'    nop    nop    '''    '"'    nop    nop     O
  041   '`'    '~'    nop    nop    '`'    '~'    nop    nop     O
  042   lshift lshift lshift lshift lshift lshift lshift lshift  O
  043   '\'    '|'    fs     fs     '\'    '|'    fs     fs      O
  044   'z'    'Z'    sub    sub    'z'    'Z'    sub    sub     C
  045   'x'    'X'    can    can    'x'    'X'    can    can     C
  046   'c'    'C'    etx    etx    'c'    'C'    etx    etx     C
  047   'v'    'V'    syn    syn    'v'    'V'    syn    syn     C
  048   'b'    'B'    stx    stx    'b'    'B'    stx    stx     C
  049   'n'    'N'    so     so     'n'    'N'    so     so      C
  050   'm'    'M'    cr     cr     'm'    'M'    cr     cr      C
  051   ','    '<'    nop    nop    ','    '<'    nop    nop     O
  052   '.'    '>'    nop    nop    '.'    '>'    nop    nop     O
  053   '/'    '?'    nop    nop    '/'    '?'    nop    nop     O
  054   rshift rshift rshift rshift rshift rshift rshift rshift  O
  055   '*'    '*'    '*'    '*'    '*'    '*'    '*'    '*'     O
  056   lalt   lalt   lalt   lalt   lalt   lalt   lalt   lalt    O
  057   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O
 #058   clock  clock  clock  clock  clock  clock  clock  clock   O
  058   cr     clock  clock  clock  clock  clock  clock  clock   O
  059   fkey01 fkey13 fkey25 fkey37 scr01  scr11  scr01  scr11   O
  060   fkey02 fkey14 fkey26 fkey38 scr02  scr12  scr02  scr12   O
  061   fkey03 fkey15 fkey27 fkey39 scr03  scr13  scr03  scr13   O
  062   fkey04 fkey16 fkey28 fkey40 scr04  scr14  scr04  scr14   O
  063   fkey05 fkey17 fkey29 fkey41 scr05  scr15  scr05  scr15   O
  064   fkey06 fkey18 fkey30 fkey42 scr06  scr16  scr06  scr16   O
  065   fkey07 fkey19 fkey31 fkey43 scr07  scr07  scr07  scr07   O
  066   fkey08 fkey20 fkey32 fkey44 scr08  scr08  scr08  scr08   O
  067   fkey09 fkey21 fkey33 fkey45 scr09  scr09  scr09  scr09   O
  068   fkey10 fkey22 fkey34 fkey46 scr10  scr10  scr10  scr10   O
  069   nlock  nlock  nlock  nlock  nlock  nlock  nlock  nlock   O
  070   slock  slock  slock  slock  slock  slock  slock  slock   O
  071   fkey49 '7'    '7'    '7'    '7'    '7'    '7'    '7'     N
  072   fkey50 '8'    '8'    '8'    '8'    '8'    '8'    '8'     N
  073   fkey51 '9'    '9'    '9'    '9'    '9'    '9'    '9'     N
  074   fkey52 '-'    '-'    '-'    '-'    '-'    '-'    '-'     N
  075   fkey53 '4'    '4'    '4'    '4'    '4'    '4'    '4'     N
  076   fkey54 '5'    '5'    '5'    '5'    '5'    '5'    '5'     N
  077   fkey55 '6'    '6'    '6'    '6'    '6'    '6'    '6'     N
  078   fkey56 '+'    '+'    '+'    '+'    '+'    '+'    '+'     N
  079   fkey57 '1'    '1'    '1'    '1'    '1'    '1'    '1'     N
  080   fkey58 '2'    '2'    '2'    '2'    '2'    '2'    '2'     N
  081   fkey59 '3'    '3'    '3'    '3'    '3'    '3'    '3'     N
  082   fkey60 '0'    '0'    '0'    '0'    '0'    '0'    '0'     N
  083   del    '.'    '.'    '.'    '.'    '.'    boot   boot    N
  084   nop    nop    nop    nop    nop    nop    nop    nop     O
  085   nop    nop    nop    nop    nop    nop    nop    nop     O
  086   nop    nop    nop    nop    nop    nop    nop    nop     O
  087   fkey11 fkey23 fkey35 fkey47 scr11  scr11  scr11  scr11   O
  088   fkey12 fkey24 fkey36 fkey48 scr12  scr12  scr12  scr12   O
  089   cr     cr     nl     nl     cr     cr     nl     nl      O
  090   rctrl  rctrl  rctrl  rctrl  rctrl  rctrl  rctrl  rctrl   O
  091   '/'    '/'    '/'    '/'    '/'    '/'    '/'    '/'     N
  092   nscr   nscr   debug  debug  nop    nop    nop    nop     O
  093   ralt   ralt   ralt   ralt   ralt   ralt   ralt   ralt    O
  094   fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49  O
  095   fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50  O
  096   fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51  O
  097   fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53  O
  098   fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55  O
  099   fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57  O
  100   fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58  O
  101   fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59  O
  102   fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60 fkey60  O
  103   fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot   fkey61  O
  104   slock  saver  slock  saver  susp   nop    susp   nop     O
  105   fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62  O
  106   fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63  O
  107   fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64  O
  108   nop    nop    nop    nop    nop    nop    nop    nop     O

  dgra  '`'  ( 'a' 224 ) ( 'A' 192 ) ( 'e' 232 ) ( 'E' 200 )
             ( 'i' 236 ) ( 'I' 204 ) ( 'o' 242 ) ( 'O' 210 )
             ( 'u' 249 ) ( 'U' 217 )
  dacu  180  ( 'a' 225 ) ( 'A' 193 ) ( 'e' 233 ) ( 'E' 201 )
             ( 'i' 237 ) ( 'I' 205 ) ( 'o' 243 ) ( 'O' 211 )
             ( 'u' 250 ) ( 'U' 218 ) ( 'y' 253 ) ( 'Y' 221 )
  dcir  '^'  ( 'a' 226 ) ( 'A' 194 ) ( 'e' 234 ) ( 'E' 202 )
             ( 'i' 238 ) ( 'I' 206 ) ( 'o' 244 ) ( 'O' 212 )
             ( 'u' 251 ) ( 'U' 219 )
  dtil  '~'  ( 'a' 227 ) ( 'A' 195 ) ( 'n' 241 ) ( 'N' 209 )
             ( 'o' 245 ) ( 'O' 213 )
  duml  168  ( 'a' 228 ) ( 'A' 196 ) ( 'e' 235 ) ( 'E' 203 )
             ( 'i' 239 ) ( 'I' 207 ) ( 'o' 246 ) ( 'O' 214 )
             ( 'u' 252 ) ( 'U' 220 ) ( 'y' 255 )
  drin  176  ( 'a' 229 ) ( 'A' 197 )
  dced  184  ( 'c' 231 ) ( 'C' 199 )

 

有了这个文件之后,可以用kbdcontrol命令重新导入:

kbdcontrol -l /root/no_enter.map

现在可以试试大写键是否可以当回车来用了。

由于我需要开机后登录前就需要新的映射生效,因此在/etc/rc.conf文件中加入下面一行:

keymap=”/root/no_enter.map”

这样以后开机新映射就自动生效了。

2. X环境下的修改

X环境下键的映射可由xmodmap命令完成。可以将下面一行加入到自己的.profile文件中:

## to fix the broken Enter key :-(
[[ -n $DISPLAY ]] && (xmodmap -e "remove Lock = Caps_Lock";xmodmap -e "keycode 66 = Return")

其中的”keycode 66″就是原来的大写键的代码。如果你不确定这个代码的话,可以运行xev命令来查看。
此命令对xterm有效(没测试过其它X下的程序)。

Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar