├── README.md └── CreateLauncherModeTemplate.rb /README.md: -------------------------------------------------------------------------------- 1 | # o-launcher-script 2 | My copy of the o-launcher script for Karabiner Elements. 3 | -------------------------------------------------------------------------------- /CreateLauncherModeTemplate.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # You can generate json by executing the following command on Terminal. 4 | # 5 | # $ ruby ./CreateLauncherModeTemplate.json.rb 6 | # 7 | 8 | # Parameters 9 | 10 | def parameters 11 | { 12 | :simultaneous_threshold_milliseconds => 500, 13 | :trigger_key => 'o', 14 | } 15 | end 16 | 17 | ############################################################ 18 | 19 | require 'json' 20 | 21 | def main 22 | data = { 23 | 'title' => 'O-Launcher', 24 | 'rules' => [ 25 | { 26 | 'description' => 'O-Launcher', 27 | 'manipulators' => [ 28 | generate_launcher_mode('i', [], [{ 'shell_command' => "open -a 'notion.app'" }]), 29 | generate_launcher_mode('1', [], [{ 'shell_command' => "open -a 'Brave Browser Beta.app'" }]), 30 | generate_launcher_mode('a', [], [{ 'shell_command' => "open -a 'Activity Monitor.app'" }]), 31 | generate_launcher_mode('c', [], [{ 'shell_command' => "open -a 'Visual Studio Code.app'" }]), 32 | generate_launcher_mode('i', [], [{ 'shell_command' => "open -a 'iTerm.app'" }]), 33 | 34 | ].flatten, 35 | }, 36 | ], 37 | } 38 | 39 | puts JSON.pretty_generate(data) 40 | end 41 | 42 | def generate_launcher_mode(from_key_code, mandatory_modifiers, to) 43 | data = [] 44 | 45 | ############################################################ 46 | 47 | h = { 48 | 'type' => 'basic', 49 | 'from' => { 50 | 'key_code' => from_key_code, 51 | 'modifiers' => { 52 | 'mandatory' => mandatory_modifiers, 53 | 'optional' => [ 54 | 'any', 55 | ], 56 | }, 57 | }, 58 | 'to' => to, 59 | 'conditions' => [ 60 | { 61 | 'type' => 'variable_if', 62 | 'name' => 'launcher_mode', 63 | 'value' => 1, 64 | }, 65 | ], 66 | } 67 | 68 | data << h 69 | 70 | ############################################################ 71 | 72 | h = { 73 | 'type' => 'basic', 74 | 'from' => { 75 | 'simultaneous' => [ 76 | { 77 | 'key_code' => parameters[:trigger_key], 78 | }, 79 | { 80 | 'key_code' => from_key_code, 81 | }, 82 | ], 83 | 'simultaneous_options' => { 84 | 'key_down_order' => 'strict', 85 | 'key_up_order' => 'strict_inverse', 86 | 'to_after_key_up' => [ 87 | { 88 | 'set_variable' => { 89 | 'name' => 'launcher_mode', 90 | 'value' => 0, 91 | }, 92 | }, 93 | ], 94 | }, 95 | 'modifiers' => { 96 | 'mandatory' => mandatory_modifiers, 97 | 'optional' => [ 98 | 'any', 99 | ], 100 | }, 101 | }, 102 | 'to' => [ 103 | { 104 | 'set_variable' => { 105 | 'name' => 'launcher_mode', 106 | 'value' => 1, 107 | }, 108 | }, 109 | ].concat(to), 110 | 'parameters' => { 111 | 'basic.simultaneous_threshold_milliseconds' => parameters[:simultaneous_threshold_milliseconds], 112 | }, 113 | } 114 | 115 | data << h 116 | 117 | ############################################################ 118 | 119 | data 120 | end 121 | 122 | main --------------------------------------------------------------------------------