GNU/Linux / Desktop / Keyboard shortcuts

From WhyNotWiki
Jump to: navigation, search Retrieved on 2007-05-11 11:18.

One of the reasons that I prefer using Vim to a word processor or GUI application is that my hands rarely need to leave the keyboard. I can do all my copying and pasting using Vim keybindings. When it comes to my window manager, I try to do the same thing -- work with tools that let me use the keyboard to navigate as much as possible without having to use the mouse. [...] ...

Context Function Default My preference Easiest way to change
Global Opens a Run Application window... Alt+F2 F1 GNOME Keyboard Shortcuts app
Global Show the panel menu ("start menu") Alt+F1 (in Windows this was Ctrl+Esc or Windows key) Alt+F1 GNOME Keyboard Shortcuts app
Global Open a terminal window (disabled) SuperR GNOME Keyboard Shortcuts app
Global Home folder (opens Nautilus to ~) (disabled) The "Files" button on my Logitech keyboard (0xc6) GNOME Keyboard Shortcuts app
Global Switch to workspace on the left Ctrl+Alt+Left GNOME Keyboard Shortcuts app
Many apps, including Firefox, gnome-terminal Toggle full-screen mode (disabled) Alt+Enter GNOME Keyboard Shortcuts app
Global Minimize all windows and focus the desktop Ctrl+Alt+D Super+D gconf-editor: /apps/metacity/global_keybindings/show_desktop = <Super>d
gnome-terminal Paste from primary clipboard Ctrl+Shift+V (Ctrl+V is simply sent on to the terminal) Ctrl+Shift+V gnome-terminal: menu: Edit -> Keyboard Shortcuts
Global Paste from selection clipboard - Ctrl+Shift+V (See section on this page)
Most apps Copy to primary clipboard Ctrl+C LeftSuper (See section on this page)
Most apps Paste from primary clipboard Ctrl+V CapsLock (See section on this page)


Firefox / Keyboard shortcuts

Firefox / Keyboard shortcuts edit

Start a search on the current page /

How I mapped Ctrl+Shift+V to be middle button (paste from selection clipboard)

Attempt 1: simulating a middle button click using xmacroplay Retrieved on 2007-05-11 11:18.


I like to use a keyboard shortcut (for example, Ctrl+Shift+V) instead of middle_mouse_button in X to paste the selected text. How to bind it? In the terminal window like rxvt i can use Shift+Insert, but it doesn't work in Mozilla address bar. Ctrl+V inserts the text from clipboard but how to place the text selected in rxvt into clipboard?

Dances With Crows,

xbindkeys -k
(press Ctrl-Shift-V, the following is displayed in your konsole
  m:0x5 + c:55
  Control+Shift + v, in your ~/.xbindkeysrc , add the lines

"echo -e 'ButtonPress 2\nButtonRelease 2' | xmacroplay :0 &"
  m:0x5 + c:55

....and the command that starts with 'echo' above will be executed whenever you press Ctrl-Shift-V. This simulates a button 2 event, which is what I think you want here.

This is what I ended up putting in my ~/.xbindkeysrc:

"echo -e 'ButtonPress 2\nButtonRelease 2' | xmacroplay :0 &"
    control+shift + v

Problem: This behaves erratically

I had selected this text in some other window:

Line 1
Line 2

When I pressed Ctrl+Shift+V to paste it, though, this is what was output (notice the extra > characters and the extra newline):

> Line 1
> Line 2

What's even more strange is that sometimes it won't even paste the text at the insertion point/cursor; instead it will move some seemingly random number of lines/characters up or down (usually about 5 lines) and paste there! Weird!

But when I simply use Middle click (which is precisely what this keyboard shortcut should be perfectly emulating) it behaves normally, sanely, intuitively, as-expected-ly.

What's making the difference??

I'm guessing part of it (the part where it moves to a "random" place on the page before pasting) might be simply that the ButtonPress event happens when the mouse is positioned in the "wrong spot". (And I certainly don't know how to generate a MotionNotify event that moves it to just the right place.) Still, how does that explain the mysterious insertion of ">" characters??

Attempt 1.5

"echo -n 'String '`xclip -o` | xmacroplay :0 &"
    control+shift + v

Attempt 2: using xclip to read the clipboard and xmacroplay to replay those characters using the keyboard only (no mouse simulation)


# Paste from "selection clipboard"
    control+shift + v

# Some applications already have Ctrl+Shift+V mapped as a shortcut for something else, so we're not able to use that for pasting from selection buffer without
# conflicting with that shortcut. That is why I have defined an alternate shortcut (Super+V) to access the same command. Apps that already use Ctrl+Shift+V:
# * gnome-terminal maps it to "paste from primary [the other kind of] clipboard"
# * thunderbird maps it to "paste from primary clipboard as quotation"
    Mod2+Mod4 + v

The scripts used were this:


echo -n 'String '
xclip -o


sleep 0.2
~/public/x_windows/bin/simulate_typing_contents_of_middle_click_buffer_2 | xmacroplay :0

At first, while I was testing, I actually had this command mapped to Super+A and I got a wide variety of different results, one of them correct but most of them not. Here are all the different outputs I got after selecting the text abc and then pressing Super+A:


Now that I've thought about it, though, this seems reasonable. Here's my best guess at an explanation: When I press Super+a, it invokes my script, which simulates the pressing of the keys a,b, and c, pressed in fairly rapid succession, but with, I believe, some delay between each one. The only problem with this is, if I'm still holding down the Super key at the instant that it simulates an 'a' keypress, the resulting key combination will actually be Super+a again, which explains why some of the time I got repeated characters (and since the two processes were running independently at the same time, I can see how letters could get out of order, like 'abacbc' instead of simply 'abcabc' (which is what you'd get if you output 'abc' followed by 'abc' sequentially rather than simultaneously)).

Now to explain why some of the time letters were missing: if I was still holding down Super by the time it got to a letter other than a, such as b, then it will actually be pressing Super+B. And since there is no keyboard shortcut assigned to Super+B, the normal behavior of that is to output nothing at all.

So it only output the expected 'abc' if I released Super at the exact right time (as immediately after pressing Super+A as possible). Once I figured that out, I was able to consciously do that and able to get the desired behavior with some consistency. Still, that was very much less than ideal.

So that was just a side-effect of using a modifier key. If I map it to a "normal" key, like F1, that shouldn't happen.

What about if I map it to Ctrl+Shift+v like I said I was going to do?

Well, that suffers from the same problem that Super+a did: if I don't release Ctrl and Shift immediately, it will inadvertently cause Ctrl+Shift+(some arbitrary character) to be pressed instead of simply (some arbitrary character). Since Ctrl+Shift+(some arbitrary character) could very easily be mapped to some command in whatever program we're using (in gnome-terminal, for example Ctrl+Shift+T opens a new tab), this is a dangerous mapping / keyboard shortcut to use.

But, it's also the most intuitive to me, so I want to use it.

What workaround could we use?

How about putting in a delay, to give the user time to release any modifier keys (like Ctrl, Shift, or Super)?

sleep 0.2 seems to do the trick for me.


sleep 0.2
~/public/x_windows/bin/simulate_typing_contents_of_middle_click_buffer_2 | xmacroplay :0

The next problem was that it didn't work for text longer than 1024 characters or with multiple lines. Those need to be broken up into chunks.

Here is my final version:


sleep 0.2
~/public/x_windows/bin/simulate_typing_contents_of_middle_click_buffer_2 | xmacroplay :0


#!/usr/bin/env ruby

max_per_line = 10

contents = `xclip -o`
contents.each_line do |line|
  while (chunk = line.slice!(0..max_per_line)) != '' do
    puts "String #{chunk}"
  puts "KeyStrPress Return"
  puts "KeyStrRelease Return"

This is working great for me.

My only complaint is that it is kind of slow at typing everything out, since there is a delay between each keypress. It's not like middle-clicking, which pastes everything instantly. It's a slower process, that replays the keystrokes very quickly -- faster than I can type -- but slow enough that you can see the words and lines being "typed" out. On the plus side, it's kind of fun to watch your computer "type" things for you...

Ahah! It turns out you can configure that delay. Just use something like this: xmacroplay -d 3 :0.

How I mapped the left Super key to be Ctrl+C and CapsLock key to be Ctrl+V

Optionally, download these:

Then set up your .xbindkeysrc like so:


# Super_L -> Ctrl+C
"sleep 0.2; echo -e 'KeyStrPress Control_L\nKeyStrPress c\nKeyStrRelease c\nKeyStrRelease Control_L' | xmacroplay -d 0 :0 &"

# Shift+Super_L -> Ctrl+X
"sleep 0.1; echo -e 'KeyStrPress Control_L\nKeyStrPress x\nKeyStrRelease x\nKeyStrRelease Control_L' | xmacroplay -d 0 :0 &"
    Shift + Super_L

# Caps_Lock -> Ctrl+V
"sleep 0.1; echo -e 'KeyStrPress Control_L\nKeyStrPress v\nKeyStrRelease v\nKeyStrRelease Control_L' | xmacroplay -d 0 :0 &"

I again had the problem of things not working right unless I added a delay. Apparently the playback by xmacroplay gets messed up if Super_L and Caps_Lock are still being held down at the time it begins the playback. Any way to work around that??

Having Shift+Super_L behave differently from Super_L is difficult (impossible?)

So it seems that there is no short-circuiting of bindings when it comes to bindings via xbindkeys: in other words, if there's a binding for A and a binding for Super+A, then if you press Super+A, it will execute both of those bindings, not just the "most specific" of the two.

How should it behave? Should it only execute the first matching combination in order, the combination with the most matching components/modifiers/keys, all matching bindings, ... what??

If it executes all of them, then there should be a way to say "only execute this if Super is not being held down right now".

Does it behave any differently if I use metacity's global_keybindings feature?

No, it didn't seem to. Here's what I had:

  • global_keybindings
    • run_command_1 = Super_L
    • run_command_2 = <Shift>Super_L
  • keybinding_commands
    • command_1 = /home/tyler/public/x_windows/bin/simulate_ctrl_c
    • command_2 = /home/tyler/public/x_windows/bin/simulate_ctrl_x

Workaround 1: "Overlap" bindings; make sure they're "safe" to use together; use delays so that the last one "wins out"

Yuck. Yeah, it's yucky, but this is how I'm currently doing it... Can someone suggest a better way??

  1. Super_L -> Ctrl+C

"sleep 0.1; echo -e 'KeyStrPress Control_L\nKeyStrPress c\nKeyStrRelease c\nKeyStrRelease Control_L' | xmacroplay -d 0 :0 &"

  1. Shift+Super_L -> Ctrl+X

"sleep 0.1; echo -e 'KeyStrPress Control_L\nKeyStrPress x\nKeyStrRelease x\nKeyStrRelease Control_L' | xmacroplay -d 0 :0 &"

   Shift + Super_L

The Super_L command gets executed even when I press Shift+Super_L. But that's not a problem: it's okay to press Ctrl+C before pressing Ctrl+X because a Ctrl+X is essentially a Ctrl+C followed by a Delete anyway...

With this setup, however, Shift+Super only works if you press it and then let go really quickly -- otherwise, it will only do the Ctrl+C (actually, it doesn't appear to even do that successfully -- must be the Shift key being held down interfering again with the xmacroplay playback).

I found that I can make }the tolerance for holding it down longer} greater simply be adjusting the sleep for the Shift+Super_L to a higher delay -- something like 1 second, for instance. But that makes it less usable, so I settled for just keeping them the same and just resigning myself to always being really quick whenever I press Shift+Super_L.

Conclusion: AutoHotKey was better for this

It worked a lot more reliably, and didn't suffer from these problems. Unfortunately, AutoHotKey is only for Windows.

How to prevent the original key from passing through

For example, if you want to map Ctrl+Shift+Q to be some command of your choosing but gnome-terminal already has that mapped to Quit, then how do you make it so Ctrl+Shift+Q will only run your new command and will not quit the terminal when it has the focus?

It seems like you'd need some way to not only intercept the keystroke event before any other applications receive it but also a way to remove it from the event queue, to block/prevent it from being sent to other apps.

How to remap keys / Change keyboard shortcuts

Master Your Linux Keyboard (And Fix Caps Lock Forever): XBindKeys For Launching Applications ( Retrieved on 2007-05-11 11:18.

KDE and GNOME, window managers like IceWM and Fluxbox, and many applications come with their own set of prefab keybindings. You should investigate these before going on a customization spree, or you run the risk of creating conflicts. We're going to learn how to use XBindKeys. XBindKeys is not dependent on any particular desktop or window manager, and should run on pretty much any Linux or Unix system." Retrieved on 2007-05-11 11:18.

I live and die by xbindkeys and xautomation. They allow me to easily map and remap the 9 extra buttons on my mouse, something that I couldn't figure out how to do in Windows. I'm almost always using my laptop while in bed, so I like to be able to do everything with one hand. I even have profiles saved and automatically change depending on the situation, so click-wheel left and right scroll through tabs in Firefox and Konqueror, change the page in KPDF and skip -/+ 10 seconds in VLC. Very useful stuff.

How to remap keys with xmodmap Retrieved on 2007-05-11 11:18.

Unlike Windows, all the infrastructure to remap the keyboard is already embedded in the X11 server. The program to modify key and button mapping in X11 is called “xmodmap”, and comes pre-installed.




First, you need to map the keys to X keysyms. There are in-depth instructions on the linux-thinkpad mailing list, but all you need to do is add these two lines to ~/.Xmodmap:

keycode 234 = F19
keycode 233 = F20


Fire up your favorite text editor and open the content/browser/browser.xul file.


<key id="goBackKb"  keycode="VK_F19"
<key id="goForwardKb"  keycode="VK_F20"
     command="Browser:Forward"/> Retrieved on 2007-05-11 11:18.

To get the windows key to be interpreted as one key, do this: Make a task that starts with the session (I don't know how you do this in GNOME) by creating a new link to application in your ~/.kde/Autostart directory. Make it so that it runs the following command: xmodmap ~/.xmodmap Now we need to create a plain text file in your home folder called .xmodmap and make sure it says the following in it:

keycode 115 = F13 keycode 116 = F14

The second line is only needed if your keyboard has two windows keys. Essentially, this maps these keys to the two imaginary keys F13 and F14, so you don't need to worry about the Win + something problem anymore. 115 and 116 are the keycodes that I've seen most, if not all, keyboards give for the winkeys. Check by running xev if it is the same for you. I got this from somewhere else long ago, so don't give the credit to me for it.

I don't think that's actually necessary (any more?). Using Ubuntu's "Keyboard Shortcuts" app, I was able to map "Super R" (the right Linux key) to a desired command, without doing all that stuff e mentioned. Retrieved on 2007-05-11 11:18.

... The secret's in the built-in Configuration Editor, a Windows registry-like application where you can edit global key bindings and add custom ones to particular scripts and executables. ...

I've found that attempting certain key combinations won't work well through the Configuration Editor. It seems to do odd things with the Win Key (Super or Mod4 for me). Plus, you're somewhat limited in the number of commands you can have. I've been using xbindkeys (and xbindkeys-config) and while the the version in the Ubuntu repository is old, and the interface is ugly, it works quite simply.

How to make a keyboard shortcut for an arbitrary command


gconf-editor Retrieved on 2007-05-11 11:18.

It took a bit of digging to figure how to add keyboard shortcuts to run arbitrary commands. Here are the steps in case someone else needs them:

  • start the GConf Editor: Applications / System Tools / Configuration Editor
  • go to /apps/metacity/keybinding_commands
  • edit command_1, set it to some command, like kdocker -f
  • go to /apps/metacity/global_keybindings
  • edit run_command_1, set it to a key combination, like <Super>z or <Shift>F1

You can accomplish that with xbindkeys also. I prefer that way, because you can keep the same shortcuts between desktop environments/window managers. You just have to be sure that xbindkeys is running on startup.

$ echo 'String echo hello world' | xmacroplay :0 >/dev/null 2>/dev/null; echo
echo hello world
$ echo hello world


I've found you can get yourself in trouble if you leave an old instance of xbindkeys running and then try to start another one.

This should be the first thing you check if, for instance, you find that you're unable to remove a particular mapping. If you've removed it from ~/.xbindkeysrc and then started xbindkeys but it still seems to be mapped, then you may have an old instance of xbindkeys still running.

This is the command line I use to restart xbindkeys:

pkill xbindkeys; xbindkeys; ps ux|grep xbindkeys

(or kill `pidof kbindkeys`; xbindkeys)

Somebody please let me know if there is a better way.

How to make a keyboard shortcut invoke another keyboard shortcut (key combination) Retrieved on 2007-05-11 11:18.

This is my .xbindkeysrc:

# Backward and Forward buttons
# "xvkbd -text "\A\[Left]"" # freezes firefox and makes mouse cursor jump
"echo -e 'KeyStrPress Alt_L\nKeyStrPress Left\nKeyStrRelease Left\nKeyStrRelease Alt_L' | xmacroplay :0 &" #better
  m:0x10 + b:8"
#"xvkbd -text "\A\[Right]""
"echo -e 'KeyStrPress Alt_L\nKeyStrPress Right\nKeyStrRelease Right\nKeyStrRelease Alt_L' | xmacroplay :0 &"
  m:0x10 + b:9

See more at #xmacroplay


Have used: Yes
Rating: star_full.gif star_full.gif star_empty.gif

Download from:

Readiness: Seems pretty stable for the most part; even though the latest release was "pre0.3 Notes (2001-06-12 04:31)"

In Windows, the API provides the SendKeys function, which many scripting/automation/macro techniques take advantage. Would would the equivalent be in GNU/Linux/X?

Looks like it would be xmacroplay! Retrieved on 2007-05-11 11:18.

It sends events to the whole server, not a specific app, so you'd need to do something to force focus. Possible wmctrl or something like it could help. Retrieved on 2007-05-11 11:18.

$ sudo apt-get install xmacro
$ xmacrorec2 > my.macro
{Press [Scroll Lock] key. Type your keystrokes and do your optional
mouse events that you want to record. Press [Scroll Lock] key again to
stop the recording.}
$ vi my.macro
{Edit this file and remove out any lines that you don't want or need.}
$ cat my.macro | xmacroplay ":0.0"

Question: What's the difference between xmacrorec and xmacrorec2?

Do you mean other than the surface difference that xmacrorec requires you to specify remote_display and xmacrorec2 doesn't?

$ xmacrorec -h
xmacrorec 0.3
Usage: xmacrorec [options] remote_display
  -d  DELAY   delay in milliseconds for events sent to remote display.
              Default: 10ms.
  -s  FACTOR  scalefactor for coordinates. Default: 1.0.
  -k  KEYCODE the keycode for the key used for quitting.
  -v          show version. 
  -h          this help. 

$ xmacrorec2 -h
xmacrorec2 0.3
Usage: xmacrorec2 [options] 
  -s  FACTOR  scalefactor for coordinates. Default: 1.0.
  -k  KEYCODE the keycode for the key used for quitting.
  -v          show version. 
  -h          this help. 

I'm not sure!!

Troubleshooting: "Unknown tag: _" with xmacroplay

I get this almost every time I use xmacroplay from the command line (I don't "get it" when I have it mapped to a shortcut key with xbindkeys because I don't see any output then...).

Even with input generated by its sister command xmacrorec (which surely, it could be argued, ought not to generate as output anything that is not valid input to xmacroplay!)...

Even with the simplest examples...

 echo -e 'KeyStr a' | xmacroplay :0
XTest for server ":0.0" is version 2.2.

KeyStr: a
Unknown tag: a
axmacroplay: pointer and keyboard released. 

It gives that warning, as if something were the matter -- yet it still seems to function properly... gives abysmally few results.

The only search result that seemed relevant (but very relevant it does seem!) was this one:

diff -urN xmacro-pre0.3-20000911.orig/xmacroplay.cpp xmacro-pre0.3-20000911/xmacroplay.cpp
--- xmacro-pre0.3-20000911.orig/xmacroplay.cpp  2000-09-11 20:25:11.000000000 +0200
+++ xmacro-pre0.3-20000911/xmacroplay.cpp       2003-05-19 01:24:58.000000000 +0200
@@ -335,6 +335,7 @@
   while ( !cin.eof() ) {
        cin >> ev;
+       if (cin.eof()) break;
        if (ev[0]=='#')
          cout << "Comment: " << ev << endl;

So someone else noticed this warning, noticed that it shouldn't be outputting a warning (if the filename, 01-suppress-false-unknown-tag-message.patch, is any indication), and wrote a patch to suppress it... sweet! Too bad nobody has incorporated it into the trunk yet (that I've noticed).

System -> Preferences -> Keyboard Shortcuts

It looks like the equivalent in gconf-editor is /apps/metacity/global_keybindings.

The "Windows"/Super keys

... is the "super" key in Linux. Or, I suppose, the "Linux" key.

How to use combinations involving the Super key in .xbindkeysrc

$ xbindkeys -k
[I pressed Super+V]
    m:0x50 + c:60
    Mod2+Mod4 + v

How to use the Super keys as modifier keys rather than stand-alone keys

When I try click on an action in the Keyboard Shortcuts window and then press, say, Super+D as my new keyboard shortcut for that action, it stops as soon as I've pressed Super and says "Super L".

How do I get around that?

Maybe edit those settings directly using "gconf-editor" and put "<Super>d" as the shortcut key for that action...? Yes, I have confirmed that that works!

How to disable the capslock key (keep it from toggling the capslock state of your keyboard) Retrieved on 2007-05-11 11:18.

Kill capslock I hate the capslock I never use the Caps Lock button. Never. The only time I "use" it is when I accidently press it and start typing things in UPPERCASE. To disable it in Linux all you have to do is enter this on the command line:

$ xmodmap -e "remove lock = Caps_Lock"

To set this permanently, just stick the above line in your ~/.bashrc file (or /etc/bash.bashrc if you're root) so that it looks something like this:

if [ "$PS1" ]; then
# Disables the bloody CapsLock button
xmodmap -e "remove lock = Caps_Lock"
fi Retrieved on 2007-05-11 11:18.

Want to get rid of the evil caps lock key without mutilating your keyboard? Want to give those silly Windows keys useful jobs, or put all those extra multi-media keys to work? Want to become a powerhouse keyboarding commando? Then come along and join the fun, because Linux has all kinds of good tools for taming wayward keyboards and increasing your efficiency. In this two-part series we're going to use xmodmap, XBindKeys, and KeyTouch to create custom keybindings for launching applications and running commands. The placement of the caps lock key is a demonstration of malicious cunning. It's above the shift key and it's usually oversized, so it's way too easy to hit it when you don't want to, which for me is all the time. On a case-sensitive operating system it's not all that useful anyway. Unhappy users often resort to remedies like prying it off entirely or covering it with duct tape. You can do this if you're careful, but elite geeks resort to more sophisticated measures that do not mangle their nice keyboards. It's not the fault of the keyboards that manufacturers have giant Windows-sized blind spots, and as always, Linux makes lemonade out of lemons and provides useful alternatives.

Xmodmap (or how I hate Caps Lock) ( Retrieved on 2007-05-11 11:18.

The caps lock key belongs on the back of the monitor,

In a safe,
At the bottom of the ocean...
On Venus.

—P-Pomes, Nov 1993

Question: Can you still use the capslock key for other things once you've "disabled" it? Yes! By all means! Map it to something useful, like Control [1] or Escape or Ctrl-C ... anything but capslock!

Now how do I undisable it?


xmodmap -e "add lock = Caps_Lock"

"Special" keys, "Multimedia keys" Retrieved on 2007-05-11 11:18.

        atkbd.c: Unknown key pressed (translated set 2, code 0x9e on isa0060/serio0).
        atkbd.c: Use 'setkeycodes e01e <keycode>' to make it known.


A little background note: When you hit a key on your keyboard, the linux kernel generates a raw scancode for it (if it's assigned). Each scancode can be mapped to a keycode. This is at kernel level. X has a (quasi) total independent way of mapping keys: X reads the kernel keycode table at startup, then map the keycode to its independent keycode table (it's the same as the kernel keycodes but different :)). Then each keycode can be mapped to a keysym, i.e. a string which represent a key or suggest an action. Thus to have our keys fully functional, they need a kernel scancode/keycode plus a X keycode/keysym. It could seem weird, and it is, but X developers have their reason to keep a separate keyboard mapping from the kernel. It's not difficult at all, it's only a quite tedious procedure. Retrieved on 2007-05-11 11:18.

If your keyboard is not supported by Xkb, then you want to find the keycodes for your multimedia keys. If it is supported, then you may want to find out to which keysym names the keys are mapped. This can both be done with the same tool: xev. Open a terminal, and just do:

$ xev



Personal tools