docs: add book
This commit is contained in:
parent
c9d6fb9e40
commit
d14105eb1a
43 changed files with 7254 additions and 1204 deletions
177
book/src/input-modes.md
Normal file
177
book/src/input-modes.md
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
# Input Modes
|
||||
|
||||
Jay supports an **input mode stack** that enables vim-style modal keybindings.
|
||||
When a mode is active, its shortcuts take effect instead of (or in addition to)
|
||||
the top-level shortcuts. Multiple modes can be stacked, and the topmost mode
|
||||
always wins.
|
||||
|
||||
## Defining Modes
|
||||
|
||||
Modes are defined in the `[modes]` table. Each mode is a named sub-table that
|
||||
can contain its own `shortcuts` and `complex-shortcuts`:
|
||||
|
||||
```toml
|
||||
[modes."move".shortcuts]
|
||||
h = "move-left"
|
||||
j = "move-down"
|
||||
k = "move-up"
|
||||
l = "move-right"
|
||||
Escape = "pop-mode"
|
||||
```
|
||||
|
||||
## Inheritance
|
||||
|
||||
By default, a mode inherits all shortcuts from the top-level `[shortcuts]`
|
||||
table. Any key not explicitly defined in the mode falls through to the
|
||||
inherited shortcuts.
|
||||
|
||||
To inherit from a different mode instead, set the `parent` field:
|
||||
|
||||
```toml
|
||||
[modes."navigation"]
|
||||
parent = "base"
|
||||
|
||||
[modes."navigation".shortcuts]
|
||||
w = "focus-up"
|
||||
a = "focus-left"
|
||||
s = "focus-down"
|
||||
d = "focus-right"
|
||||
```
|
||||
|
||||
Here, `navigation` inherits from the mode called `base` rather than from the
|
||||
top-level shortcuts.
|
||||
|
||||
### Unbinding Inherited Shortcuts
|
||||
|
||||
Use `"none"` as the action value to unbind a shortcut that would otherwise be
|
||||
inherited:
|
||||
|
||||
```toml
|
||||
[modes."locked".shortcuts]
|
||||
# Disable alt-q (quit) while in this mode
|
||||
alt-q = "none"
|
||||
```
|
||||
|
||||
## Activating and Deactivating Modes
|
||||
|
||||
Jay provides four actions for managing the mode stack:
|
||||
|
||||
`push-mode`
|
||||
: Push a named mode onto the stack. It stays active until explicitly removed.
|
||||
|
||||
`latch-mode`
|
||||
: Temporarily push a mode. It auto-pops after the next shortcut fires.
|
||||
|
||||
`pop-mode`
|
||||
: Remove the topmost mode from the stack.
|
||||
|
||||
`clear-modes`
|
||||
: Clear the entire mode stack, returning to top-level shortcuts.
|
||||
|
||||
### push-mode
|
||||
|
||||
```toml
|
||||
[shortcuts]
|
||||
alt-r = { type = "push-mode", name = "resize" }
|
||||
```
|
||||
|
||||
After pressing `alt-r`, the `resize` mode's shortcuts take effect. It remains
|
||||
active until something pops it.
|
||||
|
||||
### latch-mode
|
||||
|
||||
```toml
|
||||
[shortcuts]
|
||||
alt-x = { type = "latch-mode", name = "navigation" }
|
||||
```
|
||||
|
||||
After pressing `alt-x`, the `navigation` mode is pushed. The very next shortcut
|
||||
that fires will use the mode's bindings, and then the mode is automatically
|
||||
popped. This is ideal for **leader key** patterns.
|
||||
|
||||
### pop-mode
|
||||
|
||||
```toml
|
||||
[modes."resize".shortcuts]
|
||||
Escape = "pop-mode"
|
||||
```
|
||||
|
||||
Pressing `Escape` while in `resize` mode removes it from the stack.
|
||||
|
||||
### clear-modes
|
||||
|
||||
```toml
|
||||
[modes."resize".shortcuts]
|
||||
ctrl-c = "clear-modes"
|
||||
```
|
||||
|
||||
This removes all modes from the stack at once, returning to the top-level
|
||||
shortcuts regardless of how many modes have been stacked.
|
||||
|
||||
## Practical Examples
|
||||
|
||||
### Move Mode
|
||||
|
||||
A dedicated mode for moving windows with `h`/`j`/`k`/`l`, activated by
|
||||
`alt-r` and exited with `Escape`:
|
||||
|
||||
```toml
|
||||
[shortcuts]
|
||||
alt-r = { type = "push-mode", name = "move" }
|
||||
|
||||
[modes."move".shortcuts]
|
||||
h = "move-left"
|
||||
j = "move-down"
|
||||
k = "move-up"
|
||||
l = "move-right"
|
||||
Escape = "pop-mode"
|
||||
```
|
||||
|
||||
While in move mode, pressing `h` moves the focused window left, `l` moves it
|
||||
right, and so on -- without needing a modifier key. All other inherited
|
||||
shortcuts (like `alt-q` to quit) remain available. Press `Escape` to return
|
||||
to normal.
|
||||
|
||||
### Leader Key
|
||||
|
||||
A leader key pattern where pressing `alt-x` followed by one key triggers a
|
||||
mode shortcut, then immediately returns to normal:
|
||||
|
||||
```toml
|
||||
[shortcuts]
|
||||
alt-x = { type = "latch-mode", name = "leader" }
|
||||
|
||||
[modes."leader".shortcuts]
|
||||
t = { type = "exec", exec = "alacritty" }
|
||||
b = { type = "exec", exec = "firefox" }
|
||||
f = { type = "exec", exec = "thunar" }
|
||||
q = "quit"
|
||||
```
|
||||
|
||||
Press `alt-x` then `t` to launch a terminal. Because `latch-mode` auto-pops
|
||||
after one shortcut, you are immediately back to normal shortcuts.
|
||||
|
||||
### Nested Modes
|
||||
|
||||
Modes can push other modes, creating layers of context:
|
||||
|
||||
```toml
|
||||
[shortcuts]
|
||||
alt-n = { type = "push-mode", name = "navigate" }
|
||||
|
||||
[modes."navigate".shortcuts]
|
||||
m = { type = "push-mode", name = "move" }
|
||||
Escape = "pop-mode"
|
||||
|
||||
[modes."move".shortcuts]
|
||||
h = "move-left"
|
||||
l = "move-right"
|
||||
Escape = "pop-mode"
|
||||
```
|
||||
|
||||
`alt-n` enters navigation mode. From there, pressing `m` enters move mode
|
||||
on top of it. `Escape` pops the current mode one level at a time. Use
|
||||
`clear-modes` if you want a shortcut that returns directly to the top level.
|
||||
|
||||
See [spec.generated.md](https://github.com/mahkoh/jay/blob/master/toml-spec/spec/spec.generated.md) for the full
|
||||
specification of `InputMode`, `push-mode`, `latch-mode`, and related actions.
|
||||
Loading…
Add table
Add a link
Reference in a new issue