on master help sign in
Simplify keymap.rs with macros
commitd9d59cd209c9cbd1397ed4d05b1d14a6aad514bf authorBlaž Hrastnik <blaz@mxxn.io> dateThu 1 Oct 2020, 16:06 (6 years ago) parent4c49197
1 file changed+44−88
helix-view/src/keymap.rs+44−88
helix-view/src/keymap.rs+44−88
@@ -90,98 +90,54 @@ pub use crossterm::event::{KeyCode, KeyEvent as Key, KeyModifiers as Modifiers};
9090type Keymap = HashMap<Vec<Key>, Command>;
9191type Keymaps = HashMap<state::Mode, Keymap>;
9292
93+macro_rules! key {
94+ ($ch:expr) => {
95+ Key {
96+ code: KeyCode::Char($ch),
97+ modifiers: Modifiers::NONE,
98+ }
99+ };
100+}
101+
102+macro_rules! shift {
103+ ($ch:expr) => {
104+ Key {
105+ code: KeyCode::Char($ch),
106+ modifiers: Modifiers::SHIFT,
107+ }
108+ };
109+}
110+
93111pub fn default() -> Keymaps {
94112 hashmap!(
95113 state::Mode::Normal =>
114+ // as long as you cast the first item, rust is able to infer the other cases
96115 hashmap!(
97− vec![Key {
98− code: KeyCode::Char('h'),
99− modifiers: Modifiers::NONE
100− }] => commands::move_char_left as Command,
101− vec![Key {
102− code: KeyCode::Char('j'),
103− modifiers: Modifiers::NONE
104− }] => commands::move_line_down as Command,
105− vec![Key {
106− code: KeyCode::Char('k'),
107− modifiers: Modifiers::NONE
108− }] => commands::move_line_up as Command,
109− vec![Key {
110− code: KeyCode::Char('0'),
111− modifiers: Modifiers::NONE
112− }] => commands::move_line_start as Command,
113− vec![Key {
114− code: KeyCode::Char('$'),
115− modifiers: Modifiers::NONE
116− }] => commands::move_line_end as Command,
117− vec![Key {
118− code: KeyCode::Char('l'),
119− modifiers: Modifiers::NONE
120− }] => commands::move_char_right as Command,
121− vec![Key {
122− code: KeyCode::Char('H'),
123− modifiers: Modifiers::SHIFT
124− }] => commands::extend_char_left as Command,
125− vec![Key {
126− code: KeyCode::Char('J'),
127− modifiers: Modifiers::SHIFT
128− }] => commands::extend_line_down as Command,
129− vec![Key {
130− code: KeyCode::Char('K'),
131− modifiers: Modifiers::SHIFT
132− }] => commands::extend_line_up as Command,
133− vec![Key {
134− code: KeyCode::Char('L'),
135− modifiers: Modifiers::SHIFT
136− }] => commands::extend_char_right as Command,
137− vec![Key {
138− code: KeyCode::Char('w'),
139− modifiers: Modifiers::NONE
140− }] => commands::move_next_word_start as Command,
141− vec![Key {
142− code: KeyCode::Char('b'),
143− modifiers: Modifiers::NONE
144− }] => commands::move_prev_word_start as Command,
145− vec![Key {
146− code: KeyCode::Char('e'),
147− modifiers: Modifiers::NONE
148− }] => commands::move_next_word_end as Command,
149− vec![Key {
150− code: KeyCode::Char('i'),
151− modifiers: Modifiers::NONE
152− }] => commands::insert_mode as Command,
153− vec![Key {
154− code: KeyCode::Char('I'),
155− modifiers: Modifiers::SHIFT,
156− }] => commands::prepend_to_line as Command,
157− vec![Key {
158− code: KeyCode::Char('a'),
159− modifiers: Modifiers::NONE
160− }] => commands::append_mode as Command,
161− vec![Key {
162− code: KeyCode::Char('A'),
163− modifiers: Modifiers::SHIFT,
164− }] => commands::append_to_line as Command,
165− vec![Key {
166− code: KeyCode::Char('o'),
167− modifiers: Modifiers::NONE
168− }] => commands::open_below as Command,
169− vec![Key {
170− code: KeyCode::Char('d'),
171− modifiers: Modifiers::NONE
172− }] => commands::delete_selection as Command,
173− vec![Key {
174− code: KeyCode::Char('c'),
175− modifiers: Modifiers::NONE
176− }] => commands::change_selection as Command,
177− vec![Key {
178− code: KeyCode::Char('s'),
179− modifiers: Modifiers::NONE
180− }] => commands::split_selection_on_newline as Command,
116+ vec![key!('h')] => commands::move_char_left as Command,
117+ vec![key!('j')] => commands::move_line_down,
118+ vec![key!('k')] => commands::move_line_up,
119+ vec![key!('0')] => commands::move_line_start,
120+ vec![key!('$')] => commands::move_line_end,
121+ vec![key!('l')] => commands::move_char_right,
122+ vec![shift!('H')] => commands::extend_char_left,
123+ vec![shift!('J')] => commands::extend_line_down,
124+ vec![shift!('K')] => commands::extend_line_up,
125+ vec![shift!('L')] => commands::extend_char_right,
126+ vec![key!('w')] => commands::move_next_word_start,
127+ vec![key!('b')] => commands::move_prev_word_start,
128+ vec![key!('e')] => commands::move_next_word_end,
129+ vec![key!('i')] => commands::insert_mode,
130+ vec![shift!('I')] => commands::prepend_to_line,
131+ vec![key!('a')] => commands::append_mode,
132+ vec![shift!('A')] => commands::append_to_line,
133+ vec![key!('o')] => commands::open_below,
134+ vec![key!('d')] => commands::delete_selection,
135+ vec![key!('c')] => commands::change_selection,
136+ vec![key!('s')] => commands::split_selection_on_newline,
181137 vec![Key {
182138 code: KeyCode::Esc,
183139 modifiers: Modifiers::NONE
184− }] => commands::normal_mode as Command,
140+ }] => commands::normal_mode,
185141 ),
186142 state::Mode::Insert => hashmap!(
187143 vec![Key {
@@ -191,15 +147,15 @@ pub fn default() -> Keymaps {
191147 vec![Key {
192148 code: KeyCode::Backspace,
193149 modifiers: Modifiers::NONE
194− }] => commands::delete_char_backward as Command,
150+ }] => commands::delete_char_backward,
195151 vec![Key {
196152 code: KeyCode::Delete,
197153 modifiers: Modifiers::NONE
198− }] => commands::delete_char_forward as Command,
154+ }] => commands::delete_char_forward,
199155 vec![Key {
200156 code: KeyCode::Enter,
201157 modifiers: Modifiers::NONE
202− }] => commands::insert_newline as Command,
158+ }] => commands::insert_newline,
203159 )
204160 )
205161}