aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorumi <57262844+umi-umi@users.noreply.github.com>2020-06-22 20:08:26 +0900
committerGitHub <noreply@github.com>2020-06-22 20:08:26 +0900
commit924573ece24589869831b7450468971c4dbe980a (patch)
tree8ead28da101641fe2c96c8a92c2db17a096052d9
parent5f06fce2c5c003cae0cba88c5f152fbff4e072f6 (diff)
downloadqmk_firmware-924573ece24589869831b7450468971c4dbe980a.tar.gz
qmk_firmware-924573ece24589869831b7450468971c4dbe980a.zip
[Docs] Japanese translation of docs/feature_macros.md (#9137)
* add feature_macros.md translation * update based on comment * update based on comment
-rw-r--r--docs/ja/feature_macros.md399
1 files changed, 399 insertions, 0 deletions
diff --git a/docs/ja/feature_macros.md b/docs/ja/feature_macros.md
new file mode 100644
index 000000000..1204fa8ff
--- /dev/null
+++ b/docs/ja/feature_macros.md
@@ -0,0 +1,399 @@
1# マクロ
2
3<!---
4 original document: 0.8.169:docs/feature_macros.md
5 git diff 0.8.169 HEAD -- docs/feature_macros.md | cat
6-->
7
8マクロにより、1つのキーを押すだけで複数のキーストロークを送信することができます。QMK にはマクロを定義し使う方法が幾つかあります。これらはなんでもすることができます: よく使うフレーズの入力、コピーペースト、反復的なゲームの動き、あるいはコードを書くことさえ手助けします。
9
10!> **セキュリティの注意**: マクロを使って、パスワード、クレジットカード番号、その他の機密情報のいずれも送信することが可能ですが、それは非常に悪い考えです。あなたのキーボードを手に入れた人は誰でもテキストエディタを開いてその情報にアクセスすることができます。
11
12## 新しい方法: `SEND_STRING()` と `process_record_user`
13
14単語またはフレーズを入力するキーが欲しい時があります。最も一般的な状況のために `SEND_STRING()` を提供しています。これは文字列(つまり、文字のシーケンス)を入力します。簡単にキーコードに変換することができる全ての ASCII 文字がサポートされています (例えば、`\n\t`)。
15
16以下は2キーのキーボードのための `keymap.c` の例です:
17
18```c
19enum custom_keycodes {
20 QMKBEST = SAFE_RANGE,
21};
22
23bool process_record_user(uint16_t keycode, keyrecord_t *record) {
24 switch (keycode) {
25 case QMKBEST:
26 if (record->event.pressed) {
27 // キーコード QMKBEST が押された時
28 SEND_STRING("QMK is the best thing ever!");
29 } else {
30 // キーコード QMKBEST が放された時
31 }
32 break;
33
34 }
35 return true;
36};
37
38const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
39 [0] = {
40 {QMKBEST, KC_ESC}
41 }
42};
43```
44
45ここで起きることは以下の通りです:
46最初に他のキーコードで使用されていない範囲で新しいカスタムキーコードを定義します。
47次に、`process_record_user` 関数を使います。これはキーが押されるか放されるたびに呼び出され、カスタムキーコードがアクティブかどうかを確認します。
48アクティブな場合、`SEND_STRING` マクロ (これは C プロセッサのマクロで、QMK のマクロと混同しないでください)を介して文字列 `"QMK is the best thing ever!"` をコンピュータに送信します。
49呼び出し元に、処理したばかりのキー押下を通常通り(機能を置き換えたり変更したりしなかったので)処理し続けるよう指示するため、`true` を返します。
50最後に、最初のボタンがマクロをアクティブにし、2番目のボタンが単なるエスケープボタンになるようにキーマップを定義します。
51
52複数のマクロを追加することもできます。
53以下のように、別のキーコードを追加し、switch 文に別の case ラベルを追加することで、それを行うことができます:
54
55```c
56enum custom_keycodes {
57 QMKBEST = SAFE_RANGE,
58 QMKURL,
59 MY_OTHER_MACRO
60};
61
62bool process_record_user(uint16_t keycode, keyrecord_t *record) {
63 switch (keycode) {
64 case QMKBEST:
65 if (record->event.pressed) {
66 // キーコード QMKBEST が押された時
67 SEND_STRING("QMK is the best thing ever!");
68 } else {
69 // キーコード QMKBEST が放された時
70 }
71 break;
72 case QMKURL:
73 if (record->event.pressed) {
74 // キーコード QMKURL が押された場合
75 SEND_STRING("https://qmk.fm/\n");
76 } else {
77 // キーコード QMKURL が放された場合
78 }
79 break;
80 case MY_OTHER_MACRO:
81 if (record->event.pressed) {
82 SEND_STRING(SS_LCTL("ac")); // 全てを選択しコピーします
83 }
84 break;
85 }
86 return true;
87};
88
89const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
90 [0] = {
91 {MY_CUSTOM_MACRO, MY_OTHER_MACRO}
92 }
93};
94```
95
96### 高度なマクロ
97
98`process_record_user()` 関数のほかに、`post_process_record_user()` 関数があります。これは `process_record` の後に実行され、キーストロークが送信された後の処理に使用できます。これは例えば、通常のキーの前に押され、通常のキーの後で放されるキーがほしい場合に便利です。
99
100この例では、通常のキー入力を変更して、キーストロークが通常送信される前に `F22` が押されるようにし、キーが放された__後にのみ__ `F22` キーを放します。
101
102```c
103static uint8_t f22_tracker;
104
105bool process_record_user(uint16_t keycode, keyrecord_t *record) {
106 switch (keycode) {
107 case KC_A ... KC_F21: // F22 をスキップする方法に注意してください
108 case KC_F23 ... KC_EXSEL: //exsel は修飾キーの直前のキーです
109 if (record->event.pressed) {
110 register_code(KC_F22); //これは F22 を押したことを送信することを意味します
111 f22_tracker++;
112 register_code(keycode);
113 return false;
114 }
115 break;
116 }
117 return true;
118}
119
120void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
121 switch (keycode) {
122 case KC_A ... KC_F21: // F22 をスキップする方法に注意してください
123 case KC_F23 ... KC_EXSEL: //exsel は修飾キーの直前のキーです
124 if (!record->event.pressed) {
125 f22_tracker--;
126 if (!f22_tracker) {
127 unregister_code(KC_F22); //これは F22 を放したことを送信することを意味します
128 }
129 }
130 break;
131 }
132}
133```
134
135
136### タップ、ダウン、アップ
137
138`Ctrl` あるいは `Home` など、ソースコードに文字列として表記できないキーをマクロで使うこともできます。
139以下のようにラップすることで任意のコードを送信することができます:
140
141* `SS_TAP()` キーを押して放します。
142* `SS_DOWN()` キーを押します (ただし、放しません)。
143* `SS_UP()` キーを放します。
144
145例えば:
146
147 SEND_STRING(SS_TAP(X_HOME));
148
149`KC_HOME` をタップします - プリフィックスが `X_` で `KC_` ではないことに注意してください。以下のように、他の文字列と組み合わせることもできます:
150
151 SEND_STRING("VE"SS_TAP(X_HOME)"LO");
152
153これは "VE" に続けて `KC_HOME` をタップ、そして "LO" (新しい行の場合は "LOVE" と綴る)を送信します。
154
155文字列に遅延を追加することもできます:
156
157* `SS_DELAY(msecs)` は指定されたミリ秒だけ遅らせます。
158
159例えば:
160
161 SEND_STRING("VE" SS_DELAY(1000) SS_TAP(X_HOME) "LO");
162
163これは "VE" 、1秒の遅延、`KC_HOME` をタップ、"LO" (新しい行の場合は "LOVE" と綴るが、中間に遅延がある) を送信します。
164
165使用できるモッドショートカットもいくつかあります:
166
167* `SS_LCTL(文字列)`
168* `SS_LSFT(文字列)`
169* `SS_LALT(文字列)`、`SS_LOPT(文字列)`
170* `SS_LGUI(文字列)`、`SS_LCMD(文字列)`、`SS_LWIN(文字列)`
171* `SS_RCTL(文字列)`
172* `SS_RSFT(文字列)`
173* `SS_RALT(文字列)`、`SS_ROPT(文字列)`、`SS_ALGR(文字列)`
174* `SS_RGUI(文字列)`、`SS_RCMD(文字列)`、`SS_RWIN(文字列)`
175
176これらはそれぞれの修飾キーを押し、指定された文字列を送信してから、修飾キーを解放します。
177それらは以下のように使うことができます:
178
179 SEND_STRING(SS_LCTL("a"));
180
181これは、左 Control +`a` (左 Control をダウンし、`a`、左 Control をアップ)を送信します - それらは文字列(例えば `"k"`)であり、`X_K` キーコードでは無いことに注意してください。
182
183### 代替キーマップ
184
185デフォルトでは、QWERTY レイアウトの US キーマップを想定しています; それを変更したい場合(例えば OS がソフトウェア Colemak を使う場合)、キーマップのどこかに以下を含めます:
186
187 #include <sendstring_colemak.h>
188
189### メモリ内の文字列
190
191何らかの理由で文字列を操作していて、(リテラル、文字列定数の代わりに)生成したばかりのものを出力する必要がある場合は、以下のように `send_string()` を使うことができます:
192
193```c
194char my_str[4] = "ok.";
195send_string(my_str);
196```
197
198上で定義したショートカットは `send_string()` では動作しないですが、必要に応じて別の行に分けることができます:
199
200```c
201char my_str[4] = "ok.";
202SEND_STRING("I said: ");
203send_string(my_str);
204SEND_STRING(".."SS_TAP(X_END));
205```
206
207
208## 高度なマクロ関数
209
210マクロの生成に役立つ関数が幾つかあります。マクロの中にかなり高度なコードを書くことができますが、機能が複雑になりすぎる場合は、代わりにカスタムキーコードを定義することをお勧めします。マクロはシンプルにしなければなりません。
211
212?> 追加の機能として、[便利な関数](ja/ref_functions.md) の中で説明される関数を使うこともできます。例えば `reset_keyboard()` によりマクロの一部としてキーボードをリセットすることができます。
213
214### `record->event.pressed`
215
216これでスイッチが押されているか放されているかどうかをテストすることができます。以下が例です。
217
218```c
219 if (record->event.pressed) {
220 // キーダウン時
221 } else {
222 // キーアップ時
223 }
224```
225
226### `register_code(<kc>);`
227
228これはコンピュータに `<kc>` キーダウンイベントを送信します。例として `KC_ESC`、`KC_C`、`KC_4` や、`KC_LSFT` と `KC_LGUI` のような修飾キーなどもあります。
229
230### `unregister_code(<kc>);`
231
232`register_code` 関数と対応して、これは `<kc>` キーアップイベントをコンピュータに送信します。これを使わない場合、キーは送信されるまで押し続けられます。
233
234### `tap_code(<kc>);`
235
236これは `register_code(<kc>)` を送信し、その後 `unregister_code(<kc>)` を送信します。押下とリリースイベントの両方を送信する場合に便利です (押し続けるのではなく、キーを"タップ"する)。
237
238タップの登録(解除)に問題がある場合、`config.h` ファイルで `#define TAP_CODE_DELAY 100` を設定することで、登録イベントと解除イベントの間に遅延を追加することができます。値はミリ秒です。
239
240### `register_code16(<kc>);`、`unregister_code16(<kc>);`、`tap_code16(<kc>);`
241
242これらの関数は対応する通常の関数と同様に機能しますが、修飾キーで修飾されたキーコードを使うことができます (Shift、Alt、Control、GUI を適用)。
243
244例えば、修飾キーを押して(`register_code()`して)、キーコードを押す(`register_code()`する)代わりに、`register_code16(S(KC_5));` を使うことができます。
245
246### `clear_keyboard();`
247
248これは現在押されている全ての修飾キーとキーをクリアします。
249
250### `clear_mods();`
251
252これは現在押されている全ての修飾キーをクリアします。
253
254### `clear_keyboard_but_mods();`
255
256これは現在押されている修飾キー以外の全てのキーをクリアします。
257
258## 高度な例:
259
260### スーパー ALT↯TAB
261
262このマクロは `KC_LALT` を登録し、`KC_TAB` をタップして、1000ms 待ちます。キーが再度タップされると、別の `KC_TAB` が送信されます; タップが無い場合、`KC_LALT` が登録解除され、ウィンドウを切り替えることができます。
263
264```c
265bool is_alt_tab_active = false; # keymap.c の先頭付近にこれを追加します
266uint16_t alt_tab_timer = 0; # すぐにそれらを使います
267
268enum custom_keycodes { # 素晴らしいキーコードを用意してください
269 ALT_TAB = SAFE_RANGE,
270};
271
272bool process_record_user(uint16_t keycode, keyrecord_t *record) {
273 switch (keycode) { # これはキーコードを利用したつまらない作業のほとんどを行います。
274 case ALT_TAB:
275 if (record->event.pressed) {
276 if (!is_alt_tab_active) {
277 is_alt_tab_active = true;
278 register_code(KC_LALT);
279 }
280 alt_tab_timer = timer_read();
281 register_code(KC_TAB);
282 } else {
283 unregister_code(KC_TAB);
284 }
285 break;
286 }
287 return true;
288}
289
290void matrix_scan_user(void) { # とても重要なタイマー
291 if (is_alt_tab_active) {
292 if (timer_elapsed(alt_tab_timer) > 1000) {
293 unregister_code(KC_LALT);
294 is_alt_tab_active = false;
295 }
296 }
297}
298```
299
300---
301
302## **(非推奨)** 古い方法: `MACRO()` と `action_get_macro`
303
304!> これは TMK から継承されており、更新されていません - 代わりに `SEND_STRING` と `process_record_user` を使うことをお勧めします。
305
306デフォルトでは、QMK はマクロが無いことを前提としています。マクロを定義するには、`action_get_macro()` 関数を作成します。例えば:
307
308```c
309const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
310 if (record->event.pressed) {
311 switch(id) {
312 case 0:
313 return MACRO(D(LSFT), T(H), U(LSFT), T(I), D(LSFT), T(1), U(LSFT), END);
314 case 1:
315 return MACRO(D(LSFT), T(B), U(LSFT), T(Y), T(E), D(LSFT), T(1), U(LSFT), END);
316 }
317 }
318 return MACRO_NONE;
319};
320```
321
322これは割り当てられているキーが押された時に実行される2つのマクロを定義します。キーが放された時にそれらを実行したい場合は、if 文を変更することができます。
323
324 if (!record->event.pressed) {
325
326### マクロコマンド
327
328マクロは以下のコマンドを含めることができます:
329
330* I() はストロークの間隔をミリ秒単位で変更します。
331* D() はキーを押します。
332* U() はキーを放します。
333* T() はキーをタイプ(押して放す)します。
334* W() は待ちます (ミリ秒)。
335* END 終了マーク。
336
337### マクロをキーにマッピングする
338
339マクロを呼び出すにはキーマップ内で `M()` 関数を使います。例えば、2キーのキーボードのキーマップは以下の通りです:
340
341```c
342const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
343 [0] = LAYOUT(
344 M(0), M(1)
345 ),
346};
347
348const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
349 if (record->event.pressed) {
350 switch(id) {
351 case 0:
352 return MACRO(D(LSFT), T(H), U(LSFT), T(I), D(LSFT), T(1), U(LSFT), END);
353 case 1:
354 return MACRO(D(LSFT), T(B), U(LSFT), T(Y), T(E), D(LSFT), T(1), U(LSFT), END);
355 }
356 }
357 return MACRO_NONE;
358};
359```
360
361左側のキーを押すと、"Hi!" を入力し、右側のキーを押すと "Bye!" を入力します。
362
363### マクロに名前を付ける
364
365キーマップを読みやすくしながらキーマップから参照したいマクロがたくさんある場合は、ファイルの先頭で `#define` を使って名前を付けることができます。
366
367```c
368#define M_HI M(0)
369#define M_BYE M(1)
370
371const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
372 [0] = LAYOUT(
373 M_HI, M_BYE
374 ),
375};
376```
377
378
379## 高度な例:
380
381### 単一キーのコピーと貼り付け
382
383この例は、押された時に `Ctrl-C` を送信し、放される時に `Ctrl-V` を送信するマクロを定義します。
384
385```c
386const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
387 switch(id) {
388 case 0: {
389 if (record->event.pressed) {
390 return MACRO( D(LCTL), T(C), U(LCTL), END );
391 } else {
392 return MACRO( D(LCTL), T(V), U(LCTL), END );
393 }
394 break;
395 }
396 }
397 return MACRO_NONE;
398};
399```