aboutsummaryrefslogtreecommitdiff
path: root/docs/ja/feature_advanced_keycodes.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/ja/feature_advanced_keycodes.md')
-rw-r--r--docs/ja/feature_advanced_keycodes.md185
1 files changed, 185 insertions, 0 deletions
diff --git a/docs/ja/feature_advanced_keycodes.md b/docs/ja/feature_advanced_keycodes.md
new file mode 100644
index 000000000..2416c742a
--- /dev/null
+++ b/docs/ja/feature_advanced_keycodes.md
@@ -0,0 +1,185 @@
1# 修飾キー :id=modifier-keys
2
3<!---
4 original document: 0.14.6:docs/feature_advanced_keycodes.md
5 git diff 0.14.6 HEAD -- docs/feature_advanced_keycodes.md | cat
6-->
7
8以下のようにキーコードとモディファイアを組み合わせることができます。押すと、モディファイアのキーダウンイベントが送信され、次に `kc` のキーダウンイベントが送信されます。放すと、`kc` のキーアップイベントが送信され、次にモディファイアのキーアップイベントが送信されます。
9
10| キー | エイリアス | 説明 |
11| ---------- | ---------------------------------- | ------------------------------------------------------------------- |
12| `LCTL(kc)` | `C(kc)` | 左 Control を押しながら `kc` を押します。 |
13| `LSFT(kc)` | `S(kc)` | 左 Shift を押しながら `kc` を押します。 |
14| `LALT(kc)` | `A(kc)`, `LOPT(kc)` | 左 Alt を押しながら `kc`を押します。 |
15| `LGUI(kc)` | `G(kc)`, `LCMD(kc)`, `LWIN(kc)` | 左 GUI を押しながら `kc` を押します。 |
16| `RCTL(kc)` | | 右 Control を押しながら `kc` を押します。 |
17| `RSFT(kc)` | | 右 Shift を押しながら `kc` を押します。 |
18| `RALT(kc)` | `ROPT(kc)`, `ALGR(kc)` | 右 Alt を押しながら `kc` を押します。 |
19| `RGUI(kc)` | `RCMD(kc)`, `LWIN(kc)` | 右 GUI を押しながら `kc` を押します。 |
20| `LSG(kc)` | `SGUI(kc)`, `SCMD(kc)`, `SWIN(kc)` | 左 Shift と左 GUI を押しながら `kc` を押します。 |
21| `LAG(kc)` | | 左 Alt と左 GUI を押しながら `kc` を押します。 |
22| `RSG(kc)` | | 右 Shift と右 GUI を押しながら `kc` を押します。 |
23| `RAG(kc)` | | 右 Alt と右 GUI を押しながら `kc` を押します。 |
24| `LCA(kc)` | | 左 Control と左 Alt を押しながら `kc` を押します。 |
25| `LSA(kc)` | | 左 Shift と左 Alt を押しながら `kc` を押します。 |
26| `RSA(kc)` | `SAGR(kc)` | 右 Shift と右 Alt (AltGr) を押しながら `kc` を押します。 |
27| `RCS(kc)` | | 右 Control と右 Shift を押しながら `kc` を押します。 |
28| `LCAG(kc)` | | 左 Control、左 Alt、左 GUI を押しながら `kc` を押します。 |
29| `MEH(kc)` | | 左 Control、左 Shift、左 Alt を押しながら `kc` を押します。 |
30| `HYPR(kc)` | | 左 Control、左 Shift、左 Alt、左 GUI を押しながら `kc` を押します。 |
31
32また、それらを繋げることができます。例えば、`LCTL(LALT(KC_DEL))` または `C(A(KC_DEL))` は1回のキー押下で Control+Alt+Delete を送信するキーを作成します。
33
34# モディファイアの状態を確認 :id=checking-modifier-state
35
36
37現在のモディファイアの状態は、2つの関数によって主にアクセスされます。: `get_mods()` 関数は通常のモディファイアとモッドタップの状態を、`get_oneshot_mods()` 関数はワンショットモディファイアの状態を確認する関数です。(ワンショットモディファイアはキーが押されていない限り、通常のモディファイアキーのように動作します。)
38
391つ以上の特定のモディファイアが現在のモディファイアの状態に含まれているかどうかは、モディファイアの状態と、照合したいモディファイアの組み合わせに相当するモッドマスクとを AND 演算することで検出できます。
40ビット演算が使われる理由は、モディファイアの状態が (GASC)<sub>R</sub>(GASC)<sub>L</sub> の形式で1バイトとして格納されるためです。
41
42従って、例を挙げると、`01000010` は LShift+RALT の内部表現です。
43C 言語におけるビット演算のより詳しい情報は、[ここ](https://en.wikipedia.org/wiki/Bitwise_operations_in_C) をクリックして、Wikipedia のページのトピックを開いてください。
44
45実際には、`get_mods() & MOD_BIT(KC_<modifier>)`([モディファイアキーコードのリスト](ja/keycodes_basic.md#modifiers) 参照) で、あるモディファイアが有効かどうかをチェックできるということです、また左右のモディファイアの違いが重要ではなく、両方にマッチさせたい場合は、`get_mods() & MOD_MASK_<modifier>`とします。ワンショットモディファイアについても、`get_mods()` を `get_oneshot_mods()` に置き換えれば同じことができます。
46
47モディファイアの特定の組み合わせが同時にアクティブなのか確認する*だけ*なら、上で説明したモディファイアの状態とモッドマスクの論理積と、モッドマスク自身の結果を比較します。: `get_mods() & <mod mask> == <mod mask>`
48
49例えば、左 Control キーと 左 Shift キーのワンショットモディファイアがオンで、その他のワンショットモディファイアがオフの場合にカスタムコードを起動したいとしましょう。そうするには、`(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))` で左 Control キーと Shift キーのモッドビットを組み合わせて目的のモッドマスクを構成し、それらを差し込みます: `get_oneshot_mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT)) == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_LSFT))`。モッドビットマスクの代わりに `MOD_MASK_CS` 使うと、条件を満たすために4つのモディファイアキー (左右両方の Control キーと Shift キー) を押す必要があります。
50
51モッドマスクの完全なリストは、以下のとおりです。
52
53| モッドマスク名 | マッチするモディファイア |
54|--------------------|-------------------------------------------------------------|
55| `MOD_MASK_CTRL` | 左 Control , 右 Control |
56| `MOD_MASK_SHIFT` | 左 Shift , 右 Shift |
57| `MOD_MASK_ALT` | 左 Alt , 右 Alt |
58| `MOD_MASK_GUI` | 左 GUI , 右 GUI |
59| `MOD_MASK_CS` | Control , Shift |
60| `MOD_MASK_CA` | (左/右) Control , (左/右) Alt |
61| `MOD_MASK_CG` | (左/右) Control , (左/右) GUI |
62| `MOD_MASK_SA` | (左/右) Shift , (左/右) Alt |
63| `MOD_MASK_SG` | (左/右) Shift , (左/右) GUI |
64| `MOD_MASK_AG` | (左/右) Alt , (左/右) GUI |
65| `MOD_MASK_CSA` | (左/右) Control , (左/右) Shift , (左/右) Alt |
66| `MOD_MASK_CSG` | (左/右) Control , (左/右) Shift , (左/右) GUI |
67| `MOD_MASK_CAG` | (左/右) Control , (左/右) Alt , (左/右) GUI |
68| `MOD_MASK_SAG` | (左/右) Shift , (左/右) Alt , (左/右) GUI |
69| `MOD_MASK_CSAG` | (左/右) Control , (左/右) Shift , (左/右) Alt , (左/右) GUI |
70
71`get_mods()` 関数を使って現在アクティブなモディファイアにアクセスする以外に、モディファイアの状態を変更するために使えるいくつかの関数があります。ここでは、`mods` 引数はモディファイアビットマスクを表します。
72
73* `add_mods(mods)`: その他のモディファイアに影響を与えずに `mods` を有効にします。
74* `register_mods(mods)`: `add_mods` に似ていますが、キーボードにすぐにレポートを送信します。
75* `del_mods(mods)`: その他のモディファイアに影響を与えずに `mods` を無効にします。
76* `unregister_mods(mods)`: `del_mods` に似ていますが、キーボードにすぐにレポートを送信します。
77* `set_mods(mods)`: `mods` で現在のモディファイアの状態を上書きします
78* `clear_mods()`: 全てのモディファイアを無効にすることによって、モディファイアの状態をリセットします。
79
80同様に、`get_oneshot_mods()` 関数に加えて、ワンショットモディファイアのための関数もあります。
81
82* `add_oneshot_mods(mods)`: その他のワンショットモディファイアに影響を与えずに `mods` を有効にします
83* `del_oneshot_mods(mods)`: その他のワンショットモディファイアに影響を与えずに `mods` を無効にします
84* `set_oneshot_mods(mods)`: `mods` で現在のワンショットモディファイアの状態を上書きします
85* `clear_oneshot_mods()`: 全てのワンショットモディファイアを無効にすることによって、ワンショットモディファイアの状態をリセットします。
86
87## 例 :id=examples
88
89次の例は、[マクロについてのページ](ja/feature_macros.md) で読める [高度なマクロ](ja/feature_macros.md?id=advanced-macro-functions) を使っています。
90### Alt + Tab の代わりの Alt + Escape :id=alt-escape-for-alt-tab
91
92左 Alt と `KC_ESC` が押されたときに、アプリ切り替えの(左 Alt と) `KC_TAB` のように振る舞うことを実現する単純な例です。この例は、左 Alt だけがアクティブになっているかを厳格に確認します。つまり、Alt+Shift+Esc によるアプリの逆順での切り替えはできません。また、この例は、実際の Alt+Escape キーボードショートカットを起動することはできなくなりますが、AltGr+Escape キーボードショートカットを起動することはできることに留意してください。
93
94```c
95bool process_record_user(uint16_t keycode, keyrecord_t *record) {
96 switch (keycode) {
97
98 case KC_ESC:
99 // 左 Alt だけがアクティブか検知します
100 if ((get_mods() & MOD_BIT(KC_LALT)) == MOD_BIT(KC_LALT)) {
101 if (record->event.pressed) {
102 // KC_LALT を登録する必要はありません。既にアクティブだからです。
103 // Alt モディファイアはこの KC_TAB に適用されます。
104 register_code(KC_TAB);
105 } else {
106 unregister_code(KC_TAB);
107 }
108 // QMK にこれ以上キーコードの処理をさせません。
109 return false;
110 }
111 // それ以外の場合は、QMK に通常通り KC_ESC の処理をさせます。
112 return true;
113
114 }
115 return true;
116};
117```
118
119### Delete の代わりの Shift + Backspace :id=shift-backspace-for-delete
120
121`KC_BSPC` と組み合わせることで Shift の本来の動作が取り消され、そして、`KC_DEL` に完全に置き換えられる高度な例です。この例を適切に動作させるために2つのメイン変数が作られます。: `mod_state` と `delkey_registered` です。最初の1つ目の変数は、モディファイアの状態を記憶し、`KC_DEL` を登録した後に元に戻すために使われます。2つ目の変数はブール型変数 (true または false) で、`KC_DEL` の状態を追跡して Backspace/Delete キー全体のリリースを正確に管理します。
122
123前の例と対照的に、この例は厳格なモディファイアの確認を行いません。このカスタムコードを起動するには、1つまたは2つの Shift キーがアクティブな間に `KC_BSPC` を押せば十分で、他のモディファイアの状態は関係ありません。この方法は、いくつかの特典を提供します。: Ctrl+Shift+Backspace は次の単語を削除 (Control+Delete) し、Ctrl+Alt+Shift+Backspace は Ctrl+Alt+Del キーボードショートカットを実行します。
124
125```c
126// アクティブなモディファイアを表すバイナリデータを保持する変数を初期化します
127uint8_t mod_state;
128bool process_record_user(uint16_t keycode, keyrecord_t *record) {
129 // 後々の参照のために現在のモディファイアの状態を変数に格納します
130 mod_state = get_mods();
131 switch (keycode) {
132
133 case KC_BSPC:
134 {
135 // Delete キーの状態(登録されているかどうか)を追跡するブール型変数を初期化します。
136 static bool delkey_registered;
137 if (record->event.pressed) {
138 // いずれかの Shift がアクティブか検知します
139 if (mod_state & MOD_MASK_SHIFT) {
140 // 最初に、 Shift キーを KC_DEL に適用しないため、
141 // 一時的に左右両方の Shift キーをキャンセルします
142 del_mods(MOD_MASK_SHIFT);
143 register_code(KC_DEL);
144 // KC_DEL の状態を反映させるためにブール型変数を更新します
145 delkey_registered = true;
146 // Backspace/Delete キーをタップした後でも押し続けている Shift キーが機能するように、
147 // モディファイアの状態を再適用します。
148 set_mods(mod_state);
149 return false;
150 }
151 } else { // KC_BSPC キーを離した場合
152 // KC_BSPC を離しても KC_DEL が送信されている場合
153 if (delkey_registered) {
154 unregister_code(KC_DEL);
155 delkey_registered = false;
156 return false;
157 }
158 }
159 // QMK に Shift キーを除いて KC_BSPC を通常通り処理させます
160 return true;
161 }
162
163 }
164 return true;
165};
166```
167# 過去の内容 :id=legacy-content
168
169このページには多くの機能が含まれていました。このページを構成していた多くのセクションをそれぞれのページに移動しました。これより下は全て単なるリダイレクトであるため、web上で古いリンクをたどっている人は探しているものを見つけることができます。
170
171## レイヤー :id=switching-and-toggling-layers
172
173* [レイヤー](ja/feature_layers.md)
174
175## モッドタップ :id=mod-tap
176
177* [モッドタップ](ja/mod_tap.md)
178
179## ワンショットキー :id=one-shot-keys
180
181* [ワンショットキー](ja/one_shot_keys.md)
182
183## タップホールド設定オプション :id=tap-hold-configuration-options
184
185* [タップホールド設定オプション](ja/tap_hold.md)