{"id":13611764,"url":"https://github.com/xremap/xremap","last_synced_at":"2026-05-02T13:02:34.524Z","repository":{"id":37686746,"uuid":"75132102","full_name":"xremap/xremap","owner":"xremap","description":"Key remapper for X11 and Wayland","archived":false,"fork":false,"pushed_at":"2026-05-01T21:05:48.000Z","size":1284,"stargazers_count":2085,"open_issues_count":5,"forks_count":121,"subscribers_count":16,"default_branch":"master","last_synced_at":"2026-05-01T22:24:23.168Z","etag":null,"topics":["keyboard-shortcuts","linux","wayland","x11"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xremap.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"k0kubun"}},"created_at":"2016-11-29T23:32:45.000Z","updated_at":"2026-05-01T21:09:37.000Z","dependencies_parsed_at":"2023-09-22T08:44:58.955Z","dependency_job_id":"948b4cdd-f550-4eb3-9956-0d27d865f604","html_url":"https://github.com/xremap/xremap","commit_stats":{"total_commits":597,"total_committers":44,"mean_commits":"13.568181818181818","dds":0.3785594639865997,"last_synced_commit":"75da3361e2584141c4dc6926d93148cbfeeaa117"},"previous_names":["xremap/xremap","k0kubun/xremap"],"tags_count":120,"template":false,"template_full_name":null,"purl":"pkg:github/xremap/xremap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xremap%2Fxremap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xremap%2Fxremap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xremap%2Fxremap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xremap%2Fxremap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xremap","download_url":"https://codeload.github.com/xremap/xremap/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xremap%2Fxremap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32534972,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T12:25:33.646Z","status":"ssl_error","status_checked_at":"2026-05-02T12:24:51.733Z","response_time":132,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["keyboard-shortcuts","linux","wayland","x11"],"created_at":"2024-08-01T19:02:05.478Z","updated_at":"2026-05-02T13:02:34.516Z","avatar_url":"https://github.com/xremap.png","language":"Rust","funding_links":["https://github.com/sponsors/k0kubun"],"categories":["Rust"],"sub_categories":[],"readme":"# \u003cimg src='.github/xremap.png' style='height: 32px; margin-top: 8px; margin-bottom: -4px;' alt='Xremap'\u003e :keyboard:\n\n![crates.io](https://img.shields.io/crates/v/xremap) [![GitHub Actions](https://github.com/k0kubun/xremap/actions/workflows/build.yml/badge.svg)](https://github.com/k0kubun/xremap/actions/workflows/build.yml)\n\n`xremap` is a key remapper for Linux. Unlike `xmodmap`, it supports app-specific remapping and Wayland.\n\n## Table of contents\n\n- [Concept](#Concept)\n- [Features](#Features)\n- [Installation](#Installation)\n- [Usage](#Usage)\n- [Configuration](#Configuration)\n- [Commandline arguments](#Commandline-arguments)\n- [Documentation](doc/README.md)\n- [Troubleshooting](doc/troubleshooting.md)\n- [Maintainers](#Maintainers)\n- [License](#License)\n\n## Concept\n\n- **Fast** - Xremap is written in Rust, which is faster than JIT-less interpreters like Python.\n\n- **Cross-platform** - Xremap uses `evdev` and `uinput`, which works whether you use X11 or Wayland.\n\n- **Language-agnostic** - The config is JSON-compatible. Generate it from any language,\n  e.g. [Ruby](https://github.com/xremap/xremap-ruby), [Python](https://github.com/xremap/xremap-python).\n\n## Features\n\n- Remap any keys, e.g. Ctrl or CapsLock.\n- Remap any key combination to another, even to a key sequence.\n- Remap a key sequence as well. You could do something like Emacs's `C-x C-c`.\n- Remap a key to two different keys depending on whether it's pressed alone or held.\n- Application-specific remapping. Even if it's not supported by your application, xremap can.\n- Device-specific remapping.\n- Automatically remap newly connected devices by starting xremap with `--watch`.\n- Support [Emacs-like key remapping](example/emacs.yml), including the mark mode.\n- Trigger commands on key press/release events.\n- Use a non-modifier key as a virtual modifier key.\n\n## Installation\n\nDownload a binary from [Releases](https://github.com/k0kubun/xremap/releases).\n\nIf it doesn't work, please [install Rust](https://doc.rust-lang.org/cargo/getting-started/installation.html)\nand run one of the following commands:\n\n```bash\ncargo install xremap --features x11     # X11\ncargo install xremap --features gnome   # GNOME Wayland\ncargo install xremap --features kde     # KDE-Plasma Wayland\ncargo install xremap --features wlroots # Sway, Wayfire, etc.\ncargo install xremap --features hypr    # Hyprland\ncargo install xremap --features niri    # Niri\ncargo install xremap --features cosmic  # COSMIC Wayland\ncargo install xremap --features socket  # Variant for system service\ncargo install xremap                    # Others\n```\n\nYou may also need to install `libx11-dev` to run `xremap` for X11.\n\nYou may find a list of supported compositors for wlroots [here](https://wayland.app/protocols/wlr-foreign-toplevel-management-unstable-v1#compositor-support).\n\n### Arch Linux\n\nIf you are on Arch Linux and X11, you can install [xremap-x11-bin](https://aur.archlinux.org/packages/xremap-x11-bin/) from AUR.\n\n### NixOS\n\nIf you are using NixOS, xremap can be installed and configured through a [flake](https://github.com/xremap/nix-flake/).\n\n### Fedora Linux\n\nIf you are using Fedora, xremap can be installed via this [Fedora Copr](https://copr.fedorainfracloud.org/coprs/blakegardner/xremap/) repository.\n\n## Usage\n\nWrite [a config file](#Configuration) directly, or generate it with\n[xremap-ruby](https://github.com/xremap/xremap-ruby) or [xremap-python](https://github.com/xremap/xremap-python).\n\nIf something isn't working take a look at the [troubleshooting section](doc/troubleshooting.md)\n\n### Run with sudo\n\nFirst perform these installation instructions: [Running xremap with sudo](doc/running_with_sudo.md)\n\n```\nsudo xremap config.yml\n```\n\n### Run without sudo\n\nFirst perform these installation instructions: [Running xremap without sudo](doc/running_without_sudo.md)\n\n```\nxremap config.yml\n```\n\n## Configuration\n\nYour `config.yml` should look like this:\n\n```yml\nmodmap:\n  - name: Except Chrome\n    application:\n      not: Google-chrome\n    remap:\n      CapsLock: Esc\nkeymap:\n  - name: Emacs binding\n    application:\n      only: Slack\n    remap:\n      C-b: left\n      C-f: right\n      C-p: up\n      C-n: down\n```\n\nSee also: [example/config.yml](example/config.yml) and [example/emacs.yml](example/emacs.yml)\n\nThe configuration file has 3 parts. `modmap`, `keymap` and [Configuration options](doc/reference_config_options.md). `modmap` and `keymap` are described below.\n\n### modmap\n\n`modmap` is for key-to-key remapping like xmodmap.\nNote that remapping a key to a modifier key, e.g. CapsLock to Control_L,\nis supported only in `modmap` since `keymap` handles modifier keys differently.\n\n```yml\nmodmap:\n  - name: Name # Optional\n    remap: # Required\n      # Replace a key with another\n      KEY_XXX1: KEY_YYY # Required\n      # Replace a key with multiple keys (pressed and released simultaneously)\n      KEY_XXX2: [KEY_YYY, KEY_ZZZ]\n      # Dispatch different keys depending on whether you hold it or press it alone\n      # Disable a key\n      KEY_XXX3: []\n      KEY_XXX4:\n        held: KEY_YYY # Required, also accepts arrays\n        alone: KEY_ZZZ # Required, also accepts arrays\n        hold_threshold_millis: 100 # Optional, defaults to 0\n        alone_timeout_millis: 1000 # Optional, defaults to 1000\n      # Hook `keymap` action on key press/release events.\n      KEY_XXX5:\n        skip_key_event: true # Optional, skip original key event, defaults to false\n        press: [{ press: KEY_YYY }, { launch: [\"xdotool\", \"mousemove\", \"0\", \"7200\"] }] # Optional, default to no action\n        repeat: { repeat: KEY_YYY } # Optional, default to no action\n        release: [{ release: KEY_YYY }, { set_mode: my_mode }] # Optional, default to no action\n    application: # Optional\n      not: [Application, ...]\n      # or\n      only: [Application, ...]\n    window: # Optional\n      not: [/regex of window title/, ...]\n      # or\n      only: [/regex of window title/, ...]\n    device: # Optional\n      not: [Device, ...]\n      # or\n      only: [Device, ...]\n    mode: default # Optional\n    # or\n    mode: [ default, my_mode ]\ndefault_mode: default # Optional\n```\n\nFor `KEY_XXX` and `KEY_YYY`, use [these names](https://github.com/emberian/evdev/blob/1d020f11b283b0648427a2844b6b980f1a268221/src/scancodes.rs#L26-L572).\nYou can skip `KEY_` and the name is case-insensitive. So `KEY_CAPSLOCK`, `CAPSLOCK`, and `CapsLock` are the same thing.\nSome [custom aliases](src/config/key.rs) like `SHIFT_R`, `CONTROL_L`, etc. are provided.\n\nIn case you don't know the name of a key, you can find out by enabling the xremap debug output:\n\n```bash\nRUST_LOG=debug xremap config.yml\n# or\nsudo RUST_LOG=debug xremap config.yml\n```\n\nThen press the key you want to know the name of.\n\n#### Multi-purpose key with alone_timeout_millis\n\nTo make `capslock` also work as `esc`, if it's pressed and released within a timeout:\n\n```yml\nmodmap:\n  - remap:\n      Capslock:\n        held: Capslock\n        alone: esc\n        alone_timeout_millis: 200 # Optional, defaults to 1000\n```\n\nIt works like this:\n\n- If the key is pressed and released within `alone_timeout_millis` without other keys being pressed, it's considered `alone`.\n- If another key is pressed before timeout, it's considered `held`.\n- If the timeout is reached without other things happening, it's considered `held`.\n\nThe alone-action is emitted as press and release right away. The held-action will emit press when it's triggered and\nwait to release until the trigger key is released.\n\n#### Multi-purpose key with free hold\n\nTo use `space` as `shift` when it's held down, but remain `space` if it's not interrupted by another key:\n\n```yml\nmodmap:\n  - remap:\n      Space:\n        held: Shift_L\n        alone: Space\n        free_hold: true # Optional, defaults to false.\n```\n\nThere's no timeout in this case (i.e. `alone_timeout_millis` is ignored).\n\n- The `held` action is triggered when another key is pressed while the multi-purpose key is being held down.\n- If the key is released without others key being pressed, it triggers the `alone` action.\n\nThis allows a key to be held indefinitely without triggering its `held` state, which is ideal for keys that also serve as modifiers. In this case, you make the `Space` key act as `Shift` when held and another key is pressed, but still type a regular `Space` when tapped.\n\nA drawback of this configuration is, that `space` can't be used for repeating spaces when held down, because that now has new meaning.\n\nAnother drawback is that fast writing (e.g. `a`, `space`, `l`) can emit `aL`. One has to release `space` before typing `l` to get `a l`. This can be fixed with `hold_threshold_millis`.\n\n`free_hold` is logically the same as having an infinite `alone_timeout_millis`.\n\n#### Multi-purpose key with hold_threshold_millis\n\n```yml\nmodmap:\n  - remap:\n      Space:\n        held: Shift_L\n        alone: Space\n        hold_threshold_millis: 200\n        free_hold: true\n```\n\nThis will emit the alone-action, `space`, when it's interrupted by another key before\ntimeout of `hold_threshold_millis`. This allows `space` to function normally when typing fast. And only after\nthe timeout will it work as `shift`.\n\n#### Multi-purpose key with `interruptable`\n\nYou may not want tapping a multi-purpose key to always be interrupted by all types of input events.\nYou may also have problems tapping multi-purpose keys if you're pressing a lot of keys at once.\n\nYou can control which keys can interrupt the `alone` press of a multi-purpose key using the\n`interruptable` field:\n\n```yml\nmodmap:\n  - remap:\n      Ctrl_L:\n        held: Ctrl_L\n        alone: Backspace\n        interruptable:\n          # Ignore mouse movement when using --mouse\n          # This is the default\n          not: [XRIGHTCURSOR, XLEFTCURSOR, XDOWNCURSOR, XUPCURSOR]\n      Alt_L:\n        held: Alt_L\n        alone: Space\n        alone_timeout_millis: 200\n        interruptable:\n          # Only allow alt+tab to interrupt tapping alt\n          only: Tab\n```\n\nInput events that would interrupt the `alone` press of these multi-purpose keys will be handled as\nnormal but without interrupting the key press.\n\nYou can set `interruptable: false` to completely disable interruption. Or let all keys interrupt\nby setting `interruptable: true`, which also lets mouse wheel and mouse movement interrupt.\n\n### keymap\n\n`keymap` is for remapping a sequence of key combinations to another sequence of key combinations or other actions.\nKey actions in `keymap` will generally press and release keys right away\nwhen the last key in the trigger combination is pressed.\n\n```yml\nkeymap:\n  - name: Name # Optional\n    exact_match: false # Optional, defaults to false\n    remap: # Required\n      # Key press -\u003e Key press\n      MOD1-KEY_XXX1: MOD2-KEY_YYY\n      # Sequence (MOD1-KEY_XXX2, MOD2-KEY_YYY) -\u003e Key press (MOD3-KEY_ZZZ)\n      MOD1-KEY_XXX2:\n        remap:\n          MOD2-KEY_YYY: MOD3-KEY_ZZZ\n        timeout_millis: 200 # Optional. No timeout by default.\n        timeout_key: KEY_A # Optional. Defaults to nothing. Can also be an array.\n      # Key press (MOD1-KEY_XXX3) -\u003e Sequence (MOD2-KEY_YYY, MOD3-KEY_ZZZ)\n      MOD1-KEY_XXX3: [MOD2-KEY_YYY, MOD3-KEY_ZZZ]\n      # Execute a command\n      MOD1-KEY_XXX4:\n        launch: [\"bash\", \"-c\", \"echo hello \u003e /tmp/test\"]\n      # Let `with_mark` also press a Shift key (useful for Emacs emulation)\n      MOD1-KEY_XXX5: { set_mark: true } # use { set_mark: false } to disable it\n      # Also press Shift only when { set_mark: true } is used before\n      MOD1-KEY_XXX6: { with_mark: MOD2-KEY_YYY }\n      # After pressing MOD1-KEY_XXX7, the next key press will ignore keymap\n      MOD1-KEY_XXX7: { escape_next_key: true }\n      # Set mode to configure Vim-like modal remapping\n      MOD1-KEY_XXX8: { set_mode: default }\n      # Illustrate a nested mapping that times out;\n      # also useful for timing out double-key sequences if the second key is never pressed.\n      space:  # Use timeout to fix a bouncy spacebar\n        remap:\n          space: null          # make space output nothing; null is equivalent to []\n          timeout_key: space   # output space after timeout or a non-mapped key (only space is mapped above)\n          timeout_millis: 150  # timeout duration in ms\n    application: # Optional\n      not: [Application, ...]\n      # or\n      only: [Application, ...]\n    window: # Optional\n      not: [/regex of window title/, ...]\n      # or\n      only: [/regex of window title/, ...]\n    device: # Optional\n      not: [Device, ...]\n      # or\n      only: [Device, ...]\n    mode: default # Optional\n    # or\n    mode: [ default, my_mode ]\ndefault_mode: default # Optional\n```\n\nFor `KEY_XXX`, use [these names](https://github.com/emberian/evdev/blob/1d020f11b283b0648427a2844b6b980f1a268221/src/scancodes.rs#L26-L572).\nYou can skip `KEY_` and the name is case-insensitive. So `KEY_CAPSLOCK`, `CAPSLOCK`, and `CapsLock` are the same thing.\n\nFor the `MOD1-` part, the following prefixes can be used (also case-insensitive):\n\n- Shift: `SHIFT-`\n- Control: `C-`, `CTRL-`, `CONTROL-`\n- Alt: `M-`, `ALT-`\n- Windows: `SUPER-`, `WIN-`, `WINDOWS-`\n\nYou can use multiple prefixes like `C-M-Shift-a`.\nYou may also suffix them with `_L` or `_R` (case-insensitive) so that\nremapping is triggered only on a left or right modifier, e.g. `Ctrl_L-a`.\n\nIf you use `virtual_modifiers` explained below, you can use it in the `MOD1-` part too.\n\n`exact_match` defines whether to use exact match when matching key presses. For\nexample, given a mapping of `C-n: down` and `exact_match: false` (default), and\nyou pressed \u003ckbd\u003eC-Shift-n\u003c/kbd\u003e, it will automatically be remapped to\n\u003ckbd\u003eShift-down\u003c/kbd\u003e, without you having to define a mapping for\n\u003ckbd\u003eC-Shift-n\u003c/kbd\u003e, which you would have to do if you use `exact_match: true`.\n\n### application\n\n`application` can be used for both `modmap` and `keymap`, which allows you to specify application-specific remapping.\n\n```yml\nkeymap:\n  - application:\n      not: firefox\n      #not: [firefox, ...]\n      #only: firefox\n      #only: [firefox, ...]\n    remap:\n      capslock: KEY_A\n```\n\nThe application name can be specified as a normal string to exactly match the name,\nor a regex surrounded by `/`s like `/application/`.\n\nTo check the application names, you can use the following commands:\n\n#### X11\n\n```\n$ wmctrl -x -l\n0x02800003  0 slack.Slack           ubuntu-jammy Slack | general | ruby-jp\n0x05400003  0 code.Code             ubuntu-jammy application.rs - xremap - Visual Studio Code\n```\n\nYou may use the entire string of the third column (`slack.Slack`, `code.Code`),\nor just the last segment after `.` (`Slack`, `Code`).\n\n#### GNOME Wayland\n\nUse the following command or check windows' WMClass by pressing Alt+F2 and running `lg` command in [LookingGlass](https://wiki.gnome.org/Projects/GnomeShell/LookingGlass):\n\n```\nbusctl --user call org.gnome.Shell /com/k0kubun/Xremap com.k0kubun.Xremap WMClasses\n```\n\n#### KDE-Plasma Wayland\n\nXremap prints the active window to the console.\nHowever, it will only start printing, once a mapping has been triggered that uses an application filter.\nSo you have to create a mapping with a filter using a dummy application name and trigger it.\nThen each time you switch to a new window xremap will print its caption, class, and name in the following style:\n`active window: caption: '\u003ccaption\u003e', class: '\u003cclass\u003e', name: '\u003cname\u003e'`\nThe `class` property should be used for application matching, while the `caption` property should be used for window matching.\n\nIf you use a systemd-daemon to manage xremap, the prints will be visible in the system-logs (Can be opened with `journalctl -f`)\n\n#### Sway\n\n```\nswaymsg -t get_tree\n```\n\nLocate `app_id` in the output.\n\n#### Niri\n\n```\nniri msg windows\n```\n\nLocate `App ID` in the output.\n\n#### COSMIC Wayland\n\n```\nxremap --list-windows\n```\n\nThis only works on COSMIC\n\n#### All desktops\n\nIf none of the above methods work, you can make a config file with:\n\n```yml\nkeymap:\n  - window:\n      not: []\n    application:\n      not: []\n    remap:\n      capslock: []\n```\n\nWhen you press capslock xremap looks up the information and prints it to the console.\n\n#### application-specific key overrides\n\nSometimes you want to define a generic key map that is available in all applications, but give specific keys in that map their own definition in specific applications. You can do this by putting the generic map at the bottom of the config, after any specific overrides, as follows.\n\n```yml\n# Emacs-style word-forward and word-back\nkeymap:\n  - name: override to make libreoffice-writer go to end of word but before final space like emacs\n    application:\n      only: libreoffice-writter\n    remap:\n      Alt-f: [right, C-right, left]\n  - name: generic for all apps\n    remap:\n      Alt-f: C-right\n      Alt-b: C-left\n```\n\nNote how Alt-f and Alt-b work in all apps, but the definition of Alt-f is slightly different in LibreOffice Writer. When that app is active, the first definition overrides the second definition; but for any other app, only the second definition is found. This is because xremap uses the first matching definition that it finds.\n\n### device\n\nMuch like [`application`](#application), you may specify `{keymap,modmap}.device.{not,only}` in your configuration for device-specific remapping. Consistent with the global `--device` flag, device-matching strings may be any of:\n\n- The full path of the device (e.g. /dev/input/event0)\n- The filename of the device (e.g. event0)\n- The device name\n- A substring of the device name\n- The vendor and/or product id (e.g. ids:0x3f0:0x24)\n\nTo determine the names and paths of your devices, examine `xremap`'s log output at startup. To get\nfurther info run: `xremap --list-devices` or even `xremap --device-details`.\n\n```yml\nkeymap:\n  - device:\n      not: \"/dev/input/event0\"\n      # not: \"/dev/input/by-id/Cool_Device\" # Symlink to device. Since v0.14.8\n      # not: [event0, event1]\n      # only: 'Some Cool Device Name'\n      # only: ['Cool Device', 'Another Device']\n      # only: [ids:0x3f0:0x24]\n    remap:\n      W: UP\n```\n\nUnlike for `application`, regexs are not supported for `device`.\n\nIf both `not` and `only` is specified, then `only` is used for matching, and `not` has no effect.\n\nVendor and product ids must be given in hexadecimal, with or without '0x' prefix. It's possible to only\nmatch on vendor id with: `ids:0x3f0:0`, and only on product id with `ids:0:0x24`.\n\n### mode\n\nYou can assign mode(s) to keymap and/or remap which effectively turns them on or off\nwhen you set the mode.\n\n```yml\nmodmap:\n  - name: Up\n    remap:\n      W: UP\n    mode: [Up, Up_And_Down] # Mode is optional\n\n  - name: Down\n    remap:\n      S: DOWN\n    mode: [Down, Up_And_Down]\n\n  - name: Right_And_Left\n    remap:\n      D: RIGHT\n      A: LEFT\n    mode: Right_And_Left # Mode can be a string or vector of strings\n\n  - name: Turn Off\n    remap:\n      L:\n        press: { set_mode: Off } # Modmap can set mode via press and release\n        release:\n    # If mode is absent the keymap or modmap is always on\n\nkeymap:\n  - name: SetMode\n    remap:\n      CTRL-U: { set_mode: Up }\n      CTRL-I: { set_mode: Down }\n      CTRL-O: { set_mode: Up_And_Down }\n      CTRL-P: { set_mode: Right_And_Left }\n    mode: [Up, Down, Right_And_Left, Up_And_Down, Off] # You can assign modes to keymap too!\n\ndefault_mode: Up_And_Down # Optional, if absent default mode is \"default\"\n```\n\n## Commandline arguments\n\nUsage for xremap is shown by running the following command:\n\n```\nxremap --help\n```\n\nThe result is shown here:\n\n```\nUsage: xremap [OPTIONS] [CONFIGS]...\n\nArguments:\n  [CONFIGS]...\n          Config file(s)\n\n          When more than one file is given, then will modmap, keymap and virtual_modifiers\n          from the subsequent files be merged into the first configuration file.\n\nOptions:\n      --device \u003cDEVICE\u003e\n          Limit input devices to the given names or paths. Default is all keyboards\n\n      --ignore \u003cIGNORE\u003e\n          Ignore input devices with the given names or paths\n\n      --mouse\n          Listen to mouse devices. Default is false.\n          Trackpads, tablets and other absolute devices are not supported.\n\n      --watch[=\u003cWATCH\u003e...]\n          Watch for new devices or changing configuration files.\n          Default is not watching for either.\n          Examples\n          - xremap --watch config.yml               # watch devices\n          - xremap --watch=config config.yml        # watch configuration files\n          - xremap --watch=config,device config.yml # watch both\n\n          Possible values:\n          - device: add new devices automatically\n          - config: reload the config automatically\n\n      --output-device-name \u003cOUTPUT_DEVICE_NAME\u003e\n          Choose the name of the created output device. Default is 'xremap' or 'xremap pid=xx'\n\n      --vendor \u003cVENDOR\u003e\n          Choose the vendor value of the created output device.\n          Must be given in hexadecimal with or without a prefix '0x'.\n          Default is: 0x1234\n\n      --product \u003cPRODUCT\u003e\n          Choose the product value of the created output device.\n          Must be given in hexadecimal with or without a prefix '0x'.\n          Default is: 0x5678\n\n      --list-devices\n          List info about devices\n\n      --device-details\n          Show device details\n\n      --list-windows\n          List open windows. Use this to get app_class and title.\n          It only works for COSMIC. Since v0.14.10.\n\n      --no-window-logging\n          Suppress logging of window title and application changes.\n          Default is false. Since v0.14.10.\n\n      --allow-launch \u003cALLOW_LAUNCH\u003e\n          Allow remappings to execute programs. Default is ambiguous. Since v0.15.1\n\n          [possible values: true, false]\n\n      --bridge\n          Open a bridge from the desktop environment to the xremap system service.\n          Since v0.15.1\n\n      --completions \u003cSHELL\u003e\n          Generate shell completions\n\n          You can use them by storing in your shells completion file or by running\n          - in bash: eval \"$(xremap --completions bash)\"\n          - in fish: xremap --completions fish | source\n\n          [possible values: bash, elvish, fish, powershell, zsh]\n\n  -h, --help\n          Print help (see a summary with '-h')\n\n  -V, --version\n          Print version\n```\n\n### Device/ignore\n\nThe arguments to `--device` and `--ignore` are described [here](#device). When using\n`--device`, only the devices you specify will be used. To select more than one device separate them\nby `,` or use `--device` for each:\n\n```sh\nxremap --device \"first device,second device\" config.yml\n```\n\nor:\n\n```sh\nxremap --device \"first device\" --device \"second device\" config.yml\n```\n\n## Maintainers\n\n- @k0kubun\n- @N4tus (KDE client)\n- @jixiuf (wlroots client)\n- @saurabhsharan (Niri client)\n- @hpccc53 (Cosmic client)\n\n## Releasing\n\nFirst, bump the xremap version at Cargo.toml and Cargo.lock, and Update CHANGELOG.md. Then:\n\n```\ngit add .\ngit commit -m \"Version 0.X.Y\"\ngit push origin master\ngit tag v0.X.Y\ngit push origin --tags\n```\n\n## License\n\n`xremap` is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxremap%2Fxremap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxremap%2Fxremap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxremap%2Fxremap/lists"}