aboutsummaryrefslogtreecommitdiff
path: root/docs/ja/custom_quantum_functions.md
diff options
context:
space:
mode:
authorumi <57262844+umi-umi@users.noreply.github.com>2020-02-17 17:50:26 +0900
committerGitHub <noreply@github.com>2020-02-17 00:50:26 -0800
commitbbe8180ad904cd432b6f97e9662231fa0548ad0e (patch)
tree3f68f7a88eca54313d5cf5d9f3c7fec8e16bf080 /docs/ja/custom_quantum_functions.md
parenteabdef3b4d304e668fcd9711c0e661a64cc96ba6 (diff)
downloadqmk_firmware-bbe8180ad904cd432b6f97e9662231fa0548ad0e.tar.gz
qmk_firmware-bbe8180ad904cd432b6f97e9662231fa0548ad0e.zip
[Docs] add japanese translation (detail guide part) (#7722)
* add detail-guide part * some updates for easy reading * some updates for easy reading * some updates for easy reading * some updates for easy reading * some updates for easy reading * some updates for easy reading * some updates for easy reading * some updates for easy reading * update file based on comment * update file based on comment * update file based on comment * update git command in header * update files based on comments, and update git command in header * update file based on comment * update file based on comment * update file based on comment * update file based on comment * update file based on comment * update file based on comment * update file based on comment * update file based on comment Co-Authored-By: shela <shelaf@users.noreply.github.com> Co-Authored-By: Takeshi ISHII <2170248+mtei@users.noreply.github.com>
Diffstat (limited to 'docs/ja/custom_quantum_functions.md')
-rw-r--r--docs/ja/custom_quantum_functions.md518
1 files changed, 518 insertions, 0 deletions
diff --git a/docs/ja/custom_quantum_functions.md b/docs/ja/custom_quantum_functions.md
new file mode 100644
index 000000000..f49df8f65
--- /dev/null
+++ b/docs/ja/custom_quantum_functions.md
@@ -0,0 +1,518 @@
1# キーボードの挙動をカスタマイズする方法
2
3<!---
4 original document: 7494490d6:docs/custom_quantum_functions.md
5 git diff 7494490d6 HEAD -- docs/custom_quantum_functions.md | cat
6-->
7
8多くの人にとって、カスタムキーボードはボタンの押下をコンピュータに送信するだけではありません。単純なボタンの押下やマクロよりも複雑なことを実行できるようにしたいでしょう。QMK にはコードを挿入したり、機能を上書きしたり、様々な状況でキーボードの挙動をカスタマイズできるフックがあります。
9
10このページでは、QMK に関する特別な知識は想定していませんが、[QMK の理解](ja/understanding_qmk.md)を読むとより根本的なレベルで何が起きているかを理解するのに役立ちます。
11
12## コア、キーボード、キーマップ階層 :id=a-word-on-core-vs-keyboards-vs-keymap
13
14私たちは QMK を階層として構造化しました:
15
16* コア (`_quantum`)
17 * キーボード/リビジョン (`_kb`)
18 * キーマップ (`_user`)
19
20以下で説明される各関数は `_kb()` サフィックスあるいは `_user()` サフィックスを使って定義することができます。`_kb()` サフィックスはキーボード/リビジョンレベルで使うことを意図しており、一方で `_user()` サフィックスはキーマップレベルで使われるべきです。
21
22キーボード/リビジョンレベルで関数を定義する場合、`_kb()` は他の何かを実行する前に `_user()` を呼び出すよう実装することが重要です。そうでなければ、キーマップレベル関数は呼ばれないでしょう。
23
24# カスタムキーコード
25
26最も一般的なタスクは、既存のキーコードの挙動を変更するか、新しいキーコードを作成することです。コードの観点からは、それぞれの仕組みは非常に似ています。
27
28## 新しいキーコードの定義
29
30独自のカスタムキーコードを作成する最初のステップは、それらを列挙することです。これは、カスタムキーコードに名前を付け、そのキーコードにユニークな番号を割り当てることの両方を意味します。QMK は、カスタムキーコードを固定範囲の番号に制限するのではなく、`SAFE_RANGE` マクロを提供します。カスタムキーコードを列挙する時に `SAFE_RANGE` を使うと、ユニークな番号を取得することが保証されます。
31
32
33これは2つのキーコードを列挙する例です。このブロックを `keymap.c` に追加した後で、キーマップの中で `FOO` と `BAR` を使うことができます。
34
35```c
36enum my_keycodes {
37 FOO = SAFE_RANGE,
38 BAR
39};
40```
41
42## 任意のキーコードの挙動のプログラミング
43
44既存のキーの挙動を上書きしたい場合、あるいは新しいキーについて挙動を定義する場合、`process_record_kb()` および `process_record_user()` 関数を使うべきです。これらは実際のキーイベントが処理される前のキー処理中に QMK によって呼び出されます。これらの関数が `true` を返す場合、QMK はキーコードを通常通りに処理します。これは、キーを置き換えるのではなく、キーの機能を拡張するのに便利です。これらの関数が `false` を返す場合、QMK は通常のキー処理をスキップし、必要なキーのアップまたはダウンイベントを送信するのかはユーザ次第です。
45
46これらの関数はキーが押されるか放されるたびに呼び出されます。
47
48### `process_record_user()` の実装例
49
50この例は2つの事を行います。`FOO` と呼ばれるカスタムキーコードの挙動を定義し、Enter キーが押されるたびに音を再生します。
51
52```c
53bool process_record_user(uint16_t keycode, keyrecord_t *record) {
54 switch (keycode) {
55 case FOO:
56 if (record->event.pressed) {
57 // 押された時に何かをします
58 } else {
59 // 放された時に何かをします
60 }
61 return false; // このキーの以降の処理をスキップします
62 case KC_ENTER:
63 // enter が押された時に音を再生します
64 if (record->event.pressed) {
65 PLAY_NOTE_ARRAY(tone_qwerty);
66 }
67 return true; // QMK に enter のプレスまたはリリースイベントを送信させます
68 default:
69 return true; // 他の全てのキーコードを通常通りに処理します
70 }
71}
72```
73
74### `process_record_*` 関数のドキュメント
75
76* キーボード/リビジョン: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
77* キーマップ: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
78
79`keycode` 引数はキーマップで定義されているものです。例えば `MO(1)`、`KC_L` など。これらのイベントを処理するには `switch...case` ブロックを使うべきです。
80
81`record` 引数は実際のプレスに関する情報を含みます:
82
83```c
84keyrecord_t record {
85 keyevent_t event {
86 keypos_t key {
87 uint8_t col
88 uint8_t row
89 }
90 bool pressed
91 uint16_t time
92 }
93}
94```
95
96# LED 制御
97
98QMK は HID 仕様で定義された5つの LED の読み取りメソッドを提供します:
99
100* Num Lock
101* Caps Lock
102* Scroll Lock
103* Compose
104* Kana
105
106ロック LED の状態を取得するには2つの方法があります:
107
108* `bool led_update_kb(led_t led_state)` あるいは `_user(led_t led_state)` を実装する、または
109* `led_t host_keyboard_led_state()` を呼び出す
110
111!> `host_keyboard_led_state()` は `led_update_user()` が呼ばれる前に新しい値を既に反映している場合があります。
112
113LED の状態を `uint8_t` として提供する2つの非推奨の関数があります:
114
115* `uint8_t led_set_kb(uint8_t usb_led)` と `_user(uint8_t usb_led)`
116* `uint8_t host_keyboard_leds()`
117
118## `led_update_user()`
119
120この関数はこれら5つの LED のいずれかの状態が変化すると呼ばれます。LED の状態を構造体のパラメータとして受け取ります。
121
122慣例により、`led_update_kb()` にそのコードを実行するようフックさせるために `led_update_user()` から `true` を返し、`led_update_kb()` でコードを実行したくない場合は `false` を返します。
123
124以下はいくつかの例です:
125
126- レイヤー表示のような何かのために LED を使うために LED を上書きする
127 - `_kb()` 関数を実行したくないので、`false` を返します。これはレイヤーの挙動を上書きするためです。
128- LED がオンあるいはオフになった時に音楽を再生する。
129 - `_kb` 関数を実行したいので、`true` を返します。これはデフォルトの LED の挙動に追加されます。
130
131?> `led_set_*` 関数は `bool` の代わりに `void` を返すため、キーボードの LED 制御を上書きすることができません。従って、代わりに `led_update_*` を使うことをお勧めします。
132
133### `led_update_kb()` の実装例
134
135```c
136bool led_update_kb(led_t led_state) {
137 bool res = led_update_user(led_state);
138 if(res) {
139 // writePin は 1 でピンを high に、0 で low に設定します。
140 // この例では、ピンは反転していて、
141 // low/0 は LED がオンになり、high/1 は LED がオフになります。
142 // この挙動は、LED がピンと VCC の間にあるか、ピンと GND の間にあるかどうかに依存します。
143 writePin(B0, !led_state.num_lock);
144 writePin(B1, !led_state.caps_lock);
145 writePin(B2, !led_state.scroll_lock);
146 writePin(B3, !led_state.compose);
147 writePin(B4, !led_state.kana);
148 }
149 return res;
150}
151```
152
153### `led_update_user()` の実装例
154
155この不完全な例は Caps Lock がオンまたはオフになった場合に音を再生します。また LED の状態を保持する必要があるため、`true` を返します。
156
157```c
158#ifdef AUDIO_ENABLE
159 float caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
160 float caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
161#endif
162
163bool led_update_user(led_t led_state) {
164 #ifdef AUDIO_ENABLE
165 static uint8_t caps_state = 0;
166 if (caps_state != led_state.caps_lock) {
167 led_state.caps_lock ? PLAY_SONG(caps_on) : PLAY_SONG(caps_off);
168 caps_state = led_state.caps_lock;
169 }
170 #endif
171 return true;
172}
173```
174
175### `led_update_*` 関数のドキュメント
176
177* キーボード/リビジョン: `bool led_update_kb(led_t led_state)`
178* キーマップ: `bool led_update_user(led_t led_state)`
179
180## `host_keyboard_led_state()`
181
182最後に受信した LED の状態を `led_t` として取得するためにこの関数を呼びます。これは、`led_update_*` の外部から、例えば [`matrix_scan_user()`](#matrix-scanning-code) の中で LED の状態を読み取るのに便利です。
183
184## 物理的な LED の状態の設定
185
186一部のキーボードの実装は、物理的な LED の状態を設定するための便利なメソッドを提供しています。
187
188### Ergodox キーボード
189
190Ergodox の実装は、個々の LED をオンあるいはオフにするために `ergodox_right_led_1`/`2`/`3_on`/`off()` と、インデックスによってそれらをオンあるいはオフにするために `ergodox_right_led_on`/`off(uint8_t led)` を提供します。
191
192さらに、LED の明度を指定することができます。全ての LED に同じ明度を指定するなら `ergodox_led_all_set(uint8_t n)` を使い、個別の LED の明度を指定するなら `ergodox_right_led_1`/`2`/`3_set(uint8_t n)` を使い、LED のインデックスを指定して明度を指定するには `ergodox_right_led_set(uint8_t led, uint8_t n)` を使います。
193
194Ergodox キーボードは、最低の明度として `LED_BRIGHTNESS_LO` を、最高の輝度(これはデフォルトです)として `LED_BRIGHTNESS_HI` も定義しています。
195
196# キーボードの初期化コード
197
198キーボードの初期化プロセスには幾つかのステップがあります。何をしたいかによって、どの関数を使うべきかに影響します。
199
2003つの主な初期化関数があり、呼び出される順番にリストされています。
201
202* `keyboard_pre_init_*` - ほとんどのものが開始される前に起こります。非常に早くに実行したいハードウェアのセットアップに適しています。
203* `matrix_init_*` - ファームウェアのスタートアッププロセスの途中で起こります。ハードウェアは初期化されますが、機能はまだ初期化されていない場合があります。
204* `keyboard_post_init_*` - ファームウェアのスタートアッププロセスの最後に起こります。これはほとんどの場合、 "カスタマイズ"コードを配置する場所です。
205
206!> ほとんどの人にとって、`keyboard_post_init_user` が呼び出したいものです。例えば、ここで RGB アンダーグローのセットアップを行います。
207
208## キーボードの事前初期化コード
209
210これは USB さえ起動する前の、起動中の非常に早い段階で実行されます。
211
212この直後にマトリックスが初期化されます。
213
214これは主にハードウェア向きの初期化のためであるため、ほとんどのユーザは使うべきではありません。
215
216ただし、初期化が必要なハードウェアがある場合には、これが最適な場所です (LED ピンの初期化など)。
217
218### `keyboard_pre_init_user()` の実装例
219
220この例は、キーボードレベルで、LED ピンとして B0、B1、B2、B3 および B4 をセットアップします。
221
222```c
223void keyboard_pre_init_user(void) {
224 // キーボードの事前初期コードを呼び出します。
225
226 // LED ピンを出力として設定します
227 setPinOutput(B0);
228 setPinOutput(B1);
229 setPinOutput(B2);
230 setPinOutput(B3);
231 setPinOutput(B4);
232}
233```
234
235### `keyboard_pre_init_*` 関数のドキュメント
236
237* キーボード/リビジョン: `void keyboard_pre_init_kb(void)`
238* キーマップ: `void keyboard_pre_init_user(void)`
239
240## マトリックスの初期化コード
241
242これは、マトリックスが初期化され、ハードウェアの一部がセットアップされた後で、ただし機能の多くが初期化される前に、呼び出されます。
243
244他の場所で必要になるかもしれないものをセットアップするのに役立ちますが、ハードウェアに関連するものではなく、開始場所に依存するものでもありません。
245
246
247### `matrix_init_*` 関数のドキュメント
248
249* キーボード/リビジョン: `void matrix_init_kb(void)`
250* キーマップ: `void matrix_init_user(void)`
251
252
253## キーボードの事後初期化コード
254
255キーボードの初期化プロセスの極めて最後のタスクとして実行されます。この時点で初期化される必要があるような、特定の機能を変更したい場合に便利です。
256
257
258### `keyboard_post_init_user()` の実装例
259
260この例は、他の全てのものが初期化された後で実行され、rgb アンダーグローの設定をセットアップします。
261
262```c
263void keyboard_post_init_user(void) {
264 // post init コードを呼びます
265 rgblight_enable_noeeprom(); // 設定を保存せずに Rgb を有効にします
266 rgblight_sethsv_noeeprom(180, 255, 255); // 保存せずに色を青緑/シアンに設定します
267 rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 保存せずにモードを高速なブリージングに設定します
268}
269```
270
271### `keyboard_post_init_*` 関数のドキュメント
272
273* キーボード/リビジョン: `void keyboard_post_init_kb(void)`
274* キーマップ: `void keyboard_post_init_user(void)`
275
276# マトリックススキャンコード :id=matrix-scanning-code
277
278可能であれば常に `process_record_*()` を使ってキーボードをカスタマイズし、その方法でイベントをフックし、コードがキーボードのパフォーマンスに悪影響を与えないようにします。ただし、まれにマトリックススキャンにフックする必要があります。これらの関数は1秒あたり少なくとも10回は呼び出されるため、これらの関数のコードのパフォーマンスに非常に注意してください。
279
280### `matrix_scan_*` の実装例
281
282この例は意図的に省略されています。このようなパフォーマンスに敏感な領域にフックする前に、例を使わずにこれを書くために、QMK 内部について十分理解する必要があります。助けが必要であれば、[issue を開く](https://github.com/qmk/qmk_firmware/issues/new) か [Discord で会話](https://discord.gg/Uq7gcHh)してください。
283
284### `matrix_scan_*` 関数のドキュメント
285
286* キーボード/リビジョン: `void matrix_scan_kb(void)`
287* キーマップ: `void matrix_scan_user(void)`
288
289この関数はマトリックススキャンのたびに呼び出されます。これは基本的に MCU が処理できる頻度です。大量に実行されるため、ここに何を置くかについては注意してください。
290
291カスタムマトリックススキャンコードが必要な場合は、この関数を使う必要があります。また、カスタムステータス出力 (LED あるいはディスプレイなど)や、ユーザが入力していない場合でも定期的にトリガーするその他の機能のために使うことができます。
292
293
294# キーボードアイドリング/ウェイクコード
295
296キーボードがサポートしている場合、多くの機能を停止することで"アイドル"にすることができます。これの良い例は、RGB ライトあるいはバックライトです。これにより、電力消費を節約できるか、キーボードの動作が改善されるかもしれません。
297
298これは2つの関数によって制御されます: `suspend_power_down_*` および `suspend_wakeup_init_*`。これらはシステムキーボードがアイドルになった時と、起動した時のそれぞれで呼ばれます。
299
300
301### suspend_power_down_user() と suspend_wakeup_init_user() の実装例
302
303
304```c
305void suspend_power_down_user(void) {
306 rgb_matrix_set_suspend_state(true);
307}
308
309void suspend_wakeup_init_user(void) {
310 rgb_matrix_set_suspend_state(false);
311}
312```
313
314### キーボードサスペンド/ウェイク関数のドキュメント
315
316* キーボード/リビジョン : `void suspend_power_down_kb(void)` および `void suspend_wakeup_init_user(void)`
317* キーマップ: `void suspend_power_down_kb(void)` および `void suspend_wakeup_init_user(void)`
318
319# レイヤー切り替えコード
320
321これはレイヤーが切り替えられるたびにコードを実行します。レイヤー表示あるいはカスタムレイヤー処理に役立ちます。
322
323### `layer_state_set_*` の実装例
324
325この例は、レイヤーに基づいて [RGB アンダーグロー](ja/feature_rgblight.md)を設定する方法を示していて、Planck を例として使っています。
326
327```c
328layer_state_t layer_state_set_user(layer_state_t state) {
329 switch (get_highest_layer(state)) {
330 case _RAISE:
331 rgblight_setrgb (0x00, 0x00, 0xFF);
332 break;
333 case _LOWER:
334 rgblight_setrgb (0xFF, 0x00, 0x00);
335 break;
336 case _PLOVER:
337 rgblight_setrgb (0x00, 0xFF, 0x00);
338 break;
339 case _ADJUST:
340 rgblight_setrgb (0x7A, 0x00, 0xFF);
341 break;
342 default: // 他の全てのレイヤーあるいはデフォルトのレイヤー
343 rgblight_setrgb (0x00, 0xFF, 0xFF);
344 break;
345 }
346 return state;
347}
348```
349### `layer_state_set_*` 関数のドキュメント
350
351* キーボード/リビジョン: `layer_state_t layer_state_set_kb(layer_state_t state)`
352* キーマップ: `layer_state_t layer_state_set_user(layer_state_t state)`
353
354
355[キーマップの概要](ja/keymap.md#keymap-layer-status)で説明されるように、`state` はアクティブなレイヤーのビットマスクです。
356
357
358# 永続的な設定 (EEPROM)
359
360これによりキーボードのための永続的な設定を設定することができます。これらの設定はコントローラの EEPROM に保存され、電源が落ちた後であっても保持されます。設定は `eeconfig_read_kb` および `eeconfig_read_user` を使って読み取ることができ、`eeconfig_update_kb` および `eeconfig_update_user` を使って書きこむことができます。これは切り替え可能な機能 (rgb レイヤーの表示の切り替えなど)に役立ちます。さらに、`eeconfig_init_kb` および `eeconfig_init_user` を使って EEPROM のデフォルト値を設定できます。
361
362ここでの複雑な部分は、EEPROM を介してデータを保存およびアクセスできる方法がたくさんあり、これを行うための"正しい"方法が無いということです。ただし、各関数には DWORD (4 バイト)しかありません。
363
364EEPROM の書き込み回数には制限があることに注意してください。これは非常に高い値ですが、EEPROM に書き込むのはこれだけではなく、もし頻繁に書き込むと、MCU の寿命を大幅に短くする可能性があります。
365
366* この例を理解していない場合は、この機能はかなり複雑なため、この機能を使うことを避けても構いません。
367
368### 実装例
369
370これは、設定を追加し、読み書きする例です。この例では、ユーザキーマップを使っています。これは複雑な機能で、多くのことが行われています。実際、動作のために上記の多くの関数を使います!
371
372
373keymap.c ファイルの中で、先頭にこれを追加します:
374```c
375typedef union {
376 uint32_t raw;
377 struct {
378 bool rgb_layer_change :1;
379 };
380} user_config_t;
381
382user_config_t user_config;
383```
384
385これは、設定をメモリ内に保存し、EEPROM に書き込むことができる32ビット構造体をセットアップします。これを使うと、この構造体に変数が定義されるため、変数を定義する必要が無くなります。`bool` (boolean) の値は1ビットを使い、`uint8_t` は8ビットを使い、`uint16_t` は16ビットを使うことに注意してください。組み合わせて使うことができますが、順番の変更は読み書きされる値が変更されるため、問題が発生するかもしれません。
386
387`layer_state_set_*` 関数のために `rgb_layer_change` を使い、全てを設定するために `keyboard_post_init_user` および `process_record_user` を使います。
388
389ここで、上の `keyboard_post_init_user` コードを使って、作成したばかりの構造体を設定するために `eeconfig_read_user()` を追加します。そして、この構造体をすぐに使ってキーマップの機能を制御することができます。それは以下のようになります:
390```c
391void keyboard_post_init_user(void) {
392 // キーマップレベルのマトリックスの初期化処理を呼びます
393
394 // EEPROM からユーザ設定を読み込みます
395 user_config.raw = eeconfig_read_user();
396
397 // 有効な場合はデフォルトレイヤーを設定します
398 if (user_config.rgb_layer_change) {
399 rgblight_enable_noeeprom();
400 rgblight_sethsv_noeeprom_cyan();
401 rgblight_mode_noeeprom(1);
402 }
403}
404```
405上記の関数は読み取ったばかりの EEPROM 設定を使い、デフォルトのレイヤーの RGB 色を設定します。その「生の」値は、上で作成した「共用体」に基づいて使用可能な構造に変換されます。
406
407```c
408layer_state_t layer_state_set_user(layer_state_t state) {
409 switch (get_highest_layer(state)) {
410 case _RAISE:
411 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
412 break;
413 case _LOWER:
414 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); }
415 break;
416 case _PLOVER:
417 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); }
418 break;
419 case _ADJUST:
420 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
421 break;
422 default: // 他の全てのレイヤーあるいはデフォルトのレイヤー
423 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
424 break;
425 }
426 return state;
427}
428```
429これにより、値が有効になっていた場合のみ、RGB アンダーグローが変更されます。この値を設定するために、`RGB_LYR` と呼ばれる `process_record_user` 用の新しいキーコードを作成します。さらに、通常の RGB コードを使う場合、上記の例を使ってオフになることを確認します。以下のようになります:
430```c
431bool process_record_user(uint16_t keycode, keyrecord_t *record) {
432 switch (keycode) {
433 case FOO:
434 if (record->event.pressed) {
435 // 押された時に何かをします
436 } else {
437 // 放された時に何かをします
438 }
439 return false; // このキーの以降の処理をスキップします
440 case KC_ENTER:
441 // enter が押された時に音を再生します
442 if (record->event.pressed) {
443 PLAY_NOTE_ARRAY(tone_qwerty);
444 }
445 return true; // QMK に enter のプレスまたはリリースイベントを送信させます
446 case RGB_LYR: // これにより、アンダーグローをレイヤー表示として、あるいは通常通りに使うことができます。
447 if (record->event.pressed) {
448 user_config.rgb_layer_change ^= 1; // 状態を切り替えます
449 eeconfig_update_user(user_config.raw); // 新しい状態を EEPROM に書き込みます
450 if (user_config.rgb_layer_change) { // レイヤーの状態表示が有効な場合
451 layer_state_set(layer_state); // すぐにレイヤーの色を更新します
452 }
453 }
454 return false; break;
455 case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 任意の RGB コード に対して(quantum_keycodes.h を見てください。400行目参照)
456 if (record->event.pressed) { // これはレイヤー表示を無効にします。これを変更する場合は、無効にしたいだろうため。
457 if (user_config.rgb_layer_change) { // 有効な場合のみ
458 user_config.rgb_layer_change = false; // 無効にします
459 eeconfig_update_user(user_config.raw); // 設定を EEPROM に書き込みます
460 }
461 }
462 return true; break;
463 default:
464 return true; // 他の全てのキーコードを通常通りに処理します
465 }
466}
467```
468最後に、`eeconfig_init_user` 関数を追加して、EEPROM がリセットされた時にデフォルト値、さらにはカスタムアクションを指定できるようにします。EEPROM を強制的にリセットするには、`EEP_RST` キーコードあるいは[ブートマジック](ja/feature_bootmagic.md)機能を使います。例えば、デフォルトで rgb レイヤー表示を設定し、デフォルト値を保存したい場合。
469
470```c
471void eeconfig_init_user(void) { // EEPROM がリセットされます!
472 user_config.raw = 0;
473 user_config.rgb_layer_change = true; // デフォルトでこれを有効にします
474 eeconfig_update_user(user_config.raw); // デフォルト値を EEPROM に書き込みます
475
476 // これらの値も EEPROM に書き込むためには、noeeprom 以外のバージョンを使います
477 rgblight_enable(); // デフォルトで RGB を有効にします
478 rgblight_sethsv_cyan(); // デフォルトでシアンに設定します
479 rgblight_mode(1); // デフォルトでソリッドに設定します
480}
481```
482
483これで完了です。RGB レイヤー表示は必要な場合にのみ機能します。キーボードを取り外した後でも保存されます。RGB コードのいずれかを使うと、レイヤー表示が無効になり、設定したモードと色がそのままになります。
484
485### 'EECONFIG' 関数のドキュメント
486
487* キーボード/リビジョン: `void eeconfig_init_kb(void)`、`uint32_t eeconfig_read_kb(void)` および `void eeconfig_update_kb(uint32_t val)`
488* キーマップ: `void eeconfig_init_user(void)`、`uint32_t eeconfig_read_user(void)` および `void eeconfig_update_user(uint32_t val)`
489
490`val` は EEPROM に書き込みたいデータの値です。`eeconfig_read_*` 関数は EEPROM から32ビット(DWORD) 値を返します。
491
492# カスタムタッピング期間
493
494デフォルトでは、タッピング期間はグローバルに設定されていて、キーでは設定することができません。ほとんどのユーザにとって、これは全然問題ありません。しかし、場合によっては、`LT` キーとは異なるタイムアウトによって、デュアルファンクションキーが大幅に改善されます。なぜなら、一部のキーは他のキーよりも押し続けやすいためです。それぞれにカスタムキーコードを使う代わりに、キーごとに設定可能な `TAPPING_TERM` を使用できます。
495
496この機能を有効にするには、最初に `config.h` に `#define TAPPING_TERM_PER_KEY` を追加する必要があります。
497
498
499## `get_tapping_term` の実装例
500
501キーコードに基づいて `TAPPING TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
502
503```c
504uint16_t get_tapping_term(uint16_t keycode) {
505 switch (keycode) {
506 case SFT_T(KC_SPC):
507 return TAPPING_TERM + 1250;
508 case LT(1, KC_GRV):
509 return 130;
510 default:
511 return TAPPING_TERM;
512 }
513}
514```
515
516### `get_tapping_term` 関数のドキュメント
517
518ここにある他の多くの関数とは異なり、quantum あるいはキーボードレベルの関数を持つ必要はありません (または理由さえありません)。ここではユーザレベルの関数だけが有用なため、そのようにマークする必要はありません。