我的改建脚本, 使用 kanata适用于windows/linux/macOS系统
改键最需要实现的功能是
- 同时按下
CapsLock+其他键
, remap成LCtrl+其他键
; 反之, 单按CapsLock
键为Esc
键; 单按Esc
键为CapsLock
键 - 同时按下
Enter+其他键
, remap成RCtrl+其他键
; 反之, 单按Enter
键就是Enter
- remap
shift+Backspace
为delete
- vscode + vim plugin搭配 [im-select](daipeihust/im-select: Switch your input method through terminal) , 注意: im-select只有windows和macOS支持, 而Linux 可以使用 [fcitx-remote](daipeihust/im-select: Switch your input method through terminal)
- ha/vim-xkbswitch: vim plugin for automatic keyboard layout switching in insert mode (github.com)
- vim切换规则
- 只有在insert state输入中文, 所以在normal state切换到中文输入法应该自动进入 insert state
- 在 insert state里关闭输入法的目的可能是要输入英文, 所以应该呆在 insert state
- 在 insert state按 Esc 键, 意味着切换回 Normal state, 这时自动关闭输入法
有很方便的工具改键工具 Karabiner Elements. 其特性有
- 很方便设置, 很容易上手
- 可以导出设置
- 有多个profile, 比如一个是默认无修改的(方便别人使用自己的键盘), 一个是有修改
- 可以针对不同的键盘(自带键盘, usb外接键盘)分别配置方案
方案1:kanata
- windows下该软件的实现原理和power toys一样,通过截获键盘挂钩实现的:同时也支持从driver层改键,这样就能支持remote desktop
- linux下该方法从驱动层实现,功能强大。
注意:kanata为了能从系统层面hook按键,安装了相关的driver interception
如果需要卸载这个driver,那么管理员权限进入 interception/command line installer
目录
install-interception.exe /install
然后重启 有时,在笔记本上多次睡眠模式重启之后会出现键盘实效的情况,重启笔记本即可。
使用:不再使用 。使用 kanata_winterept_cmd_allowed.exe
,从shell cmd启动kanata_gui_winterept_cmd_allowed.exe
,直接刷机启动GUI版,其会读取当前目录下kanata.kbd
,然后以状态栏图标显示,无需cmd窗口。
建议:把kanata_gui_winterept_cmd_allowed.exe
的快捷方式放在%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
中,这样开机会自动启动
实现的功能有:
- 左ctrl改为CapsLock
- CapsLock改为,在组合按键的时候改为左ctrl,单按为Esc
- Enter,在组合按键时改为右Ctrl,单按为Enter
- Alt + I 切换输入法
- Alt + Backspace 实现Delete功能,即后删除
- Alt + J Down方向键
- Alt + K UP方向键
- Alt + L Right方向键
- Alt + H Left方向键
- Alt + E End键
- Alt + A Home键
- Alt + W 下一个word开始
- Alt + B 上一个word开始
方案2:[AutoHotkey] Autohotkey自动切换输入法
实现的功能有:
- 左Ctrl切换大小写
- CapsLock单按是Esc键,和其他键组合是左Ctrl键
- Enter单按是Enter, 和其他键组合是右Ctrl键
- 在QQ/weixin等工具里面使用中文输入法,在其他编辑器中使用英文输入法
开机启动:把main.ahk
的快捷方式放在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
- 缺点:对Remote Desktop Connection中的远程系统无效
方案3: sharpkeys修改全局的注册表,可以导出配置。缺点有2
1 全局方案, 不能根据不同的软件配置不同的remap 2 写入了注册表, 所以需要重启/重新登陆 3 最大的缺点: 只能单键映射单键, 无法多键映射
方案4:uncap
参考: 「AutoHotkey 之美」内容导读 基于AutoHotkey的脚本录制工具
方案5:[废弃]kmonad
废弃的原因
- 项目长久没有更新,用haskell语言实现的也不会修改
- 相比于kanata在windows terminal下会导致按键错乱,也不支持remote deskop。
Linux系统,每个输入设备(ls -l /dev/input)都有如下过程 /keyboard -> scancode -> /input driver -> keycode -> /X server XKB -> keysym
没有比得上 Karabiner Elements 的方案, 也没有 Autohotkeys 类似的方案;
实在不得已的方法, 使用以下工具
linux的一些命令
# 查看virtual keyboard
xinput --list
/dev/input/event*
的一些介绍
https://unix.stackexchange.com/questions/478638/laptop-keyboard-drivers-event-handlers-in-linux
xmodmap功能很强大,支持windows/linux/macOS,单键多键改键,vim式按键等等。 xmodmap在linux下是通过kernel层input server的交互才完成的改键,而xrdp是直接把按键转递给X server, 故不能用xmodmap
通过xev工具获取keycode编码,比如
Enter,keycode 36; CapsLock keycode 66; Esc keycode 9
此处的keycode是10进制的
通过命令xmodmap -pm
查看所有修饰符,执行改键之前
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
改键之后
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x9)
control Control_L (0x25), Control_R (0x6d)
显然,把Esc keycode 9改成CapsLock键了
清除所有的改键,要么重启,要么执行 setxkbmap -option ''
linux最终改键方案:
使用脚本./remap_keys.sh
, 每次启动时 sh ./remap_keys.sh