全平台实现Caps Lock切换输入法

效果

  • Caps Lock 为输入法切换健
  • Shift + Caps Lock 为大写锁定健 (macOS 可长按 Caps Lock)

macOS

系统设置->键盘->输入法->使用大写锁定键切换ABC。

Win

已知:Win+Space为切换键盘布局

  1. 下载 AutoHotkey 并安装:官网
  2. 在桌面右键->新建 AutoHotkey Script,可命名为CapsLockToWinSpace.ahk
  3. 右键点击 CapsLockToWinSpace.ahk -> Edit Script,会自动打开记事本,替换为以下内容并保存。
Capslock::
Send {LWIN down}{space down}
KeyWait, Capslock  ; Wait for user to physically release it.
Send {LWIN up}{space up}
SetCapsLockState, off ; set caps lock off because holding the key would enable caps lock
return
  1. 双击运行CapsLockToWinSpace.ahk,测试CapsLock键功能。
  2. 设置开机运行
    • 将CapsLockToWinSpace.ahk移动到安全的位置,防止误删,比如 D:/Apps/CapsLockToWinSpace.ahk
    • 在新位置右键复制 CapsLockToWinSpace.ahk
    • 打开文件管理器,在地址栏输入shell:startup,回车Enter
    • 右键粘贴快捷方式

Linux

1 查看keycode

执行xmodmap -pke | grep Caps, 得到Caps_Lock键的keycode为66

[xcp@127 ~]$ xmodmap -pke | grep Caps

keycode  66 = Caps_Lock NoSymbol Caps_Lock

2 通过setxkbmap将Caps_Lock设为Control_R

之所以要用setxkbmap而不是只用xmodmap,是因为ibus和fctix对于xmodmap存在兼容性问题

执行setxkbmap -print,通过xkb_symbols后面的项可知当前keymap为pc

[xcp@127 ~]$ setxkbmap -print
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+us+inet(evdev)"     };
        xkb_geometry  { include "pc(pc104)"     };
};

修改对应的keymap

sudo cp /usr/share/X11/xkb/symbols/pc /usr/share/X11/xkb/symbols/pc.bak
sudo vim /usr/share/X11/xkb/symbols/pc

将CAPS所在行的Caps_Lock改为Control_R

key <CAPS> {        [ Control_R             ]       };

注销,重新登录

3 xmodmap实现Shift+Caps_Lock为Caps_Lock

再次查看第一项所得到的keycode 66,发现其内容发生了变化

[xcp@127 ~]$ xmodmap -pke | grep 66
keycode  66 = Control_R NoSymbol Control_R

添加.Xmodemap

touch ~/.Xmodmap

将keycode 66那一行的新配置复制到里面,并且将NoSymbol修改为Caps_Lock,保存。

keycode  66 = Control_R Caps_Lock Control_R

执行xmodmap ~/.Xmodmap后测试Caps_Lock和Shift+Caps_Lock的功能。

4 在fctix或ibus中设置右Ctrl为输入法切换键