How can I change what keys on my keyboard do? (How can I create custom keyboard commands/shortcuts?)
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>"
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:
Then select System Settings:
Here you will find 2 options that can send you to the Shortcut Creation section.
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.
If you select the Keyboard option, you would have to click on the Shortcuts Tab
After arriving at the Shortcuts tabs, you would select the Custom Shortcuts at the bottom of the list in the left side:
And then click on the Plus Sign at the bottom in order to start creating your very own Shortcut:
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
.
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:
We would then click on the "Disabled" message in order to add a key combination to it:
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.
After which, you can simply test your combination by pressing the corresponding key combination and seeing the app open:
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 Settings → Keboard, 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:
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:
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
- Select File > New > Phrase .
- Make sure "Paste using" is set to "Keyboard".
-
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")
-
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:
Select File > Save
An example of a completed configuration (which sends <enter>
when you press <ctrl>+m
) looks like this:
Related videos on Youtube
web.learner
Updated on September 18, 2022Comments
-
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:
Default keyboard and shortcut settings (from within System Settings)
- xkb
I'm still looking for answers using dconf and any other method.
-
BlitZz almost 11 yearsDoes maybe xmacro belong in this answer? it can "Record / Play keystrokes and mouse movements in X displays".
-
web.learner almost 11 years@roadmr If I can use it to create custom keyboard shortcuts, then yes!
-
krumpelstiltskin over 9 yearsThanks 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 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 almost 9 yearshere is a
xkb
-answer: askubuntu.com/a/347382/354350 -
user165410 about 7 yearsOne 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 about 11 yearsCould you add some information about installing it and maybe using it too? That would be awesome!
-
Michael Durrant over 10 yearsThanks. 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 over 10 yearsI'm on 13.10 and I don't have this 'Text Entry' icon in my System Settings at all. :(
-
Luis Alvarado over 10 yearsHi wim can you provide a link to an image that shows your system settings.
-
user6754805 over 9 yearsI prefer this answer to those available on the duplicate question.
-
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 almost 9 yearsIs it possible with xbindkeys to map Meta+C/V for copy/paste and Meta+Space for language switch?
-
skierpage almost 9 yearsSadly 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 almost 9 years@skierpage That is why I made this answer: askubuntu.com/questions/367983/… hope it helps.
-
JPi over 8 yearsis there a way of attaching a sequence of characters to a single key, e.g. attach "equation" to the volume-up key?
-
web.learner over 8 yearsYou mentioned 2 files. What file are the changes made to? :)
-
crisron over 8 yearsI mentioned only one file -
/usr/share/X11/xkb/symbols/pc
. -
web.learner over 8 yearsMy 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 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 almost 8 yearsAutoKey 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 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 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 over 7 yearsI'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 almost 7 yearsRebooting may be needed for the changes to take effect
-
Joe about 5 yearsThe current version of AutoKey is at github.com/autokey/autokey The Python 2 branch has been depreciated.
-
wjandrea about 5 yearsIs
uname-n
supposed to beuname -n
? -
Mitch about 5 yearsAccording 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 over 4 yearsNote: 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 over 3 yearsRunning
xmodmap ~/.Xmodmap
freezes my terminal on Ubuntu 20.04. Any thoughts? -
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 over 3 yearsI get the script "Enter" encountered an error. It literally contains nothing but <enter>. (Ubuntu 20.04)
-
Kvothe over 3 yearsCan this exchange the fn key with another key (not fn key is undetectable by things as xev)?
-
Philippe Paré over 3 yearsFor whatever reason on 19.10 this worked for remapping a key in Terminal but not in browsers. Weird...
-
Philippe Paré over 3 yearsThis 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/…