alols / xcape

Linux utility to configure modifier keys to act as other keys when pressed and released on their own.
GNU General Public License v3.0
2.1k stars 117 forks source link

XCAPE

xcape allows you to use a modifier key as another key when pressed and released on its own. Note that it is slightly slower than pressing the original key, because the pressed event does not occur until the key is released. The default behaviour is to generate the Escape key when Left Control is pressed and released on its own. (If you don't understand why anybody would want this, I'm guessing that Vim is not your favourite text editor ;)

Minimal building instructions

First install the development dependencies. On Debian-based systems (including Ubuntu and Linux Mint), run:

$ sudo apt-get install git gcc make pkg-config libx11-dev libxtst-dev libxi-dev

On Fedora-based systems, run:

$ sudo dnf install git gcc make pkgconfig libX11-devel libXtst-devel libXi-devel

Then run:

$ git clone https://github.com/alols/xcape.git
$ cd xcape
$ make
$ sudo make install

Usage

$ xcape [-d] [-f] [-t <timeout ms>] [-e <map-expression>]

-d

Debug mode. Does not fork into the background. Prints debug information.

-f

Foreground mode. Does not fork into the background.

-t <timeout ms>

If you hold a key longer than this timeout, xcape will not generate a key event. Default is 500 ms.

-e <map-expression>

The expression has the grammar 'ModKey=Key[|OtherKey][;NextExpression]'

The list of key names is found in the header file X11/keysymdef.h (remove the XK_ prefix). Note that due to limitations of X11 shifted keys must be specified as a shift key followed by the key to be pressed rather than the actual name of the character. For example to generate "{" the expression 'ModKey=Shift_L|bracketleft' could be used (assuming that you have a key with "{" above "[").

You can also specify keys in decimal (prefix #), octal (#0), or hexadecimal (#0x). They will be interpreted as keycodes unless no corresponding key name is found.

Examples

Note regarding xmodmap

If you are in the habit of remapping keycodes to keysyms (eg, using xmodmap), there are two issues you may encounter.

  1. You will need to restart xcape after every time you modify the mapping from keycodes to keysyms (eg, with xmodmap), or xcape will still use the old mapping.

  2. The key you wish to send must have a defined keycode. So for example, with the default mapping Control_L=Escape, you still need an escape key defined in your xmodmap mapping. (I get around this by using 255, which my keyboard cannot send).

Contact

Find the latest version at https://github.com/alols/xcape

The author can be reached at albin dot olsson at gmail dot com