您尚未登录。

#1 2022-03-16 16:27:07

yowl
会员
注册时间: 2021-11-10
帖子: 9

小配列键盘怎么实现f1~f12的重新映射?

咳咳 第一次在这里发帖吧好像 最近刚换了一个60配列的键盘 61键位的 一上手傻眼了 右下角的fn键离默认的方向键wasd太远 一只手够不着 就想把capslock改成fn2 修改了一下/usr/share/X11/xkb/symbols/{pc,us} 整体实现了Mode_switch+n =fn 功能 但是f1~f12效果却不理想 不知道为什么有的软件可以 有的就没反应 比如同为终端 gnome-terminal按f11可以全屏放大 而guake就只有原生的才行 游戏我的世界也这样 现在不知道怎么办了 附上修改的配置文件 求助论坛大佬
pc文件修改段
default partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {

    key <ESC>  {    [ Escape,    grave    ],    [    asciitilde    ]    };   

    // The extra key on many European keyboards:
    key <LSGT> {    [ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {    [ backslash,    bar    ]    };
    key <SPCE> {    [      space        ]    };

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {    [ BackSpace, BackSpace    ]    };

    key  <TAB> {    [ Tab,    ISO_Left_Tab    ]    };
    key <RTRN> {    [ Return        ]    };

    key <CAPS> {    [ Mode_switch        ]    };         #这里改了大写键
    key <NMLK> {    [ Num_Lock         ]    };

    key <LFSH> {    [ Shift_L        ]    };
    key <LCTL> {    [ Control_L        ]    };
    key <LWIN> {    [ Super_L        ]    };

    key <RTSH> {    [ Shift_R        ]    };
    key <RCTL> {    [ Control_R        ]    };
    key <RWIN> {    [ Super_R        ]    };
    key <MENU> {    [ Menu            ]    };

us文件修改段
default partial alphanumeric_keys modifier_keys
xkb_symbols "basic" {

    name[Group1]= "English (US)";

    key <TLDE> {    [     grave,    asciitilde    ]    };
    key <AE01> {    [      1,    exclam         ], [    F1     ]    };             #这里就是f1~f12的位置 与原生的keycode不同 但keysym是相同的
    key <AE02> {    [      2,    at        ], [    F2     ]    };
    key <AE03> {    [      3,    numbersign    ], [    F3     ]    };
    key <AE04> {    [      4,    dollar        ], [    F4     ]    };
    key <AE05> {    [      5,    percent        ], [    F5     ]    };
    key <AE06> {    [      6,    asciicircum    ], [    F6     ]    };
    key <AE07> {    [      7,    ampersand    ], [    F7     ]    };
    key <AE08> {    [      8,    asterisk    ], [    F8     ]    };
    key <AE09> {    [      9,    parenleft    ], [    F9     ]    };
    key <AE10> {    [      0,    parenright    ], [    F10     ]    };
    key <AE11> {    [     minus,    underscore    ], [    F11     ]    };
    key <AE12> {    [     equal,    plus        ], [    F12     ]    };

    key <AD01> {    [      q,    Q         ]    };
    key <AD02> {    [      w,    W        ],   [    Up       ]    };
    key <AD03> {    [      e,    E        ]    };
    key <AD04> {    [      r,    R        ]    };
    key <AD05> {    [      t,    T        ]    };
    key <AD06> {    [      y,    Y        ]    };
    key <AD07> {    [      u,    U        ]    };
    key <AD08> {    [      i,    I        ]    };
    key <AD09> {    [      o,    O        ]    };
    key <AD10> {    [      p,    P        ]    };
    key <AD11> {    [ bracketleft,    braceleft    ],    [   Insert  ]    };
    key <AD12> {    [ bracketright,    braceright    ],  [   Delete  ]    };

    key <AC01> {    [      a,    A         ],  [    Left    ]    };
    key <AC02> {    [      s,    S        ],   [    Down    ]    };
    key <AC03> {    [      d,    D        ],   [    Right    ]    };
    key <AC04> {    [      f,    F        ]    };
    key <AC05> {    [      g,    G        ]    };
    key <AC06> {    [      h,    H        ]    };
    key <AC07> {    [      j,    J        ]    };
    key <AC08> {    [      k,    K        ]    };
    key <AC09> {    [      l,    L        ]    };
    key <AC10> {    [ semicolon,    colon        ], [   Home    ]    };
    key <AC11> {    [ apostrophe,    quotedbl    ],  [   End     ]    };

    key <AB01> {    [      z,    Z         ]    };
    key <AB02> {    [      x,    X        ]    };
    key <AB03> {    [      c,    C        ]    };
    key <AB04> {    [      v,    V        ]    };
    key <AB05> {    [      b,    B        ]    };
    key <AB06> {    [      n,    N        ]    };
    key <AB07> {    [      m,    M        ]    };
    key <AB08> {    [     comma,    less        ]    };
    key <AB09> {    [    period,    greater        ],   [   Prior   ]    };
    key <AB10> {    [     slash,    question    ],   [   Next    ]    };

    key <BKSL> {    [ backslash,         bar    ]    };
};

离线

#2 2022-03-18 17:50:27

ifnk
会员
注册时间: 2021-01-25
帖子: 93

Re: 小配列键盘怎么实现f1~f12的重新映射?

安装 x 环境了么? 装了 x 环境的话 ,试试看 xkeysnail   https://github.com/mooz/xkeysnail

大概示例是这样 子 

config.py

# -*- coding: utf-8 -*-

import re
from xkeysnail.transform import *

# 先将大小写转换键替换成点击esc,长按为右 ctrl 键
define_multipurpose_modmap(
    {
        # caps
        Key.CAPSLOCK: [Key.ESC, Key.RIGHT_CTRL],
    }
)

# 全局 映射
define_keymap(None, {

    K("RC-a"): K("F1"),
    K("RC-s"): K("F2"),
    K("RC-d"): K("F3"),
})
# chrome 映射
define_keymap(re.compile("Google-chrome"), {


}, " Chrome")


然后执行  sudo xkeysnail config.py 试试看

最近编辑记录 ifnk (2022-03-18 17:50:59)

离线

#3 2022-03-19 09:03:46

yowl
会员
注册时间: 2021-11-10
帖子: 9

Re: 小配列键盘怎么实现f1~f12的重新映射?

感谢分享 基本解决了头疼的方向键问题 其他的还没敢动 担心会破坏之前的配置 我看作者的issue.里说不支持mode_switch键 现在有点纠结
# -*- coding: utf-8 -*-

import re
from xkeysnail.transform import *

define_timeout(1)
define_multipurpose_modmap( {
    Key.LEFT_SHIFT:    [Key.UP, Key.LEFT_SHIFT],
    Key.LEFT_CTRL:    [Key.LEFT, Key.LEFT_CTRL],
    Key.LEFT_META:    [Key.DOWN, Key.LEFT_META],
    Key.LEFT_ALT:    [Key.RIGHT, Key.LEFT_ALT]
}
)

define_keymap(re.compile("firefox"), {

}, "firefox")

离线

#4 2022-03-19 10:30:09

ifnk
会员
注册时间: 2021-01-25
帖子: 93

Re: 小配列键盘怎么实现f1~f12的重新映射?

yowl 说:

感谢分享 基本解决了头疼的方向键问题 其他的还没敢动 担心会破坏之前的配置 我看作者的issue.里说不支持mode_switch键 现在有点纠结
# -*- coding: utf-8 -*-

import re
from xkeysnail.transform import *

define_timeout(1)
define_multipurpose_modmap( {
    Key.LEFT_SHIFT:    [Key.UP, Key.LEFT_SHIFT],
    Key.LEFT_CTRL:    [Key.LEFT, Key.LEFT_CTRL],
    Key.LEFT_META:    [Key.DOWN, Key.LEFT_META],
    Key.LEFT_ALT:    [Key.RIGHT, Key.LEFT_ALT]
}
)

define_keymap(re.compile("firefox"), {

}, "firefox")

你说的 mode_switch 是指 fn 么?  fn 当然不能映射啦 , 我的意思 是 你可以 转换下思路  ,
你 的 右 ctrl  win alt 是不是很少按 ?
我上面代码的例子就 是 把 capslock 单按 为 发送 esc 键 ,如果 capslock +  x (任意键) 则为 发送  右 ctrl + x (任意键) 

接着 在 定义  右 ctrl +  x (任意键)  映射 ,这里 我 映射了  右 ctrl +  a s d  为 发送  f1 f2 f3 键 ,

就是说 我这个  相当于 把 capslock  当作 fn 键了 caps +  a s d  为发送  f1 f2 f3  呀 



https://gitee.com/ifnk/archconfig/blob/master/config.py 

这是我的配置 
分号 +  x (字母键)  为 发送 那些 难打的符号  比如 (_?()!$=\'+-) 这些 

引号 + x (字母键)  为 发送  win +  1 2 3 4 5 6 7 8 9  快速切换 虚拟桌面 (我用 i3wm )

caps +  p n b f  为 发送 方向键 上下左右 

tab +  x(字母键) 为 发送  ctrl  +  x (字母键) 

我这里 映射了 4 个 修饰键 ( 即可以单按 也可以 和别的键组合 按 )

相当于 自定义了  fn1 fn2 fn3 fn4 

你为什么还会纠结  fn 呢?

离线

#5 2022-03-25 13:42:20

yowl
会员
注册时间: 2021-11-10
帖子: 9

Re: 小配列键盘怎么实现f1~f12的重新映射?

就这样吧 不想搞得太复杂 尽量保留原位 只是按个人习惯把左shift上提了一位
# -*- coding: utf-8 -*-

import re
from xkeysnail.transform import *

define_timeout(1)
define_multipurpose_modmap({
    #设置短按左手控制区为独立的方向键区
    Key.LEFT_SHIFT:    [Key.UP, Key.RIGHT_ALT], #设置长按为fn2
    Key.LEFT_CTRL:    [Key.LEFT, Key.LEFT_CTRL],
    Key.LEFT_META:    [Key.DOWN, Key.LEFT_META],
    Key.LEFT_ALT:    [Key.RIGHT, Key.LEFT_ALT],   
    #设置左右对称的left_alt为fn2键
    Key.CAPSLOCK:    [Key.F13, Key.LEFT_SHIFT], #短按切换输入法 长按左上档键
    Key.BACKSLASH:    [Key.BACKSLASH, Key.RIGHT_ALT],   
})
   
#全局 映射
define_keymap(None, {
    K("RM-w"): K("up"),
    K("RM-a"): K("left"),
    K("RM-s"): K("down"),
    K("RM-d"): K("right"),
    K("RM-esc"): K("grave"),
    K("RM-key_1"): K("F1"),
    K("RM-key_2"): K("F2"),
    K("RM-key_3"): K("F3"),
    K("RM-key_4"): K("F4"),
    K("RM-key_5"): K("F5"),
    K("RM-key_6"): K("F6"),
    K("RM-key_7"): K("F7"),
    K("RM-key_8"): K("F8"),
    K("RM-key_9"): K("F9"),
    K("RM-key_0"): K("F10"),
    K("RM-minus"): K("F11"),
    K("RM-equal"): K("F12"),
    K("RM-left_brace"): K("insert"),
    K("RM-right_brace"): K("delete"),
    K("RM-semicolon"): K("home"),
    K("RM-apostrophe"): K("end"),
    K("RM-dot"): K("page_up"),
    K("RM-slash"): K("page_down"),
    K("F13"): K("C-space"),
    K("RM-F13"): K("capslock"),
})

离线

#6 2022-03-29 10:32:01

yowl
会员
注册时间: 2021-11-10
帖子: 9

Re: 小配列键盘怎么实现f1~f12的重新映射?

在小众软件上看到一个kmonad 支持跨平台跟切层 所以xkeysnail就放弃了
配置如下:
(defcfg
  ;; For Linux
  input  (device-file "/dev/input/by-id/usb-BY_Tech_Gaming_Keyboard-event-kbd")
  output (uinput-sink "My KMonad kbd")
 
  ;; For Windows
  ;; input  (low-level-hook)
  ;; output (send-event-sink)

  ;; For MacOS
  ;; input  (iokit-name "my-keyboard-product-string")
  ;; output (kext)
)

(defsrc
  esc  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  caps  a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  lctl lmet lalt           spc            ralt cmp rctl
)

(defalias
  upft (tap-hold 200 up lsft)
  lect (tap-hold 200 left lctl)
  dome (tap-hold 200 down lmet)
  rial (tap-hold 200 rght lalt)
)

(deflayer default
  grv   1   2   3   4   5   6   7   8   9   0   -   =    bspc
  tab   q    w    e    r    t    y    u    i    o    p    [    ]   \
  @fcap   a    s    d    f    g    h    j    k    l    ;    '    @fret
  @upft   z    x    c    v    b    n    m    ,    .    /    rsft
  @lect @dome @rial           @spc            ralt rmet rctl
)

(defalias
  spc (tap-hold 200 spc (layer-toggle space))

)

(deflayer space
  _    _    _    _    _    _    _    _    _    _    _    _    _    _
  _    _    _    _    _    _    _    _    _    _    _    _    _    _
  _    _    _    _    _    _    _    _    _    _    _    _    _
  up    _    _    _    _    _    _    _    _    _    _    _
  left  down  rght              _              _   _   _
)

(defalias
  fcap (tap-hold 200 C-A-spc (layer-toggle taba))
  fret (tap-hold 200 ret (layer-toggle taba))
)

(deflayer taba
esc  f1  f2   f3   f4   f5   f6   f7   f8   f9   f10   f11  f12    _
  _  del  ins    _    _    _    _    _    _    _    _   ins   del    _
  _  end   home    _    _    _    _    _    _    _    home   end   _
  _  pgdn  pgup   _    _    _    _    _    _    pgup  pgdn   _
  _    _    _              _              _    _    _
)

离线

页脚