Move the documentation to `doc/plugin/Leader.md`, sources under `src/kaleidoscope/plugin/` (appropriately namespaced). This is in preparation of merging plugins into a single monorepo. Signed-off-by: Gergely Nagy <algernon@keyboard.io>pull/389/head
parent
13f92255cb
commit
e37669a623
@ -0,0 +1,107 @@
|
||||
# Kaleidoscope-Leader
|
||||
|
||||
Leader keys are a kind of key where when they are tapped, all following keys are
|
||||
swallowed, until the plugin finds a matching sequence in the dictionary, it
|
||||
times out, or fails to find any possibilities. When a sequence is found, the
|
||||
corresponding action is executed, but the processing still continues. If any key
|
||||
is pressed that is not the continuation of the existing sequence, processing
|
||||
aborts, and the key is handled normally.
|
||||
|
||||
This behaviour is best described with an example. Suppose we want a behaviour
|
||||
where `LEAD u` starts unicode input mode, and `LEAD u h e a r t` should result
|
||||
in a heart symbol being input, and we want `LEAD u 0 0 e 9 SPC` to input `é`,
|
||||
and any other hex code that follows `LEAD u`, should be handled as-is, and
|
||||
passed to the host. Obviously, we can't have all of this in a dictionary.
|
||||
|
||||
So we put `LEAD u` and `LEAD u h e a r t` in the dictionary only. The first will
|
||||
start unicode input mode, the second will type in the magic sequence that
|
||||
results in the symbol, and then aborts the leader sequence processing. With this
|
||||
setup, if we type `LEAD u 0`, then `LEAD u` will be handled first, and start
|
||||
unicode input mode. Then, at the `0`, the plugin notices it is not part of any
|
||||
sequence, so aborts leader processing, and passes the key on as-is, and it ends
|
||||
up being sent to the host. Thus, we covered all the cases of our scenario!
|
||||
|
||||
## Using the plugin
|
||||
|
||||
To use the plugin, one needs to include the header, implement some actions,
|
||||
create a dictionary, and configure the provided `Leader` object to use the
|
||||
dictionary:
|
||||
|
||||
```c++
|
||||
#include <Kaleidoscope.h>
|
||||
#include <Kaleidoscope-Leader.h>
|
||||
|
||||
static void leaderA(uint8_t seq_index) {
|
||||
Serial.println("leaderA");
|
||||
}
|
||||
|
||||
static void leaderTX(uint8_t seq_index) {
|
||||
Serial.println("leaderTX");
|
||||
}
|
||||
|
||||
static const kaleidoscope::Leader::dictionary_t leader_dictionary[] PROGMEM =
|
||||
LEADER_DICT({LEADER_SEQ(LEAD(0), Key_A), leaderA},
|
||||
{LEADER_SEQ(LEAD(0), Key_T, Key_X), leaderTX});
|
||||
|
||||
KALEIDOSCOPE_INIT_PLUGINS(Leader);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
Kaleidoscope.setup();
|
||||
|
||||
Leader.dictionary = leader_dictionary;
|
||||
}
|
||||
```
|
||||
|
||||
The dictionary is made up of a list of keys, and an action callback. Using the
|
||||
`LEADER_DICT` and `LEADER_SEQ` helpers is recommended. The dictionary *must* be
|
||||
marked `PROGMEM`!
|
||||
|
||||
**Note** that we need to use the `Leader` object before any other that adds or
|
||||
changes key behaviour! Failing to do so may result in unpredictable behaviour.
|
||||
|
||||
## Plugin methods
|
||||
|
||||
The plugin provides the `Leader` object, with the following methods and properties:
|
||||
|
||||
### `.dictionary`
|
||||
|
||||
> Set this property to the dictionary `Leader` should use. The dictionary is an
|
||||
> array of `kaleidoscope::Leader::dictionary_t` elements. Each element is made
|
||||
> up of two elements, the first being a list of keys, the second an action to
|
||||
> perform when the sequence is found.i
|
||||
>
|
||||
> The dictionary *MUST* reside in `PROGMEM`.
|
||||
|
||||
### `.reset()`
|
||||
|
||||
> Finishes the leader sequence processing. This is best called from actions that
|
||||
> are final actions, where one does not wish to continue the leader sequence
|
||||
> further in the hopes of finding a longer match.
|
||||
|
||||
### `.time_out`
|
||||
|
||||
> The number of milliseconds to wait before a sequence times out. Once the
|
||||
> sequence timed out, if there is a partial match with an action, that will be
|
||||
> performed, otherwise the Leader sequence will simply reset.
|
||||
>
|
||||
> Defaults to 1000.
|
||||
|
||||
## Dependencies
|
||||
|
||||
* [Kaleidoscope-Ranges](https://github.com/keyboardio/Kaleidoscope-Ranges)
|
||||
|
||||
## Further reading
|
||||
|
||||
Starting from the [example][plugin:example] is the recommended way of getting
|
||||
started with the plugin.
|
||||
|
||||
[plugin:example]: https://github.com/keyboardio/Kaleidoscope-Leader/blob/master/examples/Leader/Leader.ino
|
||||
|
||||
## Upgrading
|
||||
|
||||
Previous versions of `Leader` used `kaleidoscope::Leader::dictionary_t` as a
|
||||
type for defining the dictionary. In newer versions, this is
|
||||
`kaleidoscope::plugin::Leader::dictionary_t`. The old name still works, but will
|
||||
be removed by 2019-01-14.
|
Loading…
Reference in new issue