Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

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 xkb, dconf and any other method.

share|improve this question

This question has an open bounty worth +50 reputation from RPi_Awesomeness ending in 4 days.

This question has not received enough attention.

This question needs more answers regarding XKB and dconf specifically - as well as any other methods not yet mentioned or methods that are mentioned and need updating.

    
Does maybe xmacro belong in this answer? it can "Record / Play keystrokes and mouse movements in X displays". –  roadmr Jun 6 '13 at 13:57
    
@roadmr If I can use it to create custom keyboard shortcuts, then yes! –  Seth Jun 12 '13 at 14:10
    
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. –  krumpelstiltskin Nov 13 at 16:49
    
@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 :) –  Seth Nov 14 at 20:03

7 Answers 7

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.

share|improve this answer

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).

The application will initialize, display a number of lines, and start a blank window. 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 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

    xmodmap -e "keycode 66 = Escape"
  • This command modifies the Caps Lock to use the same behavior as Esc

    xmodmap -pke > ~/.Xmodmap
    
  • *This option print keymap table as expressions into the file ~/.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 usingmod2 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

share|improve this answer

By default (This is just to complement the Excellent answer by Seth), Ubuntu has 2 categories that come by default in the System Settings:

enter image description here

On 13.10+ the Keyboard Layout will be named Text Entry and will look like this:

enter image description here

Keyboard Layout

Apart from giving the user the option to add additional language layouts to the keyboard, it also offers some neat global benefits like:

  • Shortcut to change keyboard layout
  • Kill X Server (In case everything graphical locks up or Nautilus, Unity or Compiz starts to behave weird). It is also a quick way to do what I call a "Semi Reboot" or "Half Reboot".
  • Assign special options for some keys
  • Many others in the Options Window...

    enter image description here

On 13.10+ the Text Entry will offer, apart from the tradional Keyboard Layouts, the option to select which shortcut will change your layout from one to another:

enter image description here

Here you can see 2 layouts (English and Spanish). If you click on the Options button at the bottom right (Found on 13.04 or previous versions) you will be greeted with the following Window:

enter image description here

Keyboard

In here you can select speed at which the cursor blinks, how long to wait to repeat a key that is hold pressed and even some common shortcuts (In the Shortcuts Tab):

enter image description here

Here you can see some common options like Multimedia, Launcher keys, Windows Keys and others.

enter image description here

You can even create your own Custom key, select the Custom option in the Left panel and then click on the plus sign (+). You can now type in the name of the key, assign a command to it (Like gnome-calculator) and after creation assign a hotkey to it. Now you have a quick way to open your calculator.

enter image description here

Apart from this we can find information for Keybindings that give some information into each category in the Keyboard Window.

Also, in the cases where there is a problem getting to the System Settings (Video issue, not able to click with the mouse, etc..), you can get to them via a terminal. Simply get a terminal opened and:

gnome-control-center - Will open the System Settings

gnome-control-center keyboard - Will go directly to the Keyboard Window

gnome-control-center region - Will go directly to the Keyboard Layout Window

man gnome-control-center - Will provided information for other System Setting options.

share|improve this answer
    
You might want to update this answer since some of the options in "Keyboard Layout" are no longer there in newer versions of Ubuntu –  Seth Feb 3 at 19:34
    
Will do thanks friend. –  Luis Alvarado Feb 3 at 20:01
    
I'm on 13.10 and I don't have this 'Text Entry' icon in my System Settings at all. :( –  wim Feb 5 at 2:13
    
Hi wim can you provide a link to an image that shows your system settings. –  Luis Alvarado Feb 5 at 2:31

Try this:

Install a program called XKeyCaps. To install, just press Ctrl+Alt+T on your keyboard to open Terminal. When it opens, run the command(s) below:

sudo apt-get install xkeycaps

Once installed, you can do xkeycaps at the prompt to run the program. Once it runs, choose the right keyboard layout, and click OK

enter image description here

Then when you get the keyboard on the screen right click the key that you want, in your case its the S, and choose exchange keys.

enter image description here

Make sure to add the line below to your sessions so it autostarts each time you boot up.

xmodmap ~/.xmodmap-`uname-n`

Source: UFM ytsejam1138

share|improve this answer

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|improve this answer

If you just want to remap keys, the other answers are great.

However, there's another way to approach it. AutoKey is a keyboard macro processor that allows you to associate any key/modifier combination with a macro that can do almost anything you can do from your keyboard and a lot more.

AutoKey has a macro recorder and a simple way to enter basic key sequences, but its macros are written in python and can do almost anything you can code.

The simplest way to use it is to have it send keystrokes to your applications/desktop. When used this way, the system/applications cannot tell that it's not you typing, so there is no api or other interface needed, they just do what "you" typed.

AutoKey can also process phrases. When you type a triggering character string, it can substitute new text for that string (either immediately or after you type a separator character like a newline or tab.)

It also has window filters so that you can restrict a particular phrase or macro to only run in particular types of windows (like ones that have Mozilla in the title so they work only in things like Firefox or Thunderbird).

AutoKey currently has gtk and qt versions.

Edits:

Installation Guide This is very detailed. We tried to make it accessible to both beginners and experts

User Forum Active user forum.

There was a place for contributed scripts, but it seems to have gone away. I'll check into that. Because it's primarily a gui app with a lot of options, examples would require a lot of screenshots and a whole article.

I have a phrase defined so that when I type Jmail!, it instantly replaces it with my rather long email address.

I wrote a macro that is triggered by typing Ctrl-P which is only active in windows that have "Mozilla" in their title. Typing Ctrl-P brings up the (Firefox or Thunderbird) print dialog, selects Print to File and then fills in the name of the next available print file in my print queue (I number them 01, 02, ... and the script reads the queue directory, finds the last file number and increments it by 1). I use it with my duplex printing emulation software (duplexpr) to eliminate a ton of keystrokes and mouse movements (just with keyboard stuff, AutoKey doesn't natively emit mouse events).

I have seen some other macros from gamers that let them access information about their character and resources very quickly so they can stay focused on the action.

share|improve this answer
1  
Could you add some information about installing it and maybe using it too? That would be awesome! –  Seth Feb 13 '13 at 21:48

USING KEYBOARD KEYS AS MOUSE BUTTONS

You may want to map a keyboard key to a mouse button. If you want to click using a keyboard key (useful if you have a macbook or a bad trackpad button) then you can do the following.

  1. install some utilities:

    sudo apt-get install x11-utils xkbset x11-xserver-utils
    
  2. find the keycode for the key you want to map:

    • type xev | grep keycode in the terminal
    • press the key of interest and a line like this will appear:

      state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,  
      
  3. using the keycode, remap the key to do the same as the left mouse button:

    • xkbset m
    • xmodmap -e "keycode 64 = Pointer_Button1"

Pointer_Button3 is the right mouse button and Pointer_Button2 is the middle.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.