How do make karabiner type Ä? - karabiner

I'm trying to map å (option-a) to ä (option-u, a) and Å (option-shift-a) to Ä (option-u, shift-a). I was able to figure out the first one:
{
"description": "German: å to ä",
"manipulators": [
{
"from": {
"key_code": "a",
"modifiers": {
"mandatory": [
"option"
],
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "u",
"modifiers": ["left_option"]
},
{
"key_code": "a"
}
],
"type": "basic"
},
]
}
but I'm having trouble figuring out the second one. If I hold down shift, I end up with ¨A, not Ä.

Use Karabiner-EventViewer or Apple's Keyboard Viewer while doing it manually to see shift-option-u gets a bare ¨, option-u a gets ä and option-u shift-a gets Ä so was:
{"title": "German: å to ä",
"rules": [{"description": "⌥a to ä and ⇧⌥A to Ä.",
"manipulators": [
{"from": {"key_code": "a", "modifiers": {"mandatory": ["option"],
"optional": ["caps_lock", "control", "command"]}},
"to": [{"key_code": "u", "modifiers": ["option"]},
{"key_code": "a"}],
"type": "basic"},
{"from": {"key_code": "a", "modifiers": {"mandatory": ["option", "shift"],
"optional": ["caps_lock", "control", "command"]}},
"to": [{"key_code": "u", "modifiers": ["option"]},
{"key_code": "a", "modifiers": ["shift"]}],
"type": "basic"}]}]}

Related

how to make an indented tree in vega

I'm trying to create an indented tree e.g. as in https://observablehq.com/#d3/indented-tree
I think that what this example does which I can't replicate in vega is encapsulated in this code:
root = { let i = 0; return d3.hierarchy(data).eachBefore(d => d.index = i++); }
eachBefore is a pre-order traversal on the output of d3.hierarchy.
Is there any way to get this result from (upstream) vega, or is this a feature request for an index output from the tree transform? (/something similar, or else a custom transform)
By the way, I think it may be easy to turn the specific tree layout example into an indented tree because the id happens to give the same 'index' ordering (I think), but think we need to use eachBefore where the data isn't so conveniently ordered.
Thanks for any suggestions!
Declan
Update
I made a change in vega-hierarchy described here:
https://github.com/declann/vega/commit/a651ff36cd3f0897054aa1b236f82e701db62432
Now I can use pre_traversal_id from tree transform output to do indented trees, e.g.:
indented tree in (custom) vega-editor, with tree output including pre_traversal_id field
Modified spec: https://gist.github.com/declann/91fd150ae04016e5890a30295fa58a07
Not sure if this help, but, when I enter at vega.github.io/vega/examples/tree-layout I played with the controls and (after change the settings to: layout:tidy - links:orthogonal - separation:true) I got a similar result you shown in the observablehq page:
Open the Chart in the Vega Editor
Code:
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"description": "An example of Cartesian layouts for a node-link diagram of hierarchical data.",
"width": 600,
"height": 1600,
"padding": 5,
"signals": [
{
"name": "labels", "value": true
},
{
"name": "layout", "value": "tidy"
},
{
"name": "links", "value": "orthogonal"
}
],
"data": [
{
"name": "tree",
"url": "data/flare.json",
"transform": [
{
"type": "stratify",
"key": "id",
"parentKey": "parent"
},
{
"type": "tree",
"method": {"signal": "layout", "value": "tidy"},
"size": [{"signal": "height"}, {"signal": "width - 100"}],
"separation": true,
"as": ["y", "x", "depth", "children"]
}
]
},
{
"name": "links",
"source": "tree",
"transform": [
{ "type": "treelinks" },
{
"type": "linkpath",
"orient": "horizontal",
"shape": {"signal": "links"}
}
]
}
],
"scales": [
{
"name": "color",
"type": "linear",
"range": {"scheme": "greys"},
"domain": {"data": "tree", "field": "depth"},
"zero": true
}
],
"marks": [
{
"type": "path",
"from": {"data": "links"},
"encode": {
"update": {
"path": {"field": "path"},
"stroke": {"value": "#828282"}
}
}
},
{
"type": "symbol",
"from": {"data": "tree"},
"encode": {
"enter": {
"size": {"value": 25}
},
"update": {
"x": {"field": "x"},
"y": {"field": "y"},
"fill": {"field": "depth"}
}
}
},
{
"type": "text",
"from": {"data": "tree"},
"encode": {
"enter": {
"text": {"field": "name"},
"baseline": {"value": "middle"}
},
"update": {
"x": {"field": "x"},
"y": {"field": "y"},
"dx": {"signal": "datum.children ? -7 : 7"},
"align": {"signal": "datum.children ? 'right' : 'left'"}
}
}
}
]
}
I believe this is possible by adding expression transforms for x (based on tree_node depth) and y (based on the tree node id)
The gist of it is to transform x and y after the tree transform
{"type": "stratify", "key": "id", "parentKey": "parent"},
{
"type": "tree",
"method": {"signal": "layout"},
"size": [{"signal": "height"}, {"signal": "width - 100"}],
"separation": {"signal": "separation"},
"as": ["_", "_", "depth", "children"]
},
{"type": "formula", "expr": "datum.depth * 20", "as": "x"},
{"type": "formula", "expr": "datum.id * 14", "as": "y"}
Here's an example that modifies the Vega Tree layout example

Karabiner-Elements I want to change key bind input same key + => = ,= => +

please tell me.
I use mac's magic key board.
this key board is [+] and [=] on same input key
So,
[=] is default input key [=]
[+] is default input key [=] + [shift key]
I want to be inversion
but,Not going well
please tell me.
Under,ideal setting
before:
[=] is default setting [=]
[+] is default setting [=] + [shift key]
↓
after:
[=] → [+]
[shift key] + [=] →[=]
{
"type": "basic",
"from": {
"simultaneous": [
{
"key_code": "equal_sign"
},
{
"key_code": "left_shift"
}
],
"modifiers": {
"optional": ["any"]
}
},
"to": [
{
"key_code": "equal_sign"
}
]
},
{
"type": "basic",
"from": {
"simultaneous": [
{
"key_code": "equal_sign"
}
],
"modifiers": {
"optional": ["any"]
}
},
"to": [
{
"key_code": "equal_sign"
},
{
"key_code": "left_shift"
}
]
}
here is a working solution; since I use a European keyboard I used a letter "o" for testing – you'll have to swap it with "equal_sign" for yours!
{ "description": "Will exchange principal with secondary key 'expression' …",
"manipulators":
[ {
"type": "basic",
"from": { "key_code": "o",
"modifiers": {
"mandatory": ["left_shift"],
"optional": ["any"] }
},
"to": [ { "key_code": "o" } ]
},
{
"type": "basic",
"from": { "key_code": "o",
"modifiers": { "optional": ["any"] }
},
"to": [ { "key_code": "o",
"modifiers": "left_shift" } ]
}
]
}

karabiner elements json: how to make 'left_option" + "up_arrow" to "up_arrow" x 10?

The title says it all. One more information is that I use apple wired keyboard with macbook pro - "clam shell is closed" while external monitors are attached. I added the following at the correct file, but doesn't work. I want to use it for Xcode and Visual Studio Code, etc.
{
"description": "Move Up / Down 10",
"manipulators": [
{
"from": {
"key_code": "up_arrow"
},
"to": [
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
}
]
}
]
}
Two things, first you forgot to add "type": "basic"
Second: you must add "modifiers": {"mandatory": ["left_option"]}
{
"description": "Move Up / Down 10",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "up_arrow",
"modifiers": {"mandatory": ["left_option"]}
},
"to": [
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
}
]
}
]
}
In addition, if you want to make 'shift + option + up/down' jump 10 lines WITH SELECTION, use this. This also contains another useful modifications for 'cmd + up/down/left/right' to page up/down, home, end with selections:
{
"description": "LCMD + Up to Page Up",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "up_arrow",
"modifiers": {
"mandatory": [
"left_command"
]
}
},
"to": [
{
"key_code": "page_up"
}
]
},
{
"type": "basic",
"from": {
"key_code": "up_arrow",
"modifiers": {
"mandatory": [
"left_command",
"left_shift"
]
}
},
"to": [
{
"key_code": "page_up",
"modifiers": [
"left_shift"
]
}
]
}
]
},
{
"description": "LCMD + Down to Page Down",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "down_arrow",
"modifiers": {
"mandatory": [
"left_command"
]
}
},
"to": [
{
"key_code": "page_down"
}
]
},
{
"type": "basic",
"from": {
"key_code": "down_arrow",
"modifiers": {
"mandatory": [
"left_command",
"left_shift"
]
}
},
"to": [
{
"key_code": "page_down",
"modifiers": [
"left_shift"
]
}
]
}
]
},
{
"description": "LCMD + Left to Home",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "left_arrow",
"modifiers": {
"mandatory": [
"left_command"
]
}
},
"to": [
{
"key_code": "home"
}
]
},
{
"type": "basic",
"from": {
"key_code": "left_arrow",
"modifiers": {
"mandatory": [
"left_command",
"left_shift"
]
}
},
"to": [
{
"key_code": "home",
"modifiers": [
"left_shift"
]
}
]
}
]
},
{
"description": "LCMD + Right to End",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "right_arrow",
"modifiers": {
"mandatory": [
"left_command"
]
}
},
"to": [
{
"key_code": "end"
}
]
},
{
"type": "basic",
"from": {
"key_code": "right_arrow",
"modifiers": {
"mandatory": [
"left_command",
"left_shift"
]
}
},
"to": [
{
"key_code": "end",
"modifiers": [
"left_shift"
]
}
]
}
]
},
{
"description": "Move Up / Down 10",
"manipulators": [
{
"from": {
"key_code": "up_arrow",
"modifiers": {
"mandatory": [
"left_option"
]
}
},
"to": [
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
},
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "up_arrow",
"modifiers": {
"mandatory": [
"left_option",
"left_shift"
]
}
},
"to": [
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "up_arrow",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
},
{
"from": {
"key_code": "down_arrow",
"modifiers": {
"mandatory": [
"left_option"
]
}
},
"to": [
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
},
{
"key_code": "down_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "down_arrow",
"modifiers": {
"mandatory": [
"left_option",
"left_shift"
]
}
},
"to": [
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
},
{
"key_code": "down_arrow",
"modifiers": [
"left_shift"
]
}
],
"type": "basic"
}
]
}

Using Karabiner Elements, how can I toggle the WASD keys to arrow keys. Only while Caps lock active?

Love this program and thankful for any help
Like the title states, I have my left hand on my SHIFT KEY, OPTION KEY and COMMAND key all the time. but I hate when I have to use my arrow keys to move shapes. I would like the ability to change WASD as arrow keys to nudge shapes around. This also allows for the pinky to hit the left SHIFT KEY so that I could move shape 10px at a time. However, I want to be able to toggle to the arrow function by pressing Caps lock and holding it until I release. Doing this will enable me to make more use of hotkeys while building/UI.
To summarize:
Program active
keyboard is in default state when Caps lock is off
While Caps lock is on I am able to use WASD as arrow keys
Once I hit Caps lock, keys will return to default state.
Thank you so much for whatever help you guys can throw my way. Hope this has already been addressed and is easy fix
This works for me:
{
"description": "WASD arrow Keys toggled by Capslock",
"manipulators": [
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_unless",
"value": 1
}
],
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"set_variable": {
"name": "wasd_arrow_keys_mode",
"value": 1
}
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"set_variable": {
"name": "wasd_arrow_keys_mode",
"value": 0
}
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "a",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "s",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "w",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "d",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"type": "basic"
}
]
}
You can either place the code inside the brackets of the "rules": [] element of the file ~/.config/karabiner/karabiner.json, or create a new JSON file in ~/.config/karabiner/assets/complex_modifications, wrapping the code above in:
{
"title": "WASD arrow Keys toggled by Capslock",
"rules": [
(insert code here)
]
}
If you opt for the separate JSON file, once saved you can enable it through the Karabiner-Elements UI via Complex Modifications > Add rule.
I‘m using Karabiner beta 12.1.56 but it should work on Karabiner stable.
Note that this script replaces the functionality of caps lock, meaning: it works as an arrow key toggler, not as an uppercase key toggler.
This is a modification of the script "TouchCursor Mode" from the Karabiner site, which toggles a variable when pressing capslock, then uses WASD as keys or arrows depending on that variable. Similar technique to the one used by #user9680958.
Both solutions for caps lock mode and caps hold mode:
p.s. you can easily switch the script down below to "wasd" or "hjkl", etc.
1. Setup Karabiner:
Download Karabiner
When opening it requires to enable some stuff in the Settings (just follow the steps it requests from you)
Set up the Script:
Create a JSON file on your desktop:
cmd + space to open the spotlight
type in terminal
type in cd
type in cd desktop
touch myscript.json
copy paste one of the codes down below in the new file
Go back to the terminal
Type in cd
Type cd desktop
Type mv myscript.json ~/.config/karabiner/assets/complex_modifications
Now open Karabiner Elements and go to "Complex modifications"
Press "add Rule"
Now there should be your custom rule to enable
Have fun.
Code 1 for Caps lock "to enter arrow key mode" and press again "to exit arrow key mode":
{
"title": "ijkl arrow Keys toggled by Capslock",
"rules": [
{
"description": "ijkl arrow Keys toggled by Capslock",
"manipulators": [
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_unless",
"value": 1
}
],
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"set_variable": {
"name": "wasd_arrow_keys_mode",
"value": 1
}
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"set_variable": {
"name": "wasd_arrow_keys_mode",
"value": 0
}
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "j",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "k",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "i",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "l",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"type": "basic"
}
]
}
]
}
Code 2 If you want to hold Caps while using the arrow Keys use this one instead:
{
"title": "ijkl arrow Keys toggled by Capslock",
"rules": [
{
"description": "ijkl arrow Keys toggled by Capslock",
"manipulators": [
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_unless",
"value": 1
}
],
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"set_variable": {
"name": "wasd_arrow_keys_mode",
"value": 1
}
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"set_variable": {
"name": "wasd_arrow_keys_mode",
"value": 0
}
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "j",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "k",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "i",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"conditions": [
{
"name": "wasd_arrow_keys_mode",
"type": "variable_if",
"value": 1
}
],
"from": {
"key_code": "l",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"type": "basic"
}
]
}
]
}
{
"type": "basic",
"description": "",
"from": {
"key_code": "w",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"conditions": [
{
"type": "variable_if",
"name": "caps_lock pressed",
"value": 1
}
]
},
{
"type": "basic",
"description": "",
"from": {
"key_code": "s",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"conditions": [
{
"type": "variable_if",
"name": "caps_lock pressed",
"value": 1
}
]
},
{
"type": "basic",
"description": "",
"from": {
"key_code": "a",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"conditions": [
{
"type": "variable_if",
"name": "caps_lock pressed",
"value": 1
}
]
},
{
"type": "basic",
"description": "",
"from": {
"key_code": "d",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"conditions": [
{
"type": "variable_if",
"name": "caps_lock pressed",
"value": 1
}
]
},
{
"type": "basic",
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "caps_lock"
},
{
"set_variable": {
"name": "caps_lock pressed",
"value": 0
}
}
],
"conditions": [
{
"type": "variable_if",
"name": "caps_lock pressed",
"value": 1
}
]
},
{
"type": "basic",
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "caps_lock"
}
],
"to_if_alone": [
{
"set_variable": {
"name": "caps_lock pressed",
"value": 1
}
}
]
}

Karabiner elements delete a line

I'm new to Karabiner on Mac and I'm trying to map left_option + e to deleting a line.
I know this involves defining the following keystrokes for left_command + e: left_command + shift + left_arrow + backspace_or_delete, but I don't know how to input it to the json file
Here I created code that moves cursor to the beginning of the line and then deletes it.
{
"description": "Delete line",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "e",
"modifiers": {
"mandatory": ["left_option"]
}
},
"to": [
{
"key_code": "a",
"modifiers": ["left_control"]
},
{
"key_code": "k",
"modifiers": ["left_control"]
}
]
}
]
}