Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Use mac style keyboard shortcuts on Windows with AutoHotkey (ahk) script

Use (most) macOS style keyboard shortcuts on Windows

Make Windows PC's shortcut act like macOS (Mac OS X)

With this AutoHotKey script, you can use most macOS style shortcuts (eg, cmd+c, cmd+v, ...) on Windows with a standard PC keyboard.

Note that:

  1. you shouldn't change the modifier keys mapping with keyboard DIP. This script assumes you use a standard PC keyboard layout, and wish to use shortcuts as if it was a mac keyboard layout.
  2. To use cmd + shift + ↑ / ↓ / ← / → (select text between cursor and top / bottom / beginning of line / end of line), You should disable the Between input languages shotcut from Control Panel\Clock, Language, and Region\Language\Advanced settings > Change lanugage bar hot keys due to conflicting.
  3. Some Windows built-in keyboard shortcuts will be overridden. For example: win + ↑ / ↓ / ← / → (snap window to side). Change mac.ahk accordingly if you prefer to keep the default behavior.

Here's some examples of how this script work:

you want to press what you're actually pressing AutoHotKey tells Windows
cmd + c alt + c ctrl + c
cmd + v alt + v ctrl + v
cmd + r alt + r F5
cmd + ↑ alt + ↑ Home
cmd + shift + [ alt + shift + [ ctrl + shift + Tab
... ... ...

To Run Once (until reboot)

  1. Install https://www.autohotkey.com/
  2. Copy and save the content of mac.ahk in a text file, named as mac.ahk
  3. Double click on mac.ahk file

Auto start after Windows startup

Place mac.ahk file (or make a shortcut) at C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; Docs:
; https://autohotkey.com/docs/Hotkeys.htm
; https://autohotkey.com/docs/KeyList.htm
; Ref https://autohotkey.com/board/topic/60675-osx-style-command-keys-in-windows/
; You need to disable "Between input languages" shotcut from Control Panel\Clock, Language, and Region\Language\Advanced settings > Change lanugage bar hot keys
; Universal shotcuts
$!x::Send ^x
$!c::Send ^c
$!v::Send ^v
$!s::Send ^s
$!a::Send ^a
$!z::Send ^z
$!+z::Send ^y
$!w::Send ^w
$!f::Send ^f
$!n::Send ^n
$!q::Send !{f4}
$!r::Send ^{f5}
$!m::Send {LWin Down}{Down}{LWin Up}
$!`::Send {Alt Down}{Shift Down}{Tab}{Shift Up}
; Quick Switch Tab shotcuts
$!1::Send ^1
$!2::Send ^2
$!3::Send ^3
$!4::Send ^4
$!5::Send ^5
$!6::Send ^6
$!7::Send ^7
$!8::Send ^8
$!9::Send ^9
$!0::Send ^0
; Chrome shotcuts
$!t::Send ^t
$!+t::Send ^+t
$!+]::Send {Ctrl Down}{Tab Down}{Tab Up}{Ctrl Up}
$!+[::Send {Ctrl Down}{Shift Down}{Tab Down}{Tab Up}{Shift Up}{Ctrl Up}
$!l::Send ^l
; input methods
; $+,::Send ^,
; $+.::Send ^.
; navigation, selection, delete a word/till end
$!Left::Send {Home}
$!Right::Send {End}
$!Up::Send {Lctrl down}{Home}{Lctrl up}
$!Down::Send {Lctrl down}{End}{Lctrl up}
$#Left::Send {ctrl down}{Left}{ctrl up}
$#Right::Send {ctrl down}{Right}{ctrl up}
$#+Left::Send {ctrl down}{shift down}{Left}{shift up}{ctrl up}
$#+Right::Send {ctrl down}{shift down}{Right}{shift up}{ctrl up}
$!+Left::Send {shift down}{Home}{shift up}
$!+Right::Send {shift down}{End}{shift up}
$!+Up::Send {Ctrl Down}{shift down}{Home}{shift up}{Ctrl Up}
$!+Down::Send {Ctrl Down}{shift down}{End}{shift up}{Ctrl Up}
!BS::Send {LShift down}{Home}{LShift Up}{Del}
#BS::Send {LCtrl down}{BS}{LCtrl up}
$#Space::Send {Ctrl Down}{LWin Down}{Space}{LWin Up}{Ctrl Up}
@Veronika-Kot

This comment has been minimized.

Copy link

@Veronika-Kot Veronika-Kot commented Sep 21, 2018

Universal shotcuts started working for me only after I replaced $!x::Send ^x with $#x::Send ^x (replaced ! with #).
Haven't tried other shortcuts.

@dorlyneto

This comment has been minimized.

Copy link

@dorlyneto dorlyneto commented Jan 14, 2019

Thank you so much! Works without any problem. :D

@edoardoc

This comment has been minimized.

Copy link

@edoardoc edoardoc commented Jun 28, 2020

this is the closest I could get, thank you.

PS: I am running this with a pre-code to run the ahk in admin mode, I read that it sorts out some compatibility problems in win10, what do you think?

full_command_line := DllCall("GetCommandLine", "str")

if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
    try
    {
        if A_IsCompiled
            Run *RunAs "%A_ScriptFullPath%" /restart
        else
            Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
    }
    ExitApp
}

MsgBox A_IsAdmin: %A_IsAdmin%`nCommand line: %full_command_line%
@DannyDannyDanny

This comment has been minimized.

Copy link

@DannyDannyDanny DannyDannyDanny commented Feb 15, 2021

Previously I would use the winkey to snap windows around on screen:

  • Win+
  • Win+
  • Win+
  • Win+

They no longer work - is there an easy workaround? 👍

@ascendbruce

This comment has been minimized.

Copy link
Owner Author

@ascendbruce ascendbruce commented Feb 16, 2021

Hi @DannyDannyDanny, I guess it might be conflicting with one of the Left/Right/Up/Down config group between line 58-71, but I don't have Windows PC with me right now. Could you try disabling those lines and re-run the script?

@DannyDannyDanny

This comment has been minimized.

Copy link

@DannyDannyDanny DannyDannyDanny commented Feb 16, 2021

You are right! Deleting lines L58-end resolved the arrow-key issues. I can now snap windows and use arrows to change selection the the window navigator (win: alt-tab). There'll be some consequences of deleting those lines. So far I haven't figured out whats missing. Thanks @ascendbruce! 🥇

@Aghyads

This comment has been minimized.

Copy link

@Aghyads Aghyads commented Apr 17, 2021

#$! can you please explain what does each of these represent in. I want to make changes, but I'm not sure

@ascendbruce

This comment has been minimized.

Copy link
Owner Author

@ascendbruce ascendbruce commented Apr 19, 2021

Hi @Aghyads, you can find their meanings in AutoHotKey's official doc, under the "Keys and their mysterious symbols" section: https://www.autohotkey.com/docs/Tutorial.htm#s21

And for $, it's a Hotkey Modifier Symbols, you can find the usage here: https://www.autohotkey.com/docs/Hotkeys.htm#Symbols

@tornikenats

This comment has been minimized.

Copy link

@tornikenats tornikenats commented Apr 19, 2021

For some reason #BS::Send {LCtrl down}{BS}{LCtrl up} doesn't work. I've tried different symbols for backspace like BackSpace and BACKSPACE but it doesn't work. It only deletes one character instead of a word.

@ascendbruce

This comment has been minimized.

Copy link
Owner Author

@ascendbruce ascendbruce commented Apr 20, 2021

Hi @tornikenats, maybe also try:

$#BS::Send {LCtrl down}{BS}{LCtrl up}

If that works, I will update the gist. But I don't have a windows machine with me right now.

@tornikenats

This comment has been minimized.

Copy link

@tornikenats tornikenats commented Apr 20, 2021

Hi @ascendbruce, everything works, it was another one of the lines I added that broke it. Feel free to delete my comment to reduce noise.

@Aghyads

This comment has been minimized.

Copy link

@Aghyads Aghyads commented Apr 27, 2021

@ascendbruce, dear, do you know how I can create the move forward/ redo shortcut.
It is not working on Microsoft office programs.
here is my script:

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.

; Docs:
; https://autohotkey.com/docs/Hotkeys.htm
; https://autohotkey.com/docs/KeyList.htm
; Ref https://autohotkey.com/board/topic/60675-osx-style-command-keys-in-windows/

; You need to disable "Between input languages" shotcut from Control Panel\Clock, Language, and Region\Language\Advanced settings > Change lanugage bar hot keys

; Universal shotcuts
^q::!F4
#q::!F4

$!x::Send ^x
$!c::Send ^c
$!v::Send ^v
$!s::Send ^s
$!a::Send ^a
$!z::Send ^z
$!+z::Send ^y
$!w::Send ^w
$!f::Send ^f
$!n::Send ^n
$!q::Send !{f4}
$!r::Send ^{f5}
$!m::Send {LWin Down}{Down}{LWin Up}
$!`::Send {Alt Down}{Shift Down}{Tab}{Shift Up}

; Quick Switch Tab shotcuts

$!1::Send ^1
$!2::Send ^2
$!3::Send ^3
$!4::Send ^4
$!5::Send ^5
$!6::Send ^6
$!7::Send ^7
$!8::Send ^8
$!9::Send ^9
$!0::Send ^0

; Chrome shotcuts

$!t::Send ^t
$!+t::Send ^+t
$!+]::Send {Ctrl Down}{Tab Down}{Tab Up}{Ctrl Up}
$!+[::Send {Ctrl Down}{Shift Down}{Tab Down}{Tab Up}{Shift Up}{Ctrl Up}
$!l::Send ^l

; input methods

; $+,::Send ^,
; $+.::Send ^.

; navigation, selection, delete a word/till end

$!Left::Send {Home}
$!Right::Send {End}
$!Up::Send {Lctrl down}{Home}{Lctrl up}
$!Down::Send {Lctrl down}{End}{Lctrl up}

$#Left::Send {ctrl down}{Left}{ctrl up}
$#Right::Send {ctrl down}{Right}{ctrl up}
$#+Left::Send {ctrl down}{shift down}{Left}{shift up}{ctrl up}
$#+Right::Send {ctrl down}{shift down}{Right}{shift up}{ctrl up}

$!+Left::Send {shift down}{Home}{shift up}
$!+Right::Send {shift down}{End}{shift up}
$!+Up::Send {Ctrl Down}{shift down}{Home}{shift up}{Ctrl Up}
$!+Down::Send {Ctrl Down}{shift down}{End}{shift up}{Ctrl Up}

!BS::Send {LShift down}{Home}{LShift Up}{Del}
#BS::Send {LCtrl down}{BS}{LCtrl up}

$#Space::Send {Ctrl Down}{LWin Down}{Space}{LWin Up}{Ctrl Up}

^space:: Send ^{esc}

LControl & Tab::AltTab

; Google Search highlighted text
^+c::
{
Send, ^c
Sleep 50
Run, http://www.google.com/search?q=%clipboard%
Return
}

; Press ~ to move up a folder in Explorer
#IfWinActive, ahk_class CabinetWClass
`::Send !{Up}
#IfWinActive
return

; Empty trash
^del::FileRecycleEmpty ; win + del
return

Capslock::
Send {LWin down}{Space down}
KeyWait, LWin
Send {Space up}{Lwin up}
return

^h::WinMinimize, A ; Ctrl+Down
return

F13::
Send {F2}
return

^F19::
DllCall("PowrProf\SetSuspendState", "int", 0, "int", 0, "int", 0)
Return

#^1::¡
#^+1::/
#^2::€
#^+2::™
#^3::£
#^+3::‹
#^4::¢
#^+4::›
#^5::∞
#^6::§
#^+6::fl
#^7::¶
#^+7::‡
#^8::•
#^+8::°
return

Any suggestions to solve that?

Thanks!

@sgrayrw

This comment has been minimized.

Copy link

@sgrayrw sgrayrw commented May 8, 2021

Thanks so much!

@samuelbalogh

This comment has been minimized.

Copy link

@samuelbalogh samuelbalogh commented May 30, 2021

Amazing, thank you so much for this!

@Wolowit

This comment has been minimized.

Copy link

@Wolowit Wolowit commented Jul 24, 2021

last line change language it space 1 char, how can I fixed it.

Thanks for script btw

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment