How can I change what keys on my keyboard do? (How can I create custom keyboard commands/shortcuts?)

204,124

Solution 1

xbindkeys..

sudo apt-get install xbindkeys

Xbindkeys is a very versatile program that lets you remap keys very easily. It uses a config file, my default located in your home directory, to change key bindings into certain commands.

To create a default config file you use the command:

xbindkeys --defaults

Which prints the default config file. So if you want to create the file containing the default values you would use:

xbindkeys --defaults > $HOME/.xbindkeysrc

Which prints the default values into a hidden file named .xbindkeysrc located in home (~).

Now to actually change the bindings of keys we first need to know what the name or keysym of those keys is. xbindkeys allows us to use the -k handle to find the name of a key or key combination. Run:

xbindkeys -k

And press a key or key combination. Your output will look something similar to this (when pressing space):

"NoCommand"
m:0x10 + c:65
Mod2 + space

"No Command" tells us that currently no command is associated with the Space key.

m:0x10 + c:65
Mod2 + space  

Is the name of the key/key combination.

the config file..

Lets open up the config file you made earlier:

gedit .xbindkeysrc  

Here is an excerpt from the default config file:

#
# A list of keys is in /usr/include/X11/keysym.h and in
# /usr/include/X11/keysymdef.h
# The XK_ is not needed.
#
# List of modifier:
#   Release, Control, Shift, Mod1 (Alt), Mod2 (NumLock),
#   Mod3 (CapsLock), Mod4, Mod5 (Scroll). 
#

# The release modifier is not a standard X modifier, but you can  
# use it if you want to catch release events instead of press events

# By defaults, xbindkeys does not pay attention with the modifiers
# NumLock, CapsLock and ScrollLock.
# Uncomment the lines above if you want to pay attention to them.

#keystate_numlock = enable
#keystate_capslock = enable
#keystate_scrolllock= enable

# Examples of commands:

"xbindkeys_show" 
 control+shift + q  

Every line beginning with # is a comment and won't be read or run by xbindkeys.

So far the only line that isn't commented out is:

"xbindkeys_show" 
 control+shift + q  

This excerpt shows the basic syntax of xbindkeys commands:

"Command to run (in quotes)"
key to associate with command (no quotes)  

So as you can see:

"xbindkeys_show" 
 control+shift + q  

Runs the command xbindkeys_show when you press Ctrl+Shift+q.

bind keys to commands..

Now lets try binding a few keys. I recommend clearing the entire default file so that it's blank. It contains preset key bindings you probably don't want.

Now lets say you want to use Ctrl+b to open your browser. First you need to know what the name or keysym of Ctrl+b is. As mentioned earlier you can use xbindkeys -k to find the name of a key or keys, but there is an easier way. For simple combinations like Ctrl+b you can just use:

Control+b

A lot easier isn't it!

Now find the command for your favorite browser:

  • For Firefox: firefox

  • For Chromium: chromium-browser

  • For Opera: opera

Remember the syntax from earlier? The xbindkeys command to launch Firefox (or your other favorite browser) when you press Ctrl+b is:

"firefox"
Control+b

Now put that in your config file and save it. Now you might notice your command doesn't work yet, that's because xbindkeys isn't running. To start it just run xbindkeys from a terminal. Your Ctrl+b should now start your browser!

bind keys to other keys..

If you want a key on your keyboard to call a different key on your keyboard, you will need an extra piece of software as xbindkeys does not support this on it's own. I know of two programs which we can use, xdotool and xte. I prefer xte so I'm going to use that.

Install it:

sudo apt-get install xautomation

The syntax for xte is like this:

xte 'command key/mousebutton/xyCoordinates'

Examples:

  • To call a single key press: xte 'key keyName'

  • To call a key combination: xte 'keydown keyName' 'keydown secondKeyName' 'keyup keyName' 'keyup secondKeyName

  • To call a mouse button: xte 'mouseclick buttonNumber' (We'll discuss finding button numbers a little latter)

  • To move the mouse: xte 'mousemove xCoordinate yCoordinate'

  • And more! Read man xte

Now that you know the command for simulating key presses you can call it from your xbindkeys script, like this:

"xte 'key b'"
Control+b  

As you might guess, this calls xte 'key b' when we press Ctrl+b, which would enter a b into any document you might be currently working on.

I thing to note however is that xbindkeys and xte don't always work very well together. Sometimes you have to press the keys exactly at the same time to get output, other times it works just fine. This may or may not have to do with system configuration and/or hardware.. I'm not sure. See maggotbrain's answer for a more reliable way of binding keys to other keys.

bind mouse buttons to commands..

You can also use xbindkeys to bind mouse buttons to commands (and thence keyboard shortcuts, see above). The basic format for mouse buttons should be familiar to you now:

" [command to run]  "
b:n

Where [command to run] is the command you want to run and n the number of the mouse button you want to use for that command.

If you don't know the number of your mouse button you can use xev to find out what it is:

xev | grep button

The output will be something like this:

user@host:~$ xev | grep button
    state 0x10, button 1, same_screen YES
    state 0x110, button 1, same_screen YES
    state 0x10, button 2, same_screen YES
    state 0x210, button 2, same_screen YES
    state 0x10, button 3, same_screen YES
    state 0x410, button 3, same_screen YES

When I press each of my mouse buttons.

For example:

" firefox "
b:2

Launches firefox when I press my middle mouse button.

Solution 2

Xev and xmodmap

Changing key bindings using xev and xmodmap.

Both command line applications are available by default, so there is no need to install additional software.

Xev "creates a window and then asks the X server to send it events whenever anything happens to the window (such as it being moved, resized, typed in, clicked in, etc.)." xev man page

xmodmap is a "program is used to edit and display the keyboard modifier map and keymap table that are used by client applications to convert event keycodes into keysyms." xmodmap man page

The following example will remap the Caps_Lock key to the behavior of the Esc key (Many vi/vim users find this to be a useful keyboard mapping).

Using xev

Start the xev application from a terminal window (Ctrl-Alt-t). It may be useful to grep its output like xev | grep -i key

The application will initialize, display a number of lines, and start a small window with a box. Keep the xev application window in focus, and press the key whose properties/behavior that you wish to use.

  • Press the ESC key

In the terminal window, you will see several lines of output. Make note of 3rd line returned. This will contain the name of the property you wish to move to the other key.

KeyPress event, serial 32, synthetic NO, window 0x3e00001,
    root 0x256, subw 0x0, time 16245388, (616,73), root:(1487,535),
    state 0x10, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) ""

In this case, the Esc key(keycode 9) uses the name "Escape".

  • Press the Caps Lock key

This time we are looking for the keycode that Caps Lock is using.

Again, note the 3rd line:

KeyRelease event, serial 32, synthetic NO, window 0x4c00001,
    root 0x256, subw 0x0, time 94702774, (862,151), root:(1733,613),
    state 0x10, keycode 66 (keysym 0xffe5, Caps_Lock), same_screen YES,
    XKeysymToKeycode returns keycode: 9
    XLookupString gives 1 bytes: (1b) ""

Using xmodmap

Now that we have obtained the information on the keys that we wish to change from xev, we will use xmodmap to modify the keymaps. From the command terminal (Ctrl+Alt+t), run the following commands:

  • This command modifies the Caps Lock to use the same behavior as Esc

     xmodmap -e "keycode 66 = Escape"
    

You can also remap it to basically any key, here it is remapped to the p key

    xmodmap -e "keycode 66 = p"
  • This option prints the current keymap table as expressions into the file ~/.Xmodmap

     xmodmap -pke > ~/.Xmodmap
    

Activate the changes(for this login session only) with following command:

xmodmap ~/.Xmodmap

Making changes persistent across reboots:

  • If it doesn't exist, create a file in your home folder called .xinitrc.

      touch ~/.xinitrc
    
  • Place the following line in the file and save the file:

      xmodmap ~/.Xmodmap
    

Modifying keys with different state behaviors

(such as Num Lock)

  • Obtain the keymap table for the modifier keys (output abbreviated here)

      $ xmodmap -pm
      shift       Shift_L (0x32),  Shift_R (0x3e)
      mod2        Num_Lock (0x4d)
    

If you wanted to change, for example, the behavior of the period on Del/Period key on the number keypad, to a comma, use the following command:

xmodmap -e "keycode 91 mod2 = KP_Delete comma"

Note that this is using mod2 keymapping to change key behavior when the modifier Num Lock is pressed. The syntax for this is:

xmodmap -e "<KEYCODE> <MODIFIER> = <behaviour> <behaviour_with_modifier>"

Resource

Solution 3

By default (This is just to complement the Excellent answer by Seth), Ubuntu (In this example I am using 16.04) has 2 categories that come by default in the System Settings:

To go to the System Settings, on the Top Right click on the Gear icon:

enter image description here

Then select System Settings:

enter image description here

Here you will find 2 options that can send you to the Shortcut Creation section.

enter image description here

If you select Text Entry you will have to select the Keyboard Settings Link on the Bottom Right which would send you directly to the Shortcuts options.

enter image description here

If you select the Keyboard option, you would have to click on the Shortcuts Tab

enter image description here

After arriving at the Shortcuts tabs, you would select the Custom Shortcuts at the bottom of the list in the left side:

enter image description here

And then click on the Plus Sign at the bottom in order to start creating your very own Shortcut:

enter image description here

From there on, it's just a matter of you adding the name of the shortcut (Do not confuse the name of the shortcut, for the name of the actual command you will be executing). And below, in the Command field, is where you will put what command will be executed for this shortcut. In the following example I named the Shortcut "Sublime Text 3" to know what that specific shortcut relates to. And on the command field I added the actual command which is subl.

enter image description here

You will end up with the following on screen that shows that, since the shortcut does not yet have a key or key combination assigned, it is Disabled by default:

enter image description here

We would then click on the "Disabled" message in order to add a key combination to it:

enter image description here

In this part, I assign the key combination of SHIFT+CTRL+S so that when I press this combination it opens the Sublime Text App.

enter image description here

After which, you can simply test your combination by pressing the corresponding key combination and seeing the app open:

enter image description here

NOTE: For special combinations like the one to kill the X Server, I suggest visiting the following link: How do I enable Ctrl-Alt-Backspace to kill the X server?

Solution 4

Go to System SettingsKeboard, select Shortcuts tab and add a new custom shortcut for your browser. If your default brouser is Firefox, use firefox for in command field; if your default brouser is Firefox, use chromium-browser, and so on:

add custom shortcut

Solution 5

You can create complex (multi-key) keyboard shortcuts by installing AutoKey from the software center. Unlike xmodmap, AutoKey doesn't rebind the actual keys on your keyboard; it runs in the background and intercepts your defined keyboard shortcuts, then sends simulated keypresses to your applications.

The first time you launch AutoKey, it will start the service in the background (the notification icon hasn't been updated for unity, so there's no visual indication). Once it's running, you can bring up the configuration interface by running the launcher again:

enter image description here

Now open Edit > Preferences and select "Automatically start AutoKey at login" to make sure that your shortcuts work whenever you are logged in.

Mapping a keyboard shortcut to another keyboard shortcut

  1. Select File > New > Phrase .
  2. Make sure "Paste using" is set to "Keyboard".
  3. Type the keys you want to map to in the text box.

    • Special (non-character) keys are represented with the codes documented here.
    • If you type multiple keys, they'll be sent in sequence unless you place a + between them (e.g. <ctrl>+c would copy in most applications; <ctrl>+c<ctrl>+n<ctrl>+v would create a new document containing the selection; <shift>+ubuntu would type the text "Ubuntu")
  4. Press the "Set" button next to "Hotkey". This will bring up a dialog that allows you to determine the key combination you want to map from:

    enter image description here

  5. Select File > Save

An example of a completed configuration (which sends <enter> when you press <ctrl>+m) looks like this:

enter image description here

Share:
204,124

Related videos on Youtube

web.learner
Author by

web.learner

Updated on September 18, 2022

Comments

  • web.learner
    web.learner over 1 year

    I want to change the key bindings on some of the keys on my keyboard. I want some to run commands and others to activate different keys.

    What applications can I use to do this?


    Index:


    I'm still looking for answers using dconf and any other method.

    • BlitZz
      BlitZz almost 11 years
      Does maybe xmacro belong in this answer? it can "Record / Play keystrokes and mouse movements in X displays".
    • web.learner
      web.learner almost 11 years
      @roadmr If I can use it to create custom keyboard shortcuts, then yes!
    • krumpelstiltskin
      krumpelstiltskin over 9 years
      Thanks for adding this thread. I'm looking for a way to use a key just like a mouse button (hold and drag, click, etc). This seems to be missing from the thread.
    • web.learner
      web.learner over 9 years
      @krumpelstiltskin Currently I am unaware of any way to achieve such exact duplication of a mouse. I suggest you ask a new question. If I do figure it out I can still answer there, or someone else might have a better answer :)
    • DJCrashdummy
      DJCrashdummy almost 9 years
      here is a xkb-answer: askubuntu.com/a/347382/354350
    • user165410
      user165410 about 7 years
      One more solution: ACTKBD. Recognizes also different keyboards. so you can work with 2 keyboards and map one of them. users.softlab.ntua.gr/~thkala/projects/actkbd
  • web.learner
    web.learner about 11 years
    Could you add some information about installing it and maybe using it too? That would be awesome!
  • Michael Durrant
    Michael Durrant over 10 years
    Thanks. See also my own answer for some peculiarities about actually setting the keys. Had me mystified at first even though I was in the right place.
  • wim
    wim over 10 years
    I'm on 13.10 and I don't have this 'Text Entry' icon in my System Settings at all. :(
  • Luis Alvarado
    Luis Alvarado over 10 years
    Hi wim can you provide a link to an image that shows your system settings.
  • user6754805
    user6754805 over 9 years
    I prefer this answer to those available on the duplicate question.
  • rubo77
    rubo77 about 9 years
    @VaibhavKaushal: in Step 5 you have to click on the right on "deactivated" then do the shortcut you like, which will be shown there immediately
  • Sonique
    Sonique almost 9 years
    Is it possible with xbindkeys to map Meta+C/V for copy/paste and Meta+Space for language switch?
  • skierpage
    skierpage almost 9 years
    Sadly now we're at 15.04 this answer is a garbled mess. Keyboard Layout is gone, and with it the ability to Kill X Server. The screenshots mix up pre-13.04 (who cares!?!) and later screenshots, and someone inserted them in the wrong place, so "click the Options at the bottom right)" is far from the actual, obsolete, screenshot. :-(
  • Luis Alvarado
    Luis Alvarado almost 9 years
    @skierpage That is why I made this answer: askubuntu.com/questions/367983/… hope it helps.
  • JPi
    JPi over 8 years
    is there a way of attaching a sequence of characters to a single key, e.g. attach "equation" to the volume-up key?
  • web.learner
    web.learner over 8 years
    You mentioned 2 files. What file are the changes made to? :)
  • crisron
    crisron over 8 years
    I mentioned only one file - /usr/share/X11/xkb/symbols/pc.
  • web.learner
    web.learner over 8 years
    My bad. Took me a second look to realize that the first path was a folder, not a file. Edited to make it a tad more obvious :)
  • Shautieh
    Shautieh about 8 years
    +1! I have a korean keyboard atm with no alt-gr key, and I needed it so your answer was very helpful to get it working. For future reference, and as the alt-gr key isn't the simplest to set, here is the command (I used the hanja key, which has the code 130) : xmodmap -e "keycode 130 = ISO_Level3_Shift Multi_key ISO_Level3_Shift Multi_key"
  • Joe
    Joe almost 8 years
    AutoKey has been partially migrated from code.google to GitHub. See github.com/autokey/autokey . There is also a Python 3 branch - github.com/guoci/autokey-py3 .
  • dinosaur
    dinosaur over 7 years
    If you click on the Options button at the bottom right (Found on 13.04 or previous versions)... Where is the options button on versions >13.04?
  • Luis Alvarado
    Luis Alvarado over 7 years
    @dinosaur I think it is a bit late to be asking about 13.04 or less with 6 versions after it already build. If there is an option, right now I would not even remember.
  • dinosaur
    dinosaur over 7 years
    I'm asking about versions after 13.04. In your answer you refer to an options button found on the lower right of the "Keyboard Layout" window in 13.04 and previous versions but you don't say where that button is for versions later than 13.04. Does it exist?
  • Shirley Temple
    Shirley Temple almost 7 years
    Rebooting may be needed for the changes to take effect
  • Joe
    Joe about 5 years
    The current version of AutoKey is at github.com/autokey/autokey The Python 2 branch has been depreciated.
  • wjandrea
    wjandrea about 5 years
    Is uname-n supposed to be uname -n?
  • Mitch
    Mitch about 5 years
    According to the source its unmae-n. I don't have access to an Ubuntu machine to test, but once I do, I'll check further.
  • Joe
    Joe over 4 years
    Note: Currently, Debian (where Ubuntu gets the AutoKey package) is not maintaining their AutoKey package. For current installation instructions, see: github.com/autokey/autokey/wiki/Installing
  • SaTa
    SaTa over 3 years
    Running xmodmap ~/.Xmodmap freezes my terminal on Ubuntu 20.04. Any thoughts?
  • Kevin Bowen
    Kevin Bowen over 3 years
    @SaTa Thanks for the comment. I would recommend asking a new question providing relevant details. I've never had an issue myself. Sorry I couldn't be of more help.
  • Kvothe
    Kvothe over 3 years
    I get the script "Enter" encountered an error. It literally contains nothing but <enter>. (Ubuntu 20.04)
  • Kvothe
    Kvothe over 3 years
    Can this exchange the fn key with another key (not fn key is undetectable by things as xev)?
  • Philippe Paré
    Philippe Paré over 3 years
    For whatever reason on 19.10 this worked for remapping a key in Terminal but not in browsers. Weird...
  • Philippe Paré
    Philippe Paré over 3 years
    This works but not the startup instructions for me. Apparently it's a pain to get it to startup and you practically have to use kbd instead of xmodmap these days... askubuntu.com/questions/325272/…