rkremap 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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