I switch back and forth between two computers constantly:

  • OSX Snow Leopard
  • Ubuntu 10.10

I'd like to be able to make Ubuntu use the same keyboard shortcuts as OSX System Wide, for the following keyboard sequences only (ie I don't want to make Ctrl act like Super)

  • Super+C -> Copy

  • Super+V -> Paste

  • Super+T -> Open a new tab in whatever browser I'm in.

  • Super+W -> Close a tab in whatever browser I'm in.

So in short, is there anyway for me to map just these keyboard sequences to the following, system wide ?

  • Super+C -> Ctrl+C
  • Super+V -> Ctrl+V
  • Super+T -> Ctrl+T
  • Super+W -> Ctrl+W

I know there are ways for me to do this for vim, and Firefox, and I'm sure specifically for most applications... but I would prefer to have to do this just once and have it work that way system wide!

I'm using a standard PC keyboard, that is "Generic 105 key (intl) PC" on Ubuntu. I'm also using the same keyboard on my Mac mini.

  • 5
    If you got this dialed in for all the Mac keyboard shortcuts, sharing your config file would be terrific! Thanks Commented Apr 19, 2013 at 16:58
  • hey! I wish I still did, but I'm working exclusively on Mac's now, as I've moved jobs ;-) So I don't have my old config around anywhere...
    – brad parks
    Commented Apr 19, 2013 at 17:13
  • solutions do not work on elementary OS.'
    – Paschalis
    Commented Sep 3, 2016 at 10:02

16 Answers 16


If you install the xautomation package, you can add a command in System → PreferencesKeyboard ShortcutsCustom like:

xte "keyup Meta_L" "keyup Meta_R" "keyup c" "keydown Control_L" "key c" "keyup Control_L"

and map that to Meta+C.

You may need to use "keyup Super_L" "keyup Super_R" depending on your keyboard.

Alternative Solution:

Install AutoKey (apt-get install autokey-gtk) and set a phrase to:

Phrase Text: <ctrl>+C (actually type out the <ctrl>+ here)
Paste Using: Keyboard
Abbreviation: None
Hotkey: <super>+v
Window Filter: None
  • hey! this looks very promising... i've installed, and can run the above xte command from the terminal, and it outputs "^C" in the terminal... which looks good to me! but when i map it in Keyboard Shortcuts, it doesn't do anything... I tried mapping another program to Meta-C, and it works fine (ie launches fine when I press Meta-C). I also tried specifying the full path to xte (/usr/bin/xte) and that didn't work either... can you try this on your system and see if it works? thanks!
    – brad parks
    Commented Nov 6, 2010 at 1:18
  • 1
    So xte sends the key codes correctly, but apparently applications see the combination of the shortcut and the keypresses sent by xte (e.g. Meta-Control-C). I've updated my answer to simulate releasing the shortcut keys before sending the key presses.
    – cscarney
    Commented Nov 6, 2010 at 5:18
  • 2
    On quick check it works for me, but I've found a solution that will probably be more reliable than xte (even if you get it working). Check the revised answer.
    – cscarney
    Commented Nov 6, 2010 at 14:09
  • 1
    hey! thanks @cscarney! your "Alternative Solution" for AutoKey totally works! thanks a ton for your continued effort on this!
    – brad parks
    Commented Nov 8, 2010 at 17:29
  • 1
    Solutions do not work for Ubuntu 18.04
    – JZ.
    Commented Sep 19, 2018 at 2:36

Since Ubuntu 14 you can use GNOME Tweaks:

sudo apt install gnome-tweaks # formerly gnome-tweak-tool

Then, look for Tweak Tool > Keyboard & Mouse > Additional Layout Options > Alt/Win key behavior.

And check: Ctrl is mapped to Win keys and usual Ctrl keys.


  • 2
    Does not seem to do anything or is not Mac behavior
    – chovy
    Commented Dec 3, 2016 at 4:29
  • 1
    This works great for copy-paste commands and keeps me from constantly opening the search menu thing in Ubuntu. Now I just need to map Command-Tab to Alt-Tab
    – Ron Smith
    Commented Jul 9, 2017 at 2:13
  • 1
    This works for me!
    – lkahtz
    Commented Oct 19, 2017 at 4:23
  • 1
    I don't see Tweak Tool in my apps. What should I do? Commented Oct 3, 2018 at 16:12
  • 1
    It works on Ubuntu 20.04. You should see application name as Tweaks instead of Tweak Tool
    – Chandan
    Commented Jun 28, 2021 at 5:34

There is a way to map Ctrl to Win/Super key:

  1. go to system->preferences->keyboard,

  2. open tab Layouts,

  3. click Options...,

  4. open Alt/Win key behavior,

  5. and select Control is mapped to Win keys

And for console there is a forum post how to do that here.

For more digging check general Linux keyboard HOWTO here.


  • 4
    hey @danizmax - thanks for the reply... but I'd specifically like to avoid changing the complete behaviour of Ctrl... I find it screws with other things if I do... I'd really like to map just the keyboard shortcuts that I mentioned in the post... thanks though!
    – brad parks
    Commented Nov 4, 2010 at 0:00
  • Well the Ctr+ stays as it is. It only duplicates all Ctrl+ to Super+ so you just add the behavior. Unless you really really wanna change only those you mentioned, you'll have to do a lot of digging with xmodmap and loadkeys. I've added the link to the general Linux keyboard HOWTO. Hope it helps :P
    – danizmax
    Commented Nov 4, 2010 at 11:40
  • 1
    This was the easiest solution from all proposed.
    – Datageek
    Commented Mar 16, 2013 at 16:21
  • 1
    I don't see the "options" or "alt/win key behavior" option in the system settings any more in Ubuntu 15.10 wily.
    – user29020
    Commented Mar 5, 2016 at 2:07
  • 2
    that's now in gnome tweaks, "keyboard and mouse"
    – Yrogirg
    Commented Nov 1, 2017 at 19:53

Some of the above solutions are old and not working with Ubuntu 18.04. Here is an updated answer

  1. Install gnome-tweaks if not installed in the system

    sudo apt-get install gnome-tweaks

  2. Open the list of applications by pressing Show Applications on at the left bottom.

  3. Note that this will only change the behavior of WINDOWS key to CMD key and keeps CTRL key as same as before (you will have 2 CTRL keys). If you don't like this, skip step 4 and go to step 5

  4. Look for Tweaks application --> Keyboard and Mouse --> Additional Layout options --> Alt/Win behavior --> Select Control is mapped to Win keys and the usual Ctrl Keys.

  5. Skip this step if you completed step 4. This step will swap Windows key Behaviour to Ctrl and vice versa. Look for Tweaks application --> Keyboard and Mouse --> Additional Layout options --> Ctrl Position --> Select Swap Left Win with Left Ctrl

  6. One more thing I miss from macOS is the ability to switch windows with CMD+Tab (In this case Windows+Tab). To achieve this go to Settings --> Keyboard --> Look for Switch Windows under navigation section --> Double Click it and press Windows+Tab when pop up appears

  • 1
    Following the same procedure as Step 6, you can look for Launchers > Search in the Keyboard settings, and map that to WINDOWS + SPACE to mimic Spotlight. Commented Dec 1, 2020 at 20:20

Bumping this! Your pinkies will thank me

All of my muscle memory is Mac based, and I use a Mac at work and in my personal life, but I happened across a Dell Latitude E7470 and figured I might as well give Linux a go on it (since my Macbook Pro is from 2012 and is pretty heavy, and I just didn't want to have to bother with \r\n line endings). So it's been a slow-moving work in progress to figure out how to modify the system to match my muscle memory instead of relearning keyboard shortcuts.

At first, I was just using the Keyboard > Layouts > Options... settings for "Ctrl is mapped to Alt; Alt is mapped to Win" but, and this is a very minor thing, I didn't like that my settings didn't apply until after I got past the greeter. I was also having trouble getting ~/.Xmodmap to run on start (either by itself, as part of .xinitrc and as a custom startup command in startup applications and in /etc/default/

I'm currently running Ubuntu MATE 19.10 (Eoan), and the keyboard is recognized as a pc105

You'll have to modify the script below (or the individual files, if you've already made other modifications to them that you want to keep) to match whatever keyboard your computer has.

Make ~/.Xmodmap:

echo '! -*- coding: utf-8 -*-
! keycode  37 = Control_L NoSymbol Control_L
! keycode  64 = Alt_L Meta_L Alt_L Meta_L
! keycode 105 = Control_R NoSymbol Control_R
! keycode 108 = Alt_R Meta_R Alt_R Meta_R
! keycode 133 = Super_L NoSymbol Super_L
! keycode 134 = Super_R NoSymbol Super_R
! keycode 135 = Menu NoSymbol Menu
! keycode 147 = XF86MenuKB NoSymbol XF86MenuKB
! keycode 204 = NoSymbol Alt_L NoSymbol Alt_L
! keycode 206 = NoSymbol Super_L NoSymbol Super_L
! keycode 105 = Alt_R Meta_R
clear control
clear mod1
clear mod4
keycode 37 = Super_L
keycode 105 = Super_R
keycode 133 = Alt_L Meta_L
keycode 64 = Control_L
keycode 108 = Control_R
add control = Control_L Control_R
add mod1 = Alt_L Meta_L
add mod4 = Super_L Super_R' > ~/.Xmodmap

make ~/.xinitrc:

echo 'if [ -s ~/.Xmodmap ]; then
    xmodmap ~/.Xmodmap
xmodmap ~/.Xmodmap' > ~/.xinitrc

Modify X11 Keyboard symbol file for your keyboard (the important part here is the include "altwin(ctrl_alt_win)" before // End of modifier mappings. This is an otherwise unmodified /usr/share/X11/xkb/symbols/pc file):

echo 'default  partial alphanumeric_keys modifier_keys
xkb_symbols "pc105" {

    key <ESC>  {    [ Escape        ]   };

    // The extra key on many European keyboards:
    key <LSGT> {    [ less, greater, bar, brokenbar ] };

    // The following keys are common to all layouts.
    key <BKSL> {    [ backslash,    bar ]   };
    key <SPCE> {    [    space      ]   };

    include "srvr_ctrl(fkey2vt)"
    include "pc(editing)"
    include "keypad(x11)"

    key <BKSP> {    [ BackSpace, BackSpace  ]   };

    key  <TAB> {    [ Tab,  ISO_Left_Tab    ]   };
    key <RTRN> {    [ Return        ]   };

    key <CAPS> {    [ Caps_Lock     ]   };
    key <NMLK> {    [ Num_Lock      ]   };

    key <LFSH> {    [ Shift_L       ]   };
    key <LCTL> {    [ Control_L     ]   };
    key <LWIN> {    [ Super_L       ]   };

    key <RTSH> {    [ Shift_R       ]   };
    key <RCTL> {    [ Control_R     ]   };
    key <RWIN> {    [ Super_R       ]   };
    key <MENU> {    [ Menu          ]   };

    // Beginning of modifier mappings.
    modifier_map Shift  { Shift_L, Shift_R };
    modifier_map Lock   { Caps_Lock };
    modifier_map Control{ Control_L, Control_R };
    modifier_map Mod2   { Num_Lock };
    modifier_map Mod4   { Super_L, Super_R };

    // Fake keys for virtual<->real modifiers mapping:
    key <LVL3> {    [ ISO_Level3_Shift  ]   };
    key <MDSW> {    [ Mode_switch       ]   };
    modifier_map Mod5   { <LVL3>, <MDSW> };

    key <ALT>  {    [ NoSymbol, Alt_L   ]   };
    include "altwin(meta_alt)"

    key <META> {    [ NoSymbol, Meta_L  ]   };
    modifier_map Mod1   { <META> };

    key <SUPR> {    [ NoSymbol, Super_L ]   };
    modifier_map Mod4   { <SUPR> };

    key <HYPR> {    [ NoSymbol, Hyper_L ]   };
    modifier_map Mod4   { <HYPR> };
    include "altwin(ctrl_alt_win)"
    // End of modifier mappings.

    key <OUTP> { [ XF86Display ] };
    key <KITG> { [ XF86KbdLightOnOff ] };
    key <KIDN> { [ XF86KbdBrightnessDown ] };
    key <KIUP> { [ XF86KbdBrightnessUp ] };

hidden partial alphanumeric_keys
xkb_symbols "editing" {
    key <PRSC> {
    type= "PC_ALT_LEVEL2",
    symbols[Group1]= [ Print, Sys_Req ]
    key <SCLK> {    [  Scroll_Lock      ]   };
    key <PAUS> {
    type= "PC_CONTROL_LEVEL2",
    symbols[Group1]= [ Pause, Break ]
    key  <INS> {    [  Insert       ]   };
    key <HOME> {    [  Home         ]   };
    key <PGUP> {    [  Prior        ]   };
    key <DELE> {    [  Delete       ]   };
    key  <END> {    [  End          ]   };
    key <PGDN> {    [  Next         ]   };

    key   <UP> {    [  Up           ]   };
    key <LEFT> {    [  Left         ]   };
    key <DOWN> {    [  Down         ]   };
    key <RGHT> {    [  Right        ]   };
};' >/usr/share/x11/xkb/symbols/pc

And just in case, here's the relevant part of /usr/share/X11/xkb/symbols/altwin if you need to add it manually:

// Ctrl is mapped to the Alt, Alt to the Super, and Win to the Ctrl keys.
partial modifier_keys
xkb_symbols "ctrl_alt_win" {
    key <LALT> { [ Control_L, Control_L  ] };
    key <RALT> { type[Group1] = "TWO_LEVEL",
                 symbols[Group1] = [ Control_R, Control_R ] };
    key <LWIN> { [ Alt_L, Meta_L ] };
    key <RWIN> { [ Alt_R, Meta_R ] };
    key <LCTL> { [ Super_L ] };
    key <RCTL> { [ Super_R ] };
    modifier_map Control { <RALT>, <LALT> };
    modifier_map Mod1 { <LWIN>, <RWIN> };
    modifier_map Mod4 { <LCTL>, <RCTL> };

Modify /etc/defaults/keyboard:


# Consult the keyboard(5) manual page.


BACKSPACE="guess"' >/etc/default/keyboard

And finally, here's my GNOME and Marco keybinding dconf dumps:






Edit: The simple approach I describe here has some drawbacks (mentioned below, most noticeably with sticky keys). So I now recommend checking out Kinto which avoids such issues by remapping the keyboard proactively.

I wanted a solution that would work in any desktop environment / window manager, so I combined cscarney's suggestion to use xautomation with the SXHKD (the simple X hotkey daemon).

Here is the basic ~/.config/sxhkd/sxhkdrc config file I produced.

Advanced: My latest version is more complete, and can send different keystrokes for different applications, but it requires an external script, and probably has some bindings you don't want.

Here is a snippet:

# Reload this config
control + alt + shift + r
  killall -USR1 -u "$USER" sxhkd && echo 'sxhkd config reloaded'

# Cut, copy and paste
alt + x
  xte "keyup x" "keyup Meta_L" "keydown Control_L" "key x" "keyup Control_L" "keydown Meta_L"
alt + c
  xte "keyup c" "keyup Meta_L" "keydown Control_L" "key c" "keyup Control_L" "keydown Meta_L"    
alt + v
  xte "keyup v" "keyup Meta_L" "keydown Control_L" "key v" "keyup Control_L" "keydown Meta_L"

# Open tab, close tab, restore closed tab
alt + t
  xte "keyup t" "keyup Meta_L" "keydown Control_L" "key t" "keyup Control_L" "keydown Meta_L"
alt + w
  xte "keyup w" "keyup Meta_L" "keydown Control_L" "key w" "keyup Control_L" "keydown Meta_L"    
alt + shift + t
  xte "keyup t" "keyup Meta_L" "keydown Control_L" "key t" "keyup Control_L" "keydown Meta_L"

# Move to home/end
alt + Left
  xte "keyup Meta_L" "keyup Left" "key Home" "keydown Meta_L"
alt + Right
  xte "keyup Meta_L" "keyup Right" "key End" "keydown Meta_L"
alt + shift + Left
  xte "keyup Meta_L" "keyup Left" "key Home" "keydown Meta_L"
alt + shift + Right
  xte "keyup Meta_L" "keyup Right" "key End" "keydown Meta_L"

# Move one word
super + Left
  xte "keyup Super_L" "keyup Left" "keydown Control_L" "key Left" "keyup Control_L" "keydown Super_L"
super + Right
  xte "keyup Super_L" "keyup Right" "keydown Control_L" "key Right" "keyup Control_L" "keydown Super_L"
super + shift + Left
  xte "keyup Super_L" "keyup Left" "keydown Control_L" "key Left" "keyup Control_L" "keydown Super_L"
super + shift + Right
  xte "keyup Super_L" "keyup Right" "keydown Control_L" "key Right" "keyup Control_L" "keydown Super_L"


  • As you can see, if I keyup the original modifier key before performing the virtual stroke, then I keydown it again afterwards. This means the user can repeat they key press without having to release and depress the modifier key again. In other words, after pressing Alt-W, the system sees the Alt key is depressed.


  • That can be a problem (especially on slower machines) if you release Alt key while the xte command is still running. You will end up with a "sticky" Alt key, because xte has pressed it down for you!

  • Using this approach, the triggers will not repeat if the key is held down. (So you can't move 12 words by holding down Super-Left.)

  • I used to use bbkeys in the past, but sadly it is not being packaged on so many distros these days. Commented Jan 6, 2019 at 15:02

To expand on cscarney's AutoKey hint, I am developing my AutoKey configuration to achieve all this in Ubuntu (OS X-like <cmd>+c, <cmd>+v, ... Emacs-style <ctrl>+f, <ctrl>+b, ...) in my dotfile repo.

I don't use basic phrases (where window filtering is currently broken), but Python scripts, to be able to disable AutoKey in apps such as Emacs, Eclipse, Vim, gnome-terminal ... where I don't want to mess up the existing shortcuts.

You can check out the README on the bottom for instructions on how to set it up.

  • link is broken for the app
    – chifliiiii
    Commented Oct 30, 2018 at 13:37
  • @chifliiiii fixed the links, but note that the linked config in my dotfiles is very likely outdated, cause I haven't been using it in years.
    – metakermit
    Commented Oct 30, 2018 at 18:55

You may like to check out Kinto, which is a fairly comprehensive solution with a full GitHub repository.

"A better Linux & Windows keyboard layout for professional mac users"

It avoids some of the problems I had with sxhkd, because it doesn't reinterpret keystrokes, rather it remaps them ahead of time using xmodmap.

Specifically, it watches your X session to see when window focus changes, and then it quickly switches to the appropriate keybindings for that application.

  • Seems nice but after executing ~/.config/kinto/gui/kinto-gui.py we are getting errors that the import gi is not working properly. Have installed python3 successfully already Commented Jul 4, 2021 at 8:03
  • @GeorgePligoropoulos You may want to look at the GitHub issues: github.com/rbreaves/kinto/issues?q=is%3Aissue+%22import+gi%22 Commented Jul 15, 2021 at 10:07
  • This should be the accepted answer! Kinto is great! it solved all of the problems I was facing because of my muscle memory.
    – ATheCoder
    Commented Jan 14, 2023 at 17:06

This is an easy task once you know how to do it.

  1. Check the keycode of yours key. Run this program at terminal.


    At this example, the terminal shows that the keycode for my k is "45".

  2. Change them as you like creating this file:

    gedit ~/.Xmodmap</pre>  
  3. It's contents should look like this example:

    keycode 64 = Alt_L Meta_L Alt_L Meta_L  
    keycode 108 = ISO_Level3_Shift NoSymbol ISO_Level3_Shift  

    (Change the keycode number as needed - look at step "1")


    Obs.: if I want to change my k I should use "keycode 45" as showed at step "1".

  4. Logout and log back in or reboot or run this:

    xmodmap ~/.Xmodmap</pre>  

    Hope you enjoy ;-)


Similar to and based on the excellent work of others, I made a repo with my Autokey shortcuts and instructions for getting this setup:



Use kinto: https://github.com/rbreaves/kinto/

I'm on Ubuntu 20.04 and it works wonderfully! It uses system wide rebindings so you don't need to deal with configuring individual applications and installation is super simple and takes a few seconds.


The easiest way which I found to remap the keys with mac layout was by installing the app Kinto. After the installation, you can use mac os keyboard shortcuts with the command key on Linux/Windows



git clone https://github.com/rbreaves/kinto.git
cd kinto


enter image description here

  • This is far and away the easiest solution! I've used Kinto on several versions of Ubuntu as virtual machines, and now have 20.04 booting from an external drive on an old iMac. Works perfectly!
    – mpemburn
    Commented May 10, 2022 at 15:46
  • Seems like the easiest solution, I was just wondering how much lightweight this app is
    – Kar19
    Commented Sep 24, 2023 at 13:43

Install Guest Additions CD (Devices->Insert Guest Additions CD image).

Activate clipboard sharing
Then after a reboot, in Virtualbox go to Machine->Settings->General->Advanced and set
Shared Clipboard: Bidrectional

Change VirtualBox Host Key
In Vitualbox/Preferences/Input/Virtual Machine/Host Key Combination
choose sth different then

Key Mapping:
For the cmd/ctrl mapping for me adding the English (Macintosh) keyboard seems to be the most comfortable solution :)

Go to Ubuntu Settings->Text Entry
(I guess in older versions it might be in Keyboard Layout Settings)
Under Input sources to use: hit plus (+)
add English (Macintosh)

I'm on Ubuntu 14.04.3 LTS 64bit in VirtualBox 5.0.4


I have an Apple aluminum keyboard. A slight modification (using Super_L instead of Meta_L) to @cscarney's suggestion made it work in Ubuntu 18.04

Command: xte "keyup Super_L" "keyup c" "keydown Control_L" "key c" "keyup Control_L"
Short cut: Super+C

Command: xte "keyup Super_L" "keyup v" "keydown Control_L" "key v" "keyup Control_L"
Short cut: Super+V

I don't have Ubuntu to hand (Mac's here, Ubu's at the office) but I use a Mac keyboard there and for the same reasons as you, wanted to do this.

First thing is to make sure your keyboard was installed as a Mac keyboard. I think you can change this in system->preferences->keyboard. While you're there one of the tabs will get you to a key mapping page where you can set up how the cmd key works.

Like I say, I can't remember exactly - I can point to the bits on my screen here, but that doessn't work because I'm not there.

If you're still stuck tomorrow, I'll look again.

  • system->preferences->keyboard->layouts->options
    – Leo
    Commented Oct 29, 2010 at 8:27
  • hi leo... i'm not using a Mac keyboard with Ubuntu though... I'm using a standard PC keyboard, ie "Generic 105 key (intl) PC" did try switching my "keyboard model" to Vendor Apple / Model Apple but that didn't seem to make any difference.... I also tried Vendor Apple / Model Macbook and that didn't seem to change anything either...
    – brad parks
    Commented Oct 29, 2010 at 12:11
  • and for what it's worth, I use the exact same PC keyboard on my macmini as well, as I bought it second hand and it didn't come with a mac keyboard. thanks again.
    – brad parks
    Commented Oct 29, 2010 at 12:17

Autokeys did work for me. Now win+c (v,x,a) work around my system just like I'd expect it.

1. Install autokeys

sudo apt install autokey-gtk

2. Configure autokeys

  1. Add root folder, call it something like MacKeys or whatever
  2. You'll create 4 scripts in there for ctrl-c, v,x and a
  3. assign to each script hotkey super-c, super-v etc
  4. fill the scripts with code below (replace letter c for other combos)

winClass = window.get_active_class() keys = "<ctrl>+c" if winClass == "gnome-terminal-server.Gnome-terminal": keys = "<ctrl>+<shift>+c"; keyboard.send_keys(keys)

4a. For CmdZ, CmdA or CmdX work with simpler script like keyboard.send_keys("<ctrl>+x")

3. Add /usr/bin/autokey-gtk to startup applications

4. Disable win-A in keyboard settings

Normally win-a makes switch to overview.

5. Optional, fully prevent win to switch the overview

Probably you will want to remove it. Install gnome-tweak-tool, go to keyboard and rebind switching from desktop to overview. That worked for my gnome ubuntu 16.04.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .