rkremap 0.2.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d204d310504030119a941b532fec985cae5747c1d1e04958baefbb112327a629
4
- data.tar.gz: c98176cf3e753eb59da16e614159a5516e9bc1701e63806ec02d3e3bd8c4d076
3
+ metadata.gz: 127371f8cab9cd5ff002b35b886b79a3a4424d779f4bf938b9006fb633917a51
4
+ data.tar.gz: a02bd1649a62f30916e125582409f9b9ab8d57c33caf10bdfc5f7e6392ece992
5
5
  SHA512:
6
- metadata.gz: e04feb18bbae681fc1b5bbd2f8a95ea85b58aff976865d857fd044274214eb9f2502c34bb7ff4cb9b620f3658e55f82157b4c6b98dbe4eb5dce8ce8446ff042d
7
- data.tar.gz: 941f5b2893c031a7891151635b8cfb83d5ce410d8c0751da86a2b2699ce440a10221684dba881849bd54f4afa10f3b18cd8defe98b0a7601cfed4f5eb15bd7b6
6
+ metadata.gz: 111e0d08dfaec939535f150eb8d2852c5bbda078d705191d8d03d0d035782088cf73f7c861029cc49b99860f8645be46c1ef557326bae1e17170d15116ee887d
7
+ data.tar.gz: a1124ae0dabd8f87286d7ae2cc375a0490ffc58a884c2fb0f9694f51cee9d97b309ea83842afeb46f86184a1523e96c06429688bf71aa05e1a6e9555d6f488cb
data/README.md CHANGED
@@ -23,7 +23,9 @@ KERNEL=="uinput", GROUP="input"
23
23
  という内容で作れば `/dev/uinput` のグループを `input` にできるっぽい。
24
24
 
25
25
 
26
- ### `Rkremap.new`
26
+ ## Rkremap
27
+
28
+ ### Rkremap.new
27
29
 
28
30
  引数を指定しなければ自動的にキーボードデバイスの検出を試みる。
29
31
 
@@ -40,14 +42,42 @@ sudo evtest /dev/input/eventX
40
42
 
41
43
  ThinkPad 本体のキーボードは `/dev/input/event3` だった。
42
44
 
45
+ ### Rkremap#exclude
46
+
47
+ 無視するデバイス名を正規表現で指定できる。
48
+
49
+
50
+ ```ruby
51
+ rkremap.exclude = /touchpad/i
52
+ ```
53
+
54
+ ### Rkremap#mouse
55
+
56
+ 真を指定するとマウスも対象にする。
57
+
43
58
  ### Rkremap#grab
44
59
 
45
- `true` に設定するとキーイベントを奪う。キーイベントを見るだけでいいなら `false` を設定する。
60
+ `true` を設定するとキーイベントを奪う。キーイベントを見るだけでいいなら `false` を設定する。
61
+
62
+ `:keyboard` を設定するとキーボードデバイスを grab する。
63
+
64
+ `:mouse` を設定するとマウスデバイスを grab する。
65
+
66
+ 正規表現を設定するとデバイス名がマッチした場合にデバイスを grab する。
46
67
 
47
68
  ### Rkremap#x11
48
69
 
49
70
  `true` に設定すると X のアプリ名等を取得できる。X 環境下でないなら `false` を設定する。
50
71
 
72
+ ### Rkremap#modifers
73
+
74
+ 修飾キーの一覧。これらのキーは単体で押されただけでは `start` ブロックを実行しない。
75
+
76
+ ### Rkremap#auto_detect
77
+
78
+ `true` の場合はキーボードデバイスの接続を自動検知する。
79
+ `new` 時にデバイスファイルが指定されない場合は `true` になる。
80
+
51
81
  ### Rkremap#start
52
82
 
53
83
  なにかキーを押されたらブロックを実行する。修飾キー単体ではブロックは実行されない。
@@ -56,13 +86,27 @@ ThinkPad 本体のキーボードは `/dev/input/event3` だった。
56
86
 
57
87
  ### Rkremap#match
58
88
 
59
- キーイベントが引数に適合するとブロックを実行する。ブロック引数は Event オブジェクト。
60
- `Event#skip` するとこのイベントはスキップされる。
89
+ キーイベントが引数に適合するとブロックを実行する。ブロック引数は `Rkremap::Event` オブジェクト。
90
+ `Rkremap::Event#skip` するとこのイベントはスキップされる。
91
+
92
+ 複数回指定した場合は記述順に実行される。
61
93
 
62
94
  ### Rkremap#key
63
95
 
64
96
  キーを押したことにする。引数はキーコード(`Integer`)と修飾キー(`Hash`)。
65
97
 
98
+ 修飾キーのハッシュのキーはキーコード(`KEY_LEFTCTRL` 等)、値は `true`, または `false`。
99
+
100
+ ```ruby
101
+ {
102
+ KEY_LEFTSHIFT => false,
103
+ KEY_LEFTCTRL => true,
104
+ }
105
+ ```
106
+
107
+ と指定すると、左シフトは離した状態、左Ctrlは押した状態、それ以外の修飾キーはそのまま。
108
+ `#key()` 処理後は処理前の修飾キーの状態に戻る。
109
+
66
110
  ### Rkremap#event
67
111
 
68
112
  キーイベントを発生させる。`code` 引数はキーコード(`Integer`)。`type` 引数はイベントタイプ(`Symbol`)で `:press`, `:release`。
@@ -75,6 +119,34 @@ ThinkPad 本体のキーボードは `/dev/input/event3` だった。
75
119
 
76
120
  コードからキー名のシンボルに変換するための Hash。
77
121
 
122
+ ## Rkremap::Event
123
+
124
+ ### Rkremap::Event#code
125
+
126
+ キーコード。`Rkremap::KeyCode::KEY_*` に該当。
127
+
128
+ ### Rkremap::Event#type
129
+
130
+ イベントタイプ。 `:press`, `:release`, `:repeat` のいずれか。
131
+
132
+ ### Rkremap::Event#app
133
+
134
+ `Rkremap::App`。イベントが発生したアプリケーション。
135
+
136
+ ### Rkremap::Event#skip
137
+
138
+ このイベントをこれ以降処理しない。
139
+
140
+ ## Rkremap::App
141
+
142
+ ### Rkremap::App#class_name
143
+
144
+ アプリケーションのクラス名。
145
+
146
+ ### Rkremap::App#title
147
+
148
+ アプリケーションのタイトル。
149
+
78
150
  ## 参考
79
151
 
80
152
  * [mooz/xkeysnail: Yet another keyboard remapping tool for X environment](https://github.com/mooz/xkeysnail)
@@ -0,0 +1,52 @@
1
+ # 変換/無変換キーを0.5秒以上押してるとSUPERキーとして扱う。
2
+ # 0.5秒以内でも変換/無変換キーを押しながら他のキーを押すとSUPERキーとして扱う。
3
+
4
+ require 'rkremap'
5
+ require 'tmtms_timer'
6
+
7
+ include Rkremap::KeyCode
8
+
9
+ rk = Rkremap.new
10
+ rk.grab = true
11
+
12
+ timer = Tmtms::Timer.new
13
+ jobs = {
14
+ KEY_HENKAN => nil,
15
+ KEY_MUHENKAN => nil,
16
+ }
17
+
18
+ henkan_map = {
19
+ KEY_HENKAN => KEY_RIGHTMETA,
20
+ KEY_MUHENKAN => KEY_RIGHTMETA, # LEFTMETA だとデスクトップ環境のメニューが開いたりするため
21
+ }
22
+
23
+ rk.match(code: [KEY_HENKAN, KEY_MUHENKAN]) do |event|
24
+ if event.type == :press
25
+ job = timer.set(0.5) do
26
+ rk.synchronize do
27
+ rk.event(code: henkan_map[event.code], type: :press)
28
+ end
29
+ end
30
+ jobs[event.code] = job
31
+ elsif event.type == :release
32
+ if jobs[event.code]&.cancel # 0.5秒以内に離された
33
+ rk.key(event.code)
34
+ else
35
+ rk.event(code: henkan_map[event.code], type: :release)
36
+ end
37
+ end
38
+ event.skip
39
+ end
40
+
41
+ # 何かキーが押されたときに HENKAN, MUHENKAN が押されてれば SUPER が押されてることにする
42
+ rk.match(type: :press) do
43
+ [KEY_HENKAN, KEY_MUHENKAN].each do |code|
44
+ if jobs[code]&.cancel # 0.5秒以内
45
+ rk.event(code: henkan_map[code], type: :press)
46
+ end
47
+ end
48
+ end
49
+
50
+ rk.start do |code, mod|
51
+ rk.key(code, mod)
52
+ end
data/example/keylogger.rb CHANGED
@@ -6,9 +6,9 @@ def code2key(code)
6
6
  Rkremap::CODE_KEY[code].to_s.sub(/\AKEY_/, '')
7
7
  end
8
8
 
9
- rk = Rkremap.new
9
+ rk = Rkremap.new(*ARGV)
10
10
  rk.grab = false
11
- rk.x11 = true
11
+ rk.x11 = true if ENV['DISPLAY']
12
12
  rk.start do |code, mod, app|
13
13
  key = (mod.select{|_, v| v}.keys + [code]).map{|c| code2key(c)}.join('-')
14
14
  key << " at #{app.title} [#{app.class_name}]" if rk.x11
@@ -36,39 +36,76 @@ mod_disable_all = {}.merge(mod_disable_ctrl, mod_disable_shift, mod_disable_alt,
36
36
  rk = Rkremap.new
37
37
  rk.grab = true
38
38
  rk.x11 = true
39
- rk.start do |code, mod, app|
40
- # Emacs や端末等ではそのまま
41
- if app.class_name == 'Emacs' || app.class_name =~ /terminal/i || app.class_name == 'VirtualBox Machine'
39
+
40
+ # Emacs や VirtualBox ではそのまま
41
+ rk.match(app: /Emacs|VirtualBox Machine/) do |event|
42
+ rk.event(code: event.code, type: event.type)
43
+ event.skip
44
+ end
45
+
46
+ # 端末
47
+ rk.match(app: /terminal/i) do |event, mod|
48
+ # Super+Ctrl はそのまま
49
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
50
+ rk.event(code: event.code, type: event.type)
51
+ end
52
+ # Super+KEY は Ctrl+Shift+KEY に変換
53
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && Rkremap::CODE_KEY[event.code] =~ /\AKEY_[A-Z]\z/
54
+ rk.with_modifier(mod_disable_meta.merge(KEY_LEFTCTRL => true, KEY_LEFTSHIFT => true)) do
55
+ rk.event(code: event.code, type: event.type)
56
+ end
57
+ else
58
+ rk.event(code: event.code, type: event.type)
59
+ end
60
+ event.skip
61
+ end
62
+
63
+ rk.start do |code, mod|
64
+ # Super + Ctrl + 何か はそのまま
65
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
42
66
  rk.key(code, mod)
43
67
  next
44
68
  end
45
69
 
46
- # ALT+[A-Z]/Enter を Ctrl+[A-Z]/Enter に変換
47
- if (mod[KEY_LEFTALT] || mod[KEY_RIGHTALT]) && (Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/ || code == KEY_ENTER)
48
- mod.merge!(mod_disable_alt, {KEY_LEFTCTRL => true})
49
- mod[KEY_LEFTCTRL] = true
50
- rk.key(code, mod)
70
+ # SUPER+[A-Z]/Enter を Ctrl+[A-Z]/Enter に変換
71
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/ || code == KEY_ENTER)
72
+ rk.key(code, mod.merge(mod_disable_meta, KEY_LEFTCTRL => true))
73
+ next
74
+ end
75
+
76
+ # Alt + F, B は Ctrl + →, ← に変換
77
+ if (mod[KEY_LEFTALT] || mod[KEY_RIGHTALT]) && (code == KEY_F || code == KEY_B)
78
+ rk.key(code == KEY_F ? KEY_RIGHT : KEY_LEFT, mod.merge(mod_disable_alt, KEY_LEFTCTRL => true))
51
79
  next
52
80
  end
53
81
 
54
82
  # Ctrl は他のキーに変換
55
83
  if mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL]
84
+ # Ctrl+I/O はそのまま
85
+ if code == KEY_I || code == KEY_O
86
+ rk.key(code, mod)
87
+ next
88
+ end
89
+
56
90
  # Ctrl+K は行末まで削除
57
91
  if code == KEY_K
58
- rk.key(KEY_END, mod_disable_all.merge({KEY_LEFTSHIFT => true}))
59
- rk.key(KEY_X, mod_disable_all.merge({KEY_LEFTCTRL => true}))
92
+ rk.key(KEY_END, mod_disable_all.merge(KEY_LEFTSHIFT => true)) # SHIFT+END
93
+ rk.key(KEY_X, mod_disable_all.merge(KEY_LEFTCTRL => true)) # Ctrl+X
60
94
  next
61
95
  end
96
+
62
97
  # 単純な変換
63
98
  if ctrl_map[code]
64
- rk.key(ctrl_map[code], mod_disable_ctrl)
99
+ rk.key(ctrl_map[code], mod.merge(mod_disable_ctrl))
65
100
  next
66
101
  end
102
+
67
103
  # その他の Ctrl+[A-Z] は無視
68
104
  if Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/
69
105
  next
70
106
  end
71
107
  end
72
108
 
109
+ # それ以外はそのまま
73
110
  rk.key(code, mod)
74
111
  end
data/example/tmtms.rb CHANGED
@@ -1,117 +1,69 @@
1
1
  # tmtms 用
2
- #
3
- # fcitx が有効な場合に /tmp/fcitx-enabled ファイルを作るスクリプトを動かしておく:
4
- # while :; do
5
- # if [ $(fcitx-remote) -eq 2 ]; then
6
- # touch /tmp/fcitx-enabled
7
- # else
8
- # rm -f /tmp/fcitx-enabled
9
- # fi
10
- # sleep 0.1
11
- # done
12
2
 
13
3
  require 'rkremap'
14
- include Rkremap::KeyCode
15
-
16
- class State
17
- attr_accessor :converted
18
-
19
- def initialize
20
- @press = nil
21
- @converted = false
22
- @thread = nil
23
- end
24
-
25
- def press(thread)
26
- @press = true
27
- @converted = false
28
- @thread = thread
29
- end
30
-
31
- def release
32
- @press = false
33
- @converted = false
34
- @thread.kill
35
- @thread = nil
36
- end
4
+ require 'tmtms_timer'
37
5
 
38
- def pressed?
39
- @press
40
- end
41
- end
6
+ include Rkremap::KeyCode
42
7
 
43
- rk = Rkremap.new
8
+ rk = Rkremap.new(*ARGV, mouse: true, exclude: /touchpad/)
44
9
  rk.grab = true
45
10
  rk.x11 = true
46
11
 
47
- # 変換/無変換キーを0.5秒以上押してるとALTキーとして扱う。
48
- # 0.5秒以内でも変換/無変換キーを押しながら他のキーを押すとALTキーとして扱う。
12
+ until system "xinput | grep -q rkremap"
13
+ sleep 0.1
14
+ end
15
+ system "xinput set-prop pointer:rkremap 'libinput Scroll Method Enabled' 0 0 1"
49
16
 
50
- state = {
51
- KEY_HENKAN => State.new,
52
- KEY_MUHENKAN => State.new,
17
+ # HENKAN, MUHENKAN を 0.5秒以上押したら SUPER とする
18
+ timer = Tmtms::Timer.new
19
+ jobs = {
20
+ KEY_HENKAN => nil,
21
+ KEY_MUHENKAN => nil,
53
22
  }
54
23
 
55
24
  henkan_map = {
56
- KEY_HENKAN => KEY_RIGHTALT,
57
- KEY_MUHENKAN => KEY_LEFTALT,
25
+ KEY_HENKAN => KEY_RIGHTMETA,
26
+ KEY_MUHENKAN => KEY_RIGHTMETA, # LEFTMETA だとデスクトップ環境のメニューが開いたりするため
58
27
  }
59
28
 
60
- rk.match(code: [KEY_HENKAN, KEY_MUHENKAN], type: :press) do |event|
61
- thr = Thread.new(event.code) do |code|
62
- sleep 0.5
63
- rk.synchronize do
64
- if state[code].pressed?
65
- rk.event(code: henkan_map[code], type: :press)
66
- state[code].converted = true
29
+ rk.match(code: [KEY_HENKAN, KEY_MUHENKAN]) do |event|
30
+ if event.type == :press
31
+ job = timer.set(0.5) do
32
+ rk.synchronize do
33
+ rk.event(code: henkan_map[event.code], type: :press)
67
34
  end
68
35
  end
36
+ jobs[event.code] = job
37
+ elsif event.type == :release
38
+ if jobs[event.code]&.cancel # 0.5秒以内に離された
39
+ rk.key(event.code)
40
+ else
41
+ rk.event(code: henkan_map[event.code], type: :release)
42
+ end
69
43
  end
70
- state[event.code].press(thr)
71
- event.skip
72
- end
73
-
74
- rk.match(code: [KEY_HENKAN, KEY_MUHENKAN], type: :release) do |event|
75
- if state[event.code].converted
76
- rk.event(code: henkan_map[event.code], type: :release)
77
- event.skip
78
- else
79
- rk.event(code: event.code, type: :press)
80
- rk.event(code: event.code, type: :release)
81
- end
82
- state[event.code].release
83
- end
84
-
85
- rk.match(code: [KEY_HENKAN, KEY_MUHENKAN], type: :repeat) do |event|
86
44
  event.skip
87
45
  end
88
46
 
47
+ # 何かキーが押されたときに HENKAN, MUHENKAN が押されてれば SUPER が押されてることにする
89
48
  rk.match(type: :press) do
90
49
  [KEY_HENKAN, KEY_MUHENKAN].each do |code|
91
- if state[code].pressed?
50
+ if jobs[code]&.cancel # 0.5秒以内
92
51
  rk.event(code: henkan_map[code], type: :press)
93
- state[code].converted = true
94
52
  end
95
53
  end
96
54
  end
97
55
 
56
+ # マウスボタンイベントはそのまま
57
+ rk.match(device: :mouse) do |event|
58
+ rk.event(code: event.code, type: event.type)
59
+ event.skip
60
+ end
61
+
98
62
  # CAPSLOCK は CTRL に変換
99
63
  rk.match(code: KEY_CAPSLOCK) do |event|
100
- rk.event(code: KEY_LEFTCTRL, type: event.type)
101
- event.skip
64
+ event.code = KEY_LEFTCTRL
102
65
  end
103
66
 
104
- ctrl_map = {
105
- KEY_A => KEY_HOME,
106
- KEY_E => KEY_END,
107
- KEY_B => KEY_LEFT,
108
- KEY_F => KEY_RIGHT,
109
- KEY_N => KEY_DOWN,
110
- KEY_P => KEY_UP,
111
- KEY_D => KEY_DELETE,
112
- KEY_H => KEY_BACKSPACE,
113
- KEY_I => KEY_TAB,
114
- }
115
67
  mod_disable_ctrl = {
116
68
  KEY_LEFTCTRL => false,
117
69
  KEY_RIGHTCTRL => false,
@@ -130,56 +82,102 @@ mod_disable_meta = {
130
82
  }
131
83
  mod_disable_all = {}.merge(mod_disable_ctrl, mod_disable_shift, mod_disable_alt, mod_disable_meta)
132
84
 
85
+ # JISキーボードを英語配列にしたときに一部キーを変える
133
86
  key_map = {
134
87
  KEY_YEN => KEY_BACKSLASH,
135
88
  KEY_BACKSLASH => KEY_GRAVE,
136
89
  KEY_GRAVE => KEY_ESC,
137
90
  }
91
+ rk.match do |event, mod|
92
+ event.code = key_map[event.code] || event.code
93
+ # RO キーは「\」(SHIFTキーを押してる場合は「_」)
94
+ if event.code == KEY_RO
95
+ event.code = (mod[KEY_LEFTSHIFT] || mod[KEY_RIGHTSHIFT]) ? KEY_MINUS : KEY_BACKSLASH
96
+ end
97
+ end
98
+
99
+ # Emacs や VirtualBox ではそのまま
100
+ rk.match(app: /Emacs|VirtualBox Machine/) do |event|
101
+ rk.event(code: event.code, type: event.type)
102
+ event.skip
103
+ end
138
104
 
139
- rk.start do |code, mod, app|
140
- # JISキーボードを英語配列にしたときに一部キーを変える
141
- code = key_map[code] || code
142
- if code == KEY_RO
143
- code = mod[KEY_LEFTSHIFT] || mod[KEY_RIGHTSHIFT] ? KEY_MINUS : KEY_BACKSLASH
105
+ # 端末
106
+ rk.match(app: /terminal/i) do |event, mod|
107
+ # Super+Ctrl はそのまま
108
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
109
+ rk.event(code: event.code, type: event.type)
144
110
  end
111
+ # Super+KEY は Ctrl+Shift+KEY に変換
112
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && Rkremap::CODE_KEY[event.code] =~ /\AKEY_[A-Z]\z/
113
+ rk.with_modifier(mod_disable_meta.merge(KEY_LEFTCTRL => true, KEY_LEFTSHIFT => true)) do
114
+ rk.event(code: event.code, type: event.type)
115
+ end
116
+ else
117
+ rk.event(code: event.code, type: event.type)
118
+ end
119
+ event.skip
120
+ end
121
+
122
+ # その他のウィンドウ
123
+ ctrl_map = {
124
+ KEY_A => KEY_HOME,
125
+ KEY_E => KEY_END,
126
+ KEY_B => KEY_LEFT,
127
+ KEY_F => KEY_RIGHT,
128
+ KEY_N => KEY_DOWN,
129
+ KEY_P => KEY_UP,
130
+ KEY_D => KEY_DELETE,
131
+ KEY_H => KEY_BACKSPACE,
132
+ KEY_I => KEY_TAB,
133
+ }
145
134
 
146
- # Emacs や端末等ではそのまま
147
- if app.class_name == 'Emacs' || app.class_name =~ /terminal/i || app.class_name == 'VirtualBox Machine'
135
+ rk.start do |code, mod|
136
+ # Super + Ctrl + 何か はそのまま
137
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL])
148
138
  rk.key(code, mod)
149
139
  next
150
140
  end
151
141
 
152
- # ALT+[A-Z]/Enter を Ctrl+[A-Z]/Enter に変換
153
- if (mod[KEY_LEFTALT] || mod[KEY_RIGHTALT]) && (Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/ || code == KEY_ENTER)
154
- mod.merge!(mod_disable_alt, {KEY_LEFTCTRL => true})
155
- mod[KEY_LEFTCTRL] = true
156
- rk.key(code, mod)
142
+ # Super+[A-Z]/Enter を Ctrl+[A-Z]/Enter に変換
143
+ if (mod[KEY_LEFTMETA] || mod[KEY_RIGHTMETA]) && (Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/ || code == KEY_ENTER)
144
+ rk.key(code, mod.merge(mod_disable_meta, KEY_LEFTCTRL => true))
145
+ next
146
+ end
147
+
148
+ # Alt + F, B は Ctrl + →, ← に変換
149
+ if (mod[KEY_LEFTALT] || mod[KEY_RIGHTALT]) && (code == KEY_F || code == KEY_B)
150
+ rk.key(code == KEY_F ? KEY_RIGHT : KEY_LEFT, mod.merge(mod_disable_alt, KEY_LEFTCTRL => true))
157
151
  next
158
152
  end
159
153
 
160
154
  # Ctrl は他のキーに変換
161
155
  if mod[KEY_LEFTCTRL] || mod[KEY_RIGHTCTRL]
162
- # Ctrl-K/I/O は日本語変換時はそのまま
163
- if (code == KEY_K || code == KEY_I || code ==KEY_O) && File.exist?('/tmp/fcitx-enabled')
156
+ # Ctrl+I/O はそのまま
157
+ if code == KEY_I || code == KEY_O
164
158
  rk.key(code, mod)
165
159
  next
166
160
  end
161
+
167
162
  # Ctrl+K は行末まで削除
168
163
  if code == KEY_K
169
- rk.key(KEY_END, mod_disable_all.merge({KEY_LEFTSHIFT => true}))
170
- rk.key(KEY_X, mod_disable_all.merge({KEY_LEFTCTRL => true}))
164
+ rk.key(KEY_END, mod_disable_all.merge(KEY_LEFTSHIFT => true)) # SHIFT+END
165
+ rk.key(KEY_X, mod_disable_all.merge(KEY_LEFTCTRL => true)) # Ctrl+X
171
166
  next
172
167
  end
168
+
173
169
  # 単純な変換
174
170
  if ctrl_map[code]
175
- rk.key(ctrl_map[code], mod_disable_ctrl)
171
+ rk.key(ctrl_map[code], mod.merge(mod_disable_ctrl))
176
172
  next
177
173
  end
174
+
178
175
  # その他の Ctrl+[A-Z] は無視
179
176
  if Rkremap::CODE_KEY[code] =~ /\AKEY_[A-Z]\z/
180
177
  next
181
178
  end
182
179
  end
183
180
 
181
+ # それ以外はそのまま
184
182
  rk.key(code, mod)
185
183
  end