分享个 windows 下模拟 macOS 键位的 autohotkey 脚本

4 条回复
26 次浏览

工作经常在 windows 和 macOS 来回切,有一些按键习惯会对不上

比如:

  • windows 切换窗口是 alt+tab,macOS 是 cmd+tab
  • macOS 用cmd+⬆️⬇️➡️⬅️可以导航输入光标,配合shiftbackspace等可以按导航、选中、删除,windows 下是home``end

下面是我常用的 autoHotkey 脚本,用在 windows 上以模仿 macOS 的行为,每个人的需求各不相同,仅供参考

1. 基本文本导航能力

复制
; ==== 基本文本导航能力 ====

; 1. Ctrl+左箭头 → Home(行首)
^Left::Send "{Home}"

; 2. Ctrl+右箭头 → End(行尾)
^Right::Send "{End}"

; 3. Alt+左箭头 → Ctrl+左箭头(单词跳转)
!Left::Send "^{Left}"

; 4. Alt+右箭头 → Ctrl+右箭头(单词跳转)
!Right::Send "^{Right}"

; ==== 带 Shift 的文本选择版本 ====

; 5. Ctrl+Shift+左箭头 → Shift+Home(选中到行首)
^+Left::Send "+{Home}"

; 6. Ctrl+Shift+右箭头 → Shift+End(选中到行尾)
^+Right::Send "+{End}"

; 7. Alt+Shift+左箭头 → Ctrl+Shift+左箭头(选中左侧单词)
!+Left::Send "^+{Left}"

; 8. Alt+Shift+右箭头 → Ctrl+Shift+右箭头(选中右侧单词)
!+Right::Send "^+{Right}"


; ==== 补充的删除功能 ====

; 9. Ctrl+Backspace → 删除整行
^Backspace::Send "+{Home}{Delete}"

; 10. Alt+Backspace → 删除前一个单词
!Backspace::Send "^+{Left}{Delete}"

2. 将 alt+tab 切换窗口的能力赋予 ctrl+tab

复制
; ==== 将 alt+tab 切换窗口的能力赋予 ctrl+tab ====

~Ctrl & Tab::
{
    ; 释放 Ctrl 键避免干扰
    Send "{Ctrl Up}"
    
    ; 检查 Shift 键状态,已实现反向切换
    if GetKeyState("Shift", "P") { ; 如果 Shift 被物理按下
        Send "{Alt Down}{Shift Down}{Tab}"
        Send "{Shift Up}"
    } else {
        Send "{Alt Down}{Tab}"
    }
    return
}

; 防止 Alt 被锁定
~Ctrl Up::
{
    Send "{Alt Up}"
    return
}


; ==== 通过 win 补充原有 ctrl+tab 切换标签页的功能 ====

; 1. Win+Tab → Ctrl+Tab(标签切换)
#Tab::Send "^{Tab}"

; 2. Win+Shift+Tab → Ctrl+Shift+Tab(反向标签切换)
#+Tab::Send "^+{Tab}"

3. CapeLock键单击切换中英文、长按锁定大小写

注意:需修改切换中英文的热键,我这里是改成Ctrl+F12

复制
#Requires AutoHotkey v2.0
Persistent()

; 初始化状态
isLongPress := false
SetCapsLockState "AlwaysOff" ; 默认关闭大写锁定

; 长按检测函数
longPressAction() {
    global isLongPress
    if (GetKeyState("CapsLock", "P")) { ; 如果仍按住
        isLongPress := true
        SetCapsLockState !GetKeyState("CapsLock", "T") ; 立即切换大小写
    }
}

; 监听 CapsLock 按下事件
CapsLock:: {
    global isLongPress
    isLongPress := false
    SetTimer longPressAction, -300 ; 300ms 后检测长按(负数表示单次触发)

    KeyWait "CapsLock" ; 等待释放
    SetTimer longPressAction, 0 ; 清除计时器

    ; 单击行为(未触发长按时)
    if (!isLongPress) {
        Send "^^{F12}" ; 发送 Ctrl+F12 切换中英文
        SetCapsLockState "Off" ; 强制关闭大写锁定
    }
}

; 保留 Shift+CapsLock 强制切换大小写
+CapsLock:: SetCapsLockState !GetKeyState("CapsLock", "T")

为什么不用 powerToys

实测按键代理时灵时不灵

缺陷

其实我还写了一个交换ctrl键和win键的脚本,但是经常抽风,这个暂时没有很好的解决办法,如果外接键盘支持修改键位,可以通过 via 进行修改:
image

发表一个评论

R保持