Skip to content

windows/linux/macOS keyboard remaps and shortcuts

Notifications You must be signed in to change notification settings

tainzhi/KeyboardRemaps

Repository files navigation

info

我的改建脚本, 使用 kanata适用于windows/linux/macOS系统

一些auto hotkeys基本知识

关于改键

改键最需要实现的功能是

  • 同时按下CapsLock+其他键, remap成 LCtrl+其他键; 反之, 单按CapsLock键为Esc键; 单按Esc键为CapsLock
  • 同时按下Enter+其他键, remap成 RCtrl+其他键; 反之, 单按 Enter 键就是 Enter
  • remap shift+Backspacedelete

vim切换中英文

  • 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, 这时自动关闭输入法

MacOS

有很方便的工具改键工具 Karabiner Elements. 其特性有

  • 很方便设置, 很容易上手
  • 可以导出设置
  • 有多个profile, 比如一个是默认无修改的(方便别人使用自己的键盘), 一个是有修改
  • 可以针对不同的键盘(自带键盘, usb外接键盘)分别配置方案

Windows(在远程桌面也能生效)

方案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

废弃的原因

  1. 项目长久没有更新,用haskell语言实现的也不会修改
  2. 相比于kanata在windows terminal下会导致按键错乱,也不支持remote deskop。

linux

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

About

windows/linux/macOS keyboard remaps and shortcuts

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published