Skip to main content

verso/ui/keymap/
defaults.rs

1use std::collections::BTreeMap;
2
3/// Default key bindings for the reader, as (action, sequences) pairs.
4pub fn default_entries() -> Vec<(String, Vec<String>)> {
5    vec![
6        ("move_down".into(), vec!["j".into(), "<Down>".into()]),
7        ("move_up".into(), vec!["k".into(), "<Up>".into()]),
8        (
9            "page_down".into(),
10            vec!["<Space>".into(), "f".into(), "<C-f>".into()],
11        ),
12        ("page_up".into(), vec!["b".into(), "<C-b>".into()]),
13        ("half_page_down".into(), vec!["d".into(), "<C-d>".into()]),
14        ("half_page_up".into(), vec!["u".into(), "<C-u>".into()]),
15        ("goto_top".into(), vec!["gg".into()]),
16        ("goto_bottom".into(), vec!["G".into()]),
17        ("next_chapter".into(), vec!["]]".into()]),
18        ("prev_chapter".into(), vec!["[[".into()]),
19        ("mark_set".into(), vec!["m".into()]),
20        ("mark_jump".into(), vec!["'".into()]),
21        ("search_forward".into(), vec!["/".into()]),
22        ("search_backward".into(), vec!["?".into()]),
23        ("search_next".into(), vec!["n".into()]),
24        ("search_prev".into(), vec!["N".into()]),
25        ("visual_select".into(), vec!["v".into()]),
26        ("yank_highlight".into(), vec!["y".into()]),
27        ("list_highlights".into(), vec!["H".into()]),
28        ("cmd".into(), vec![":".into()]),
29        ("quit_to_library".into(), vec!["q".into()]),
30        ("toggle_theme".into(), vec!["gt".into()]),
31        ("cycle_width".into(), vec!["z=".into()]),
32        ("help".into(), vec!["<F1>".into()]),
33    ]
34}
35
36/// Merge user keymap overrides on top of defaults.
37/// If `user` contains an action, it REPLACES the default bindings for that action.
38/// Unknown actions are still passed through so `Keymap::from_config` can surface
39/// a clear error rather than silently ignoring user input.
40pub fn merge_with_user(user: &BTreeMap<String, Vec<String>>) -> Vec<(String, Vec<String>)> {
41    let mut out: Vec<(String, Vec<String>)> = default_entries();
42    for (action, seqs) in user {
43        if let Some(entry) = out.iter_mut().find(|(a, _)| a == action) {
44            entry.1 = seqs.clone();
45        } else {
46            out.push((action.clone(), seqs.clone()));
47        }
48    }
49    out
50}