@@ -87,7 +87,7 @@ impl Editor {
87 // TODO: inefficient, should feed chunks.iter() to tree_sitter.parse_with(|offset, pos|)
87 // TODO: inefficient, should feed chunks.iter() to tree_sitter.parse_with(|offset, pos|)
88 let source_code = view.state.doc().to_string();
88 let source_code = view.state.doc().to_string();
90− let last_line = view.last_line(viewport);
90+ let last_line = view.last_line();
92 let range = {
92 let range = {
93 // calculate viewport byte ranges
93 // calculate viewport byte ranges
@@ -219,7 +219,7 @@ impl Editor {
221 let style: Style = view.theme.get("ui.linenr");
221 let style: Style = view.theme.get("ui.linenr");
222− for (i, line) in (view.first_line..(last_line as u16)).enumerate() {
222+ for (i, line) in (view.first_line..last_line).enumerate() {
223 self.surface
223 self.surface
224 .set_stringn(0, i as u16, format!("{:>5}", line + 1), 5, style);
224 .set_stringn(0, i as u16, format!("{:>5}", line + 1), 5, style);
225 // lavender
225 // lavender
@@ -254,6 +254,7 @@ impl Editor {
254 let mode = match view.state.mode() {
254 let mode = match view.state.mode() {
255 Mode::Insert => "INS",
255 Mode::Insert => "INS",
256 Mode::Normal => "NOR",
256 Mode::Normal => "NOR",
257+ Mode::Goto => "GOTO",
258 self.surface.set_style(
259 self.surface.set_style(
259 Rect::new(0, self.size.1 - 1, self.size.0, 1),
260 Rect::new(0, self.size.1 - 1, self.size.0, 1),
@@ -278,13 +279,14 @@ impl Editor {
278 match view.state.mode() {
279 match view.state.mode() {
279 Mode::Insert => write!(stdout, "\x1B[6 q"),
280 Mode::Insert => write!(stdout, "\x1B[6 q"),
280 Mode::Normal => write!(stdout, "\x1B[2 q"),
281 Mode::Normal => write!(stdout, "\x1B[2 q"),
282+ Mode::Goto => write!(stdout, "\x1B[2 q"),
283 // render the cursor
285 // render the cursor
284 let pos = view.state.selection().cursor();
286 let pos = view.state.selection().cursor();
286 let pos = view
288 let pos = view
287− .screen_coords_at_pos(&view.state.doc().slice(..), pos, area)
289+ .screen_coords_at_pos(&view.state.doc().slice(..), pos)
288 .expect("Cursor is out of bounds.");
290 .expect("Cursor is out of bounds.");
290 execute!(
292 execute!(
@@ -326,6 +328,7 @@ impl Editor {
326 }))) => {
328 }))) => {
329 Some(Ok(Event::Key(event))) => {
332 Some(Ok(Event::Key(event))) => {
330 if let Some(view) = &mut self.view {
333 if let Some(view) = &mut self.view {
331 match view.state.mode() {
334 match view.state.mode() {
@@ -356,6 +359,19 @@ impl Editor {
356 // TODO: simplistic ensure cursor in view for now
359 // TODO: simplistic ensure cursor in view for now
357 view.ensure_cursor_in_view();
360 view.ensure_cursor_in_view();
366+ // TODO: handle modes and sequences (`gg`)
367+ let keys = vec![event];
368+ if let Some(command) = keymap[&Mode::Goto].get(&keys) {
369+ // TODO: handle count other than 1
372+ // TODO: simplistic ensure cursor in view for now
373+ view.ensure_cursor_in_view();
359 self.render();
375 self.render();