Karabiner-Elements is a powerful utility for keyboard customization on macOS Sierra (10.12) or later
Mostly used for changing the capslock to a hyper key to support more shortcuts
Here I'll be talking about how to maximize the use of the capslock key to change input sources, scroll, make more convenient direction keys and so on
All modifications are being made with karabiner's Complex Modification Settings and Mac's keyboard shortcuts
capslock to hyperkey settings already exsits in pre-defined rules:
Karabiner Element Settings > Complex Modifications > Add predefined rulesChange caps_lock to command+control+option+shift
System Preferences > Keyboard > Keyboard Shortcuts 
Changes I made:
(FYI. ^⌥⇧⌘ = capslock)
If you change capslock into a modifier key, it no longer works as a capslock key. In order to still use capslock, we have to adjust the settings a little bit.
Navigate to Karabiner Element Settings > Misc > Export & Import > Open config folder (~/.config/karabiner)
karabiner.json to_if_alone key to the rule{
"rules": [
// other rules...
{
"manipulators": [
{
"description": "Change caps_lock to command+control+option+shift.",
"from": {
"key_code": "caps_lock",
"modifiers": {
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_shift",
"modifiers": [
"left_command",
"left_control",
"left_option"
]
}
],
"to_if_alone": [
{
"key_code": "caps_lock"
}
],
"type": "basic"
}
]
},
]
}
While karabiner offers a predefined offers "change right_command+hjkl to arrow keys," using the command key conflicted with a lot of other shortcuts i had on other apps.
So, using the our new capslock modifier key, I made some arrow keys that work when you press capslock + wasd
Add the following json to the rules section of your karabiner.json
{
"description": "Change Command + Control + Shift + Option + W/A/S/D to arrow keys",
"manipulators": [
{
"from": {
"key_code": "a",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "left_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "s",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "down_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "w",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "up_arrow"
}
],
"type": "basic"
},
{
"from": {
"key_code": "d",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"key_code": "right_arrow"
}
],
"type": "basic"
}
]
}
Not having a trackpad when you're using an external keyboard proved to be a significant inconvenience for me.
Add the following to your "rules" in karabiner.json to scroll using capslock + ijkl
{
"description": "Scroll with Command + Control + Shift + Option + I/J/K/L",
"manipulators": [
{
"type": "basic",
"from": {
"key_code": "i",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"mouse_key": {
"vertical_wheel": -32
}
}
]
},
{
"type": "basic",
"from": {
"key_code": "j",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"mouse_key": {
"horizontal_wheel": 32
}
}
]
},
{
"type": "basic",
"from": {
"key_code": "k",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"mouse_key": {
"vertical_wheel": 32
}
}
]
},
{
"type": "basic",
"from": {
"key_code": "l",
"modifiers": {
"mandatory": [
"left_command",
"left_control",
"left_shift",
"left_option"
],
"optional": [
"any"
]
}
},
"to": [
{
"mouse_key": {
"horizontal_wheel": -32
}
}
]
}
]
}
Adjust the scroll speed under "parameters":
"parameters": {
"basic.simultaneous_threshold_milliseconds": 50,
"basic.to_delayed_action_delay_milliseconds": 500,
"basic.to_if_alone_timeout_milliseconds": 1000,
"basic.to_if_held_down_threshold_milliseconds": 500,
"mouse_motion_to_scroll.speed": 200
},