on master help sign in
Support go to line 1
commitae51065213c4dfc0072c9dfe384527faf34b54ff authorZheming Li <nkdudu@126.com> dateTue 8 Jun 2021, 03:24 (5 years ago) parent4e3a343
3 files changed+38−36
helix-term/src/commands.rs+33−32 helix-term/src/ui/editor.rs+4−3 helix-view/src/editor.rs+1−1
helix-term/src/commands.rs+33−32
@@ -37,7 +37,7 @@ use once_cell::sync::Lazy;
3737
3838pub struct Context<'a> {
3939 pub register: helix_view::RegisterSelection,
40− pub count: usize,
40+ pub _count: Option<std::num::NonZeroUsize>,
4141 pub editor: &'a mut Editor,
4242
4343 pub callback: Option<crate::compositor::Callback>,
@@ -97,6 +97,11 @@ impl<'a> Context<'a> {
9797 });
9898 self.callbacks.push(callback);
9999 }
100+
101+ #[inline]
102+ pub fn count(&self) -> usize {
103+ self._count.map_or(1, |v| v.get())
104+ }
100105}
101106
102107enum Align {
@@ -123,7 +128,7 @@ fn align_view(doc: &Document, view: &mut View, align: Align) {
123128pub type Command = fn(cx: &mut Context);
124129
125130pub fn move_char_left(cx: &mut Context) {
126− let count = cx.count;
131+ let count = cx.count();
127132 let (view, doc) = cx.current();
128133 let text = doc.text().slice(..);
129134 let selection = doc.selection(view.id).transform(|range| {
@@ -139,7 +144,7 @@ pub fn move_char_left(cx: &mut Context) {
139144}
140145
141146pub fn move_char_right(cx: &mut Context) {
142− let count = cx.count;
147+ let count = cx.count();
143148 let (view, doc) = cx.current();
144149 let text = doc.text().slice(..);
145150 let selection = doc.selection(view.id).transform(|range| {
@@ -155,7 +160,7 @@ pub fn move_char_right(cx: &mut Context) {
155160}
156161
157162pub fn move_line_up(cx: &mut Context) {
158− let count = cx.count;
163+ let count = cx.count();
159164 let (view, doc) = cx.current();
160165 let text = doc.text().slice(..);
161166 let selection = doc.selection(view.id).transform(|range| {
@@ -171,7 +176,7 @@ pub fn move_line_up(cx: &mut Context) {
171176}
172177
173178pub fn move_line_down(cx: &mut Context) {
174− let count = cx.count;
179+ let count = cx.count();
175180 let (view, doc) = cx.current();
176181 let text = doc.text().slice(..);
177182 let selection = doc.selection(view.id).transform(|range| {
@@ -240,7 +245,7 @@ pub fn move_first_nonwhitespace(cx: &mut Context) {
240245// since these all really do the same thing
241246
242247pub fn move_next_word_start(cx: &mut Context) {
243− let count = cx.count;
248+ let count = cx.count();
244249 let (view, doc) = cx.current();
245250 let text = doc.text().slice(..);
246251
@@ -252,7 +257,7 @@ pub fn move_next_word_start(cx: &mut Context) {
252257}
253258
254259pub fn move_prev_word_start(cx: &mut Context) {
255− let count = cx.count;
260+ let count = cx.count();
256261 let (view, doc) = cx.current();
257262 let text = doc.text().slice(..);
258263
@@ -264,7 +269,7 @@ pub fn move_prev_word_start(cx: &mut Context) {
264269}
265270
266271pub fn move_next_word_end(cx: &mut Context) {
267− let count = cx.count;
272+ let count = cx.count();
268273 let (view, doc) = cx.current();
269274 let text = doc.text().slice(..);
270275
@@ -290,7 +295,7 @@ pub fn move_file_end(cx: &mut Context) {
290295}
291296
292297pub fn extend_next_word_start(cx: &mut Context) {
293− let count = cx.count;
298+ let count = cx.count();
294299 let (view, doc) = cx.current();
295300 let text = doc.text().slice(..);
296301
@@ -304,7 +309,7 @@ pub fn extend_next_word_start(cx: &mut Context) {
304309}
305310
306311pub fn extend_prev_word_start(cx: &mut Context) {
307− let count = cx.count;
312+ let count = cx.count();
308313 let (view, doc) = cx.current();
309314 let text = doc.text().slice(..);
310315
@@ -317,7 +322,7 @@ pub fn extend_prev_word_start(cx: &mut Context) {
317322}
318323
319324pub fn extend_next_word_end(cx: &mut Context) {
320− let count = cx.count;
325+ let count = cx.count();
321326 let (view, doc) = cx.current();
322327 let text = doc.text().slice(..);
323328
@@ -339,7 +344,7 @@ where
339344{
340345 // TODO: count is reset to 1 before next key so we move it into the closure here.
341346 // Would be nice to carry over.
342− let count = cx.count;
347+ let count = cx.count();
343348
344349 // need to wait for next key
345350 cx.on_next_key(move |cx, event| {
@@ -563,7 +568,7 @@ pub fn half_page_down(cx: &mut Context) {
563568}
564569
565570pub fn extend_char_left(cx: &mut Context) {
566− let count = cx.count;
571+ let count = cx.count();
567572 let (view, doc) = cx.current();
568573 let text = doc.text().slice(..);
569574 let selection = doc.selection(view.id).transform(|range| {
@@ -579,7 +584,7 @@ pub fn extend_char_left(cx: &mut Context) {
579584}
580585
581586pub fn extend_char_right(cx: &mut Context) {
582− let count = cx.count;
587+ let count = cx.count();
583588 let (view, doc) = cx.current();
584589 let text = doc.text().slice(..);
585590 let selection = doc.selection(view.id).transform(|range| {
@@ -595,7 +600,7 @@ pub fn extend_char_right(cx: &mut Context) {
595600}
596601
597602pub fn extend_line_up(cx: &mut Context) {
598− let count = cx.count;
603+ let count = cx.count();
599604 let (view, doc) = cx.current();
600605 let text = doc.text().slice(..);
601606 let selection = doc.selection(view.id).transform(|range| {
@@ -611,7 +616,7 @@ pub fn extend_line_up(cx: &mut Context) {
611616}
612617
613618pub fn extend_line_down(cx: &mut Context) {
614− let count = cx.count;
619+ let count = cx.count();
615620 let (view, doc) = cx.current();
616621 let text = doc.text().slice(..);
617622 let selection = doc.selection(view.id).transform(|range| {
@@ -795,7 +800,7 @@ pub fn search_selection(cx: &mut Context) {
795800//
796801
797802pub fn select_line(cx: &mut Context) {
798− let count = cx.count;
803+ let count = cx.count();
799804 let (view, doc) = cx.current();
800805
801806 let pos = doc.selection(view.id).primary();
@@ -810,7 +815,7 @@ pub fn select_line(cx: &mut Context) {
810815 doc.set_selection(view.id, Selection::single(start, end));
811816}
812817pub fn extend_line(cx: &mut Context) {
813− let count = cx.count;
818+ let count = cx.count();
814819 let (view, doc) = cx.current();
815820
816821 let pos = doc.selection(view.id).primary();
@@ -1212,7 +1217,7 @@ enum Open {
12121217}
12131218
12141219fn open(cx: &mut Context, open: Open) {
1215− let count = cx.count;
1220+ let count = cx.count();
12161221 let (view, doc) = cx.current();
12171222 enter_insert_mode(doc);
12181223
@@ -1308,15 +1313,11 @@ fn push_jump(editor: &mut Editor) {
13081313}
13091314
13101315pub fn goto_mode(cx: &mut Context) {
1311− let count = cx.count;
1312−
1313− if count > 1 {
1316+ if let Some(count) = cx._count {
13141317 push_jump(cx.editor);
13151318
1316− // TODO: can't go to line 1 since we can't distinguish between g and 1g, g gets converted
1317− // to 1g
13181319 let (view, doc) = cx.current();
1319− let line_idx = std::cmp::min(count - 1, doc.text().len_lines().saturating_sub(2));
1320+ let line_idx = std::cmp::min(count.get() - 1, doc.text().len_lines().saturating_sub(2));
13201321 let pos = doc.text().line_to_char(line_idx);
13211322 doc.set_selection(view.id, Selection::point(pos));
13221323 return;
@@ -1880,7 +1881,7 @@ pub mod insert {
18801881
18811882 // TODO: handle indent-aware delete
18821883 pub fn delete_char_backward(cx: &mut Context) {
1883− let count = cx.count;
1884+ let count = cx.count();
18841885 let (view, doc) = cx.current();
18851886 let text = doc.text().slice(..);
18861887 let transaction =
@@ -1895,7 +1896,7 @@ pub mod insert {
18951896 }
18961897
18971898 pub fn delete_char_forward(cx: &mut Context) {
1898− let count = cx.count;
1899+ let count = cx.count();
18991900 let (view, doc) = cx.current();
19001901 let text = doc.text().slice(..);
19011902 let transaction =
@@ -1910,7 +1911,7 @@ pub mod insert {
19101911 }
19111912
19121913 pub fn delete_word_backward(cx: &mut Context) {
1913− let count = cx.count;
1914+ let count = cx.count();
19141915 let (view, doc) = cx.current();
19151916 let text = doc.text().slice(..);
19161917 let transaction =
@@ -2071,7 +2072,7 @@ fn get_lines(doc: &Document, view_id: ViewId) -> Vec<usize> {
20712072}
20722073
20732074pub fn indent(cx: &mut Context) {
2074− let count = cx.count;
2075+ let count = cx.count();
20752076 let (view, doc) = cx.current();
20762077 let lines = get_lines(doc, view.id);
20772078
@@ -2090,7 +2091,7 @@ pub fn indent(cx: &mut Context) {
20902091}
20912092
20922093pub fn unindent(cx: &mut Context) {
2093− let count = cx.count;
2094+ let count = cx.count();
20942095 let (view, doc) = cx.current();
20952096 let lines = get_lines(doc, view.id);
20962097 let mut changes = Vec::with_capacity(lines.len());
@@ -2428,7 +2429,7 @@ pub fn match_brackets(cx: &mut Context) {
24282429//
24292430
24302431pub fn jump_forward(cx: &mut Context) {
2431− let count = cx.count;
2432+ let count = cx.count();
24322433 let (view, doc) = cx.current();
24332434
24342435 if let Some((id, selection)) = view.jumps.forward(count) {
@@ -2442,7 +2443,7 @@ pub fn jump_forward(cx: &mut Context) {
24422443}
24432444
24442445pub fn jump_backward(cx: &mut Context) {
2445− let count = cx.count;
2446+ let count = cx.count();
24462447 let (view, doc) = cx.current();
24472448
24482449 if let Some((id, selection)) = view.jumps.backward(count) {
helix-term/src/ui/editor.rs+4−3
@@ -527,7 +527,8 @@ impl EditorView {
527527 // count handling
528528 key!(i @ '0'..='9') => {
529529 let i = i.to_digit(10).unwrap() as usize;
530− cxt.editor.count = Some(cxt.editor.count.map_or(i, |c| c * 10 + i));
530+ cxt.editor.count =
531+ std::num::NonZeroUsize::new(cxt.editor.count.map_or(i, |c| c.get() * 10 + i));
531532 }
532533 // special handling for repeat operator
533534 key!('.') => {
@@ -540,7 +541,7 @@ impl EditorView {
540541 }
541542 _ => {
542543 // set the count
543− cxt.count = cxt.editor.count.take().unwrap_or(1);
544+ cxt._count = cxt.editor.count.take();
544545 // TODO: edge case: 0j -> reset to 1
545546 // if this fails, count was Some(0)
546547 // debug_assert!(cxt.count != 0);
@@ -587,8 +588,8 @@ impl Component for EditorView {
587588
588589 let mut cxt = commands::Context {
589590 register: helix_view::RegisterSelection::default(),
590− count: 1,
591591 editor: &mut cx.editor,
592+ _count: None,
592593 callback: None,
593594 on_next_key_callback: None,
594595 callbacks: cx.callbacks,
helix-view/src/editor.rs+1−1
@@ -12,7 +12,7 @@ pub use helix_core::diagnostic::Severity;
1212pub struct Editor {
1313 pub tree: Tree,
1414 pub documents: SlotMap<DocumentId, Document>,
15− pub count: Option<usize>,
15+ pub count: Option<std::num::NonZeroUsize>,
1616 pub register: RegisterSelection,
1717 pub theme: Theme,
1818 pub language_servers: helix_lsp::Registry,