use super::Editor;
pub struct Leaf {
pub key: char,
pub run: fn(&mut Editor),
}
macro_rules! motion {
($key:literal) => {
Leaf {
key: $key,
run: |e: &mut Editor| e.run_motion($key.encode_utf8(&mut [0; 4])),
}
};
}
pub static LEAVES: &[Leaf] = &[
motion!('h'),
motion!('j'),
motion!('k'),
motion!('l'),
motion!('w'),
motion!('b'),
motion!('e'),
motion!('W'),
motion!('B'),
motion!('E'),
motion!('0'),
motion!('^'),
motion!('$'),
motion!('|'),
motion!('%'),
motion!('G'),
Leaf {
key: 'n',
run: |e| e.repeat_search(false),
},
Leaf {
key: 'N',
run: |e| e.repeat_search(true),
},
Leaf {
key: '*',
run: |e| e.search_word_under_cursor(false),
},
Leaf {
key: '#',
run: |e| e.search_word_under_cursor(true),
},
Leaf {
key: ';',
run: |e| e.repeat_find(false),
},
Leaf {
key: ',',
run: |e| e.repeat_find(true),
},
Leaf {
key: 'x',
run: Editor::delete_char,
},
Leaf {
key: 'p',
run: |e| e.paste_named(None, false),
},
Leaf {
key: 'P',
run: |e| e.paste_named(None, true),
},
Leaf {
key: 'u',
run: Editor::undo,
},
Leaf {
key: '.',
run: |e| e.dot_repeat_pub(),
},
Leaf {
key: '~',
run: |e| e.toggle_case_pub(),
},
Leaf {
key: 'J',
run: |e| e.join_lines_pub(),
},
Leaf {
key: 'Q',
run: |e| e.toggle_cursor(),
},
Leaf {
key: 'i',
run: |e| e.enter_insert_from("i"),
},
Leaf {
key: 'a',
run: Editor::append,
},
Leaf {
key: 'A',
run: Editor::append_eol,
},
Leaf {
key: 'o',
run: Editor::open_below,
},
Leaf {
key: 'O',
run: Editor::open_above,
},
Leaf {
key: 'v',
run: |e| e.enter_visual(false),
},
Leaf {
key: 'V',
run: |e| e.enter_visual(true),
},
Leaf {
key: 'D',
run: |e| e.alias("D", "d$"),
},
Leaf {
key: 'C',
run: |e| e.alias("C", "c$"),
},
Leaf {
key: 'Y',
run: |e| e.alias("Y", "yy"),
},
Leaf {
key: 's',
run: |e| e.alias("s", "cl"),
},
Leaf {
key: 'X',
run: |e| e.alias("X", "dh"),
},
Leaf {
key: 'S',
run: |e| e.alias("S", "cc"),
},
Leaf {
key: 'I',
run: |e| e.alias("I", "^i"),
},
];
pub fn leaf_for(key: char) -> Option<&'static Leaf> {
LEAVES.iter().find(|l| l.key == key)
}