Skip to main content

Key generator for macos keybinding system

Project description

Compose Key On Macos

gen-compose - generates compose key keybindings for macos.

A compose key (sometimes called multi key) is a key on a computer keyboard that indicates that the following (usually 2 or more) keystrokes trigger the insertion of an alternate character, typically a precomposed character or a symbol. https://en.wikipedia.org/wiki/Compose_key

Compose keys lets you insert complex character by entering multiple characters in a succession:

screencast demonstration of compose key

e.g. <compose_key> + d + o + w + n will insert 👇

Mac os doesn't come with a compose key feature built-in. However there's a short hack to make it work:

  1. Keys can be rebound in mac via ~/Library/KeyBindings/DefaultKeyBinding.dict dictionary file.
  2. The rebound keys can be chained like compose keys e.g. pressing abcd can be made to insert AlphaBetaCharlieDad
  3. Modifier keys cannot be rebound

With these three rules we can replicate compose key and even set it to work with a mod key!

Install

gen-compose can be installed via python manager with py3.6+ versions:

$ pip3 install --user gen-compose
$ gen-compose --help
Usage: gen-compose [OPTIONS] [MAPPINGS]...

  Generate macos rebind file from compose json mapping

Options:
  --key TEXT  key to use as compose key  [default: §]
  -r, --raw   just keymap without prefix
  --help      Show this message and exit.

Preconfig

  1. First lets fix modifier key issue by forcing modifier to be a character. For example to use right_options key we need to use karabiner elements and remap it to some unused key like non_us_backslash: karabiner compose screenshot

  2. Now we have the compose key ready: if we click right_options it should insert § character
    However we cannot compose anything yet as we have no compose mappings yet. For that we need to modify keybindings dictionary located in ~/Library/KeyBindings/DefaultKeyBinding.dict.
    It's written in some cryptic hard to edit format and here's where gen-compose comes in and lets you write yaml files instead!

Usage

  1. Create yaml mappings file (e.g. mappings/readme.yaml):
    cat: "(^≗ω≗^)"
    "+1": 👍
    "-1": 👍
    ":(": "my face is sad"
    
    This map defines key combinations and texts that will be inserted, e.g. <compose_key><plus><number 1> will insert thumbs up.
    note: see mappings directory for some built in mappings
  2. Using gen-compose we generated .dict keybind file file from our yaml configuration:
    $ gen-compose mappings/readme.yaml
    {"§" = {
      "c" = {
        "a" = {
          "t" = ("insertText:", "(^≗ω≗^)");
        };
      };
      "+" = {
        "1" = ("insertText:", "👍");
      };
      "-" = {
        "1" = ("insertText:", "👍");
      };
      ":" = {
        "(" = ("insertText:", "my face is sad");
      };
    };}
    
    note: multiple mappings can be used to generate a single keymap: $ gen-compose map1.yaml map2.yaml
  3. Now save it directly to keybinds file:
    $ gen-compose mappings/readme.yaml > ~/Library/KeyBindings/DefaultKeyBinding.dict
    
  4. Restart your programs and type §+1 and you'll see 👍!
  5. Customize your own mapping or see /mappings for some existing configurations and have fun!

note: Some programs need a hard reboot to take in the map, like kill -9 sort of reboot to start working.

Using XCompose Mappings

Linux's xcompose mappings are supported via experimental conversion:

$ gen-compose-conver xcompose --help
Usage: gen-compose-convert xcompose [OPTIONS] [FILES]...

  Convert xcompose file, that follows format like: <Multi_key> <parenleft>
  <period> <1> <parenright>: "⑴"

Options:
  -c, --keep-comments  keep inline comments
  --help               Show this message and exit.

For example:

$ cat mappings/example.compose
<Multi_key> <B> <bar> : "₿" U20BF  # BITCOIN SIGN
$ gen-compose-convert xcompose mappings/example.compose --keep-comments > example.yaml
$ cat example.yaml
"B|": "₿"  # BITCOIN SIGN

Notes and Issues

  • There's no way to really debug this other than trial and error and making sure applications are restarted after every update.
  • When multiple keymaps (eg compose-gen map1.yaml map2.yal) provided they will be joined and updated in order they are provided.
  • Keymap does not allow completely overlapping keys. e.g. egg and eggplant will break because it's impossible to map two overlapping values as keymap functionality has no timeout (i.e. break if nothing is typed after a second and insert egg, instead it will wait indefinitely for you to finish eggplant)
    If overlap happens compose-gen will choose the shorter form and discard the long one.
    To fix this add end terminator character such as space: egg<space> rather than egg in your mappings.
  • DefaultKeyBinding.dict map doesn't work in some popular programs:

Related Resources

https://github.com/gnarf/osx-compose-key
http://lolengine.net/blog/2012/06/17/compose-key-on-os-x
http://bob.cakebox.net/osxcompose.php
https://github.com/ttscoff/KeyBindings

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gen-compose-1.1.0.tar.gz (7.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gen_compose-1.1.0-py3-none-any.whl (7.0 kB view details)

Uploaded Python 3

File details

Details for the file gen-compose-1.1.0.tar.gz.

File metadata

  • Download URL: gen-compose-1.1.0.tar.gz
  • Upload date:
  • Size: 7.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.10 CPython/3.8.5 Darwin/19.6.0

File hashes

Hashes for gen-compose-1.1.0.tar.gz
Algorithm Hash digest
SHA256 81de85487e4a4ac9d08e4c126f9c3a4f6aaa0b6d303ddfd96aeb01dd9bc92caa
MD5 78f5c4f28d42c38dfb5d6498042857c9
BLAKE2b-256 9dcafcc3c677dd58f55b910ed51b4978c0e8a3755d4de46db338aaece456a3ca

See more details on using hashes here.

File details

Details for the file gen_compose-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: gen_compose-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 7.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.10 CPython/3.8.5 Darwin/19.6.0

File hashes

Hashes for gen_compose-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fe26e166f22a75b078ca5f313ff1db3c1ae607b777079f18ccafa6aaacf9c6ac
MD5 3e2bbe17446d8dc17dd50c4f02f8368f
BLAKE2b-256 a30dc389cb16d99670895f413e6af3d90dbe12fbf07bb468294699dac9f49ce3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page