MacOS – Karabiner-Elements: How to disable a group of keys in a simple way

karabinerkeybindingskeyboardmacos

Is there a simple way to disable a group of keys in complex modifications in Karabiner-Elements?

Consider an example:

Under the following condition

  "set_variable": {
      "name": "con-1",
      "value": 1
  }

I want to disable all alphabets/numbers/simbols (or most of them at least), except for a and b.

Just for reference, this page discusses how to disable individual keys. Applying this approach to many many keys is not efficient.

I appreciate your insight in advance.

Best Answer

EDIT: I just added two "[ ]" brackets to the final "to":[{ -part, as their lack got s.o.an [error] !

==========================================================================

So, here is a "final version" (some notes to/from a first attempt are appended at bottom):

... some sample code that excludes any typing except letters "a" & "b".
This example is set to only work in TextEdit (for testing purposes) but of course you can change/delete this "conditions" (in last manipulator).

– The "Excluding" is prepared by Shft-Ctrl-A which solely sets "none_but_ab" to true (1).
– Next in line is a Stop-manipulator (security first); it sets "none_but_ab" to "0" after holding "x" 2 sec.
– Both following parts out-put our "a" and "b" letters, excluding them from following annihilation.
– The fatal last manipulator grabs "any: key_code" and renders it to "none" …
– Be careful with your Stop-mechanism: singular keys work best, modified combos may fail!

– Some more ideas:
By adding "command" ("shift") to the last "from", you could prevent app-Cmd-shortcuts (capital letters).
Karabiner El. can start before login (Preferences > 'Copy the current …'); "password" would be affected!
I also would like to know how "Shift" could be applied to "any":"key_code", forcing capital letters, or if numbers can somehow be "selected". Well, let's see …

{ "description": "=============  vk_none but a,b  ============= ",
   "manipulators": [
        {
           "from": { "key_code": "a",
                     "modifiers": {
                         "mandatory": ["left_shift", "left_control"]
                   }              },
             "to": [
                    { "set_variable": {
                      "name": "none_but_ab",
                      "value": 1 }    }
                   ],
           "type": "basic"
         },
         {
           "from": { "key_code": "x" },
     "parameters": { "basic.to_if_held_down_threshold_milliseconds": 2000 },
"to_if_held_down": [
                    { "key_code": "x" },
                    { "set_variable": {
                      "name": "none_but_ab",
                      "value": 0 }    }
                   ],
           "type": "basic"
         },
         { "from": { "key_code": "a" },
             "to": [ { "key_code": "a" } ],
           "type": "basic" }, 
         { "from": { "key_code": "b" },
             "to": [ { "key_code": "b" } ],
           "type": "basic" },
         { 
     "conditions": [
                    { "name": "none_but_ab",
                      "type": "variable_if",
                      "value": 1 },
                    { "bundle_identifiers": [
                              "^com.apple.TextEdit" ],
                      "type": "frontmost_application_if"
                    }
                   ],
           "from": { "any": "key_code",
                     "modifiers": {
                          "optional": ["any"] }
                   },
             "to": [ { "key_code": "vk_none" } ],
           "type": "basic"
                   }
                   ]
}

(Here are some remains from a first (deleted) answer at this:

note the twisted "any: key_code" part that calls every key, including "modifiers…any"

Interestingly 'from-to' units within{manipulators: …} Karabiner.json are worked through from top to bottom until one is executable.
So if you want particular letters (a, b) to work nonetheless, you must call them previously.

Starting value for any variable is "0" … values will "live" while Karabiner is running!

… while experimenting I made my monitor sleep, but when I typed my pw – one letter simply was not recognised. I had to start from an external drive and change my code. )

Related Question