linux下vmware workstation的键盘映射问题

长久以来,在 Linux 使用 vmware 总是有个问题没有解决。

当在 Linux 里把 Ctrl 和 CapsLock 这两个键互换后,vmware 的虚拟机里并不会跟着一起换,而依旧是原来的键位。而同样的问题在 Windows 下就不存在。

vmware 的官方文档解释:

Workstation Player 可通过检查当前的 X 键映射确定要使用的表。但这种决策过程有时也会失败。另外,每个映射都是固定的,不保证对任何给定的键盘和 X 按键代码-键盘符号映射都正确无误。例如,如果用户使用 xmodmap 互换 Ctrl 和 CapsLock 按键,那么在使用远程服务器时虚拟机中的按键将互换(键盘符号映射),但在使用本地服务器时将取消互换(按键代码映射)。为了修正此问题,您必须在 Workstation Player 中重新映射按键。

也就是说,在本机上修改了键位后,远程连接到 vmware 虚拟机里是正常的,但是在本机上的虚拟机里则不能使用。

解决方案

官方给出的解决方案是:

查看特定键位的值

使用xev或者xmodmap -pk查看 Ctrl 和 CapsLock 的键位值

几个常用的按键的键值如下:

  • Left Ctrl 键值是 66
  • CapsLock 键值是 37
  • Left ALT 键值是 133
  • Left Win 键值是 64

查看键位对应的 V-Scan 值

需要到V-Scan Code Table去查看。

这里直接告诉大家:

  • Left Ctrl 的值是 0x01d
  • CapsLock 的值是 0x03a
  • Left ALT 的值是 0x038
  • Left Win 的值是 0x15b

添加配置文件

~/.vmware/config(没有就新建一个)里添加如下配置:

1
2
xkeymap.keycode.66 = 0x01d
xkeymap.keycode.37 = 0x03a

针对mac:如果你的主键盘布局是mac的,那么left alt和left win键也做了交换。此时需要仿照上面配置做相应设定:

1
2
xkeymap.keycode.133 = 0x038
xkeymap.keycode.64 = 0x15b

至此,工作全部完成,vmware 里的虚拟机可以使用和 Host 一样的键位设置了。

踩过的大坑

这么简单的一个问题,官方文档有明确的说明了,为什么拖了好几年没解决呢?

主要问题有两个:

  1. 官方的文档里说,更改健位值的两行代码,加在虚拟机配置文件里(.vmx)或者~/.vmware/config都可以,其实不对。这两行代码只能加在~/.vmware/config,加在其他地方不起作用。这个坑是长期未解决此问题的主要原因。

  2. 添加这两行配置后,必须重新启动系统,才能让修改生效。