「分享」通过AHK实现CapsLock切换输入法(Rime)的中英文状态

由于目前在通过 Shift 切换输入法遇到了点问题,索性通过 AutoHotkey 把闲置的 CapsLock 键利用起来。

主要需求:

  1. 单击 CapsLock 时,如果在 Emacs中,则映射到 F9, 执行 sis-switch 通过 w32-get-ime-open-status 切输入法的中英文状态。如果不在 Emacs中,则映射为右Shift键(LShift),直接由小狼毫(Weasel)切换中英文状态。

  2. 双击或者长按 CapsLock时,切换大小写状态。(macOS 默认的也是长按 CapsLock,保持换设备时一致的体验)

其实双击可以邦定到其他更加有用的功能,目前还没想好。

AHK (v2)代码如下, 希望对 Emacs 用户有点用:

;; Toggle Chinese and English input method in Emacs

$CapsLock::
{
global
	SetStoreCapsLockMode(false)
	ErrorLevel := !KeyWait("CapsLock", "T0.25")
	if ErrorLevel ;; Long press
		Send("{CapsLock}")
	else
	{
		ErrorLevel := !KeyWait("CapsLock", "D T0.5")
		if ErrorLevel  ;; Single click
		{
			If WinActive("ahk_exe emacs.exe")
				Send("{f9}")
			else
				Send("{RShift}")
		}
		else  ;; Double click
			Send("{CapsLock}")
	}
	ErrorLevel := !KeyWait("CapsLock")
return
}

这是个人的 AHK 配置,实现了在 Windows 系统都用 Emacs 按键

4 个赞

虽然不在 Windows 下用 Emacs,但还是点赞支持。

AHK 在 Windows 下简直就是神器中的神器。

感谢分享,ahk 辅助输入法确实方便,以前用 ahk 搓过一个 esc 强行更改微软输入法为英文的脚本,用 vim 系软件的时候巨爽

直到微软某次更新后脚本失效,我在不断拖延重构脚本的后续几个月慢慢习惯了自己切输入法

不建议使用 AHK ,我的 AHK 脚本已经废弃掉了,太浪费时间,可以直接用微软的 PowerToys 做映射,又好又快,还有很多其他好用小组件。

1 个赞

powertoys 目前只适合简单映射,op 这种带双击和长按的需求是处理不了的 :joy:

PowerToys 我也试过,不过它连把 Shift 映射为 Ctrl + 12 都做不到。

我也是用ahk实现的capslock切换中英输入法。

我的实现方式是在搜狗中文输入法和微软英文输入法之间切换, windows里可以设置C-f11来切换输入法, 然后我再把capslock映射到C-f11上

原来的版本因为加了双击功能,有点小问题:会造反按了 CapsLock 后需要等待一会儿输入法才切换。

下面的AutoHotkey实现完全没问题了:

;; Toggle Chinese and English input method in Emacs

$CapsLock::
{
    global
    SetStoreCapsLockMode(false)
    pressTime := A_TickCount  ; 记录按下时间
    KeyWait("CapsLock") ; 等待按键释放

    ; 计算按住时长
    holdDuration := A_TickCount - pressTime
    if (holdDuration > 250)  ; 长按超过250ms,当作大写锁定
    {
        Send("{CapsLock}")
    }
    else  ; 短按,立即切换输入法
    {
        If WinActive("ahk_exe emacs.exe")
            Send("{f9}")
        else
            Send("{RShift}")
    }
    return
}

另外,在 Linux 下我也通过 xremap 实现了同样功能。 体验上和 macbook 上的大小写键切换中英文体验一样了。

# Configuration for xremap on Linux
# https://github.com/xremap/xremap
modmap:
  - name: CapsLock tap -> toggle Input Method in Emacs, hold -> CapsLock toggle
    application:
      only: emacs
    remap:
      CapsLock:
        held: KEY_CAPSLOCK
        alone: F9

  - name: CapsLock tap -> toggle Input Method in other Apps, hold -> CapsLock toggle
    application:
      not: emacs
    remap:
      CapsLock:
        held: KEY_CAPSLOCK
        alone: [KEY_LEFTCTRL, KEY_LEFTSHIFT]
2 个赞