如何模拟 linux 中的集成数字小键盘光标键

How to emulate integrated numeric keypad cursor keys in linux

在许多旧笔记本电脑和一些小型键盘上,主键盘区域有一个 integrated numeric keypad。这个备用键盘是用左 Ctrl 键旁边的特殊 'Fn' 键激活的。

作为一名程序员,我学会了使用光标移动键(箭头、PgUp、PgDn 等),发现它大大提高了我的编程速度。而且这些好处并不像使用专用快捷键那样仅限于单个应用程序。

在传统的 PC 键盘上,'Windows Key' 可用于模拟 'Fn' 键和相应的集成数字小键盘。我以前用MS Windows的时候发现Autohotkey was able to map the keys using a simple script.

最近我了解了 xkb 以及它如何用于

什么是将 windows 键用作 fn 键来模拟集成数字小键盘的 xkb 键盘映射配置文件?

提示(?):我怀疑该文件看起来很像 Debian 衍生 linux 发行版上的“/usr/share/X11/xkb/symbols/keypad”文件。此 'keypad' 文件包含在“/usr/share/X11/xkb/symbols/pc”文件的顶部。

corresponding autohotkey script供参考(#==WinKey):

#8::Up
#k::Down
#u::Left
#o::Right

#7::Home
#j::End
#9::PgUp
#l::PgDn

#m::Insert
#.::Delete

;(Scroll with the left-over keys)
#i::WheelUp
#,::WheelDown

请注意,所有这些键都需要与 Ctrl、Alt、Shift 以及 Windows 键的任意组合一起使用。

在 Linux / XKB 中的主键盘上安装类似数字小键盘的光标键的步骤...

  1. xkbcomp $DISPLAY original.xkb(以防万一;)
  2. xkbcomp $DISPLAY custom.xkb
  3. 编辑custom.xkb
  4. 在部分末尾添加以下内容:xkb_types“...”{

    type "WinKeyAsFnKey" {
      modifiers = Shift+Super;
      map[Shift] = level2;
      map[Super] = level3;
      map[Super+Shift] = level3;
      level_name[Level1] = "Base";
      level_name[Level2] = "Caps";
      level_name[Level3] = "Fn";
    };
    
  5. 在 xkb_symbols 部分末尾添加以下内容“...” {

     key <AE07> {type="WinKeyAsFnKey",symbols[Group1]=[7,ampersand,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<HOME>,clearmods=Super)]};
     key <AE08> {type="WinKeyAsFnKey",symbols[Group1]=[8,asterisk,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<UP>,clearmods=Super)]};
     key <AE09> {type="WinKeyAsFnKey",symbols[Group1]=[9,parenleft,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<PGUP>,clearmods=Super)]};
     key <AD07> {type="WinKeyAsFnKey",symbols[Group1]=[u,U,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<LEFT>,clearmods=Super)]};
     key <AD09> {type="WinKeyAsFnKey",symbols[Group1]=[o,O,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<RGHT>,clearmods=Super)]};
     key <AC07> {type="WinKeyAsFnKey",symbols[Group1]=[j,J,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<END>,clearmods=Super)]};
     key <AC08> {type="WinKeyAsFnKey",symbols[Group1]=[k,K,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<DOWN>,clearmods=Super)]};
     key <AC09> {type="WinKeyAsFnKey",symbols[Group1]=[l,L,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<PGDN>,clearmods=Super)]};
     key <AB07> {type="WinKeyAsFnKey",symbols[Group1]=[m,M,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<INS>,clearmods=Super)]};
     key <AB09> {type="WinKeyAsFnKey",symbols[Group1]=[period,greater,NoSymbol],actions=[NoAction(),NoAction(),RedirectKey(key=<DELE>,clearmods=Super)]};
    
  6. 保存custom.xkb

  7. xkbcomp custom.xkb $DISPLAY

我仍在使用 'i' 和 ',' 处理鼠标滚动。

编辑: 上面的解决方案 not 与 Google Chrome 和基于 Chrome 的应用程序(如 Slack)配合得很好。

替代方法是使用可编程键盘。我使用 after-market PCB for a CoolerMaster Masterkeys S keyboard. The Easy AVR layout is available online(虽然目前左侧的 win 键现在不能单独使用...我使用右侧的)。