@@ -127,12 +127,29 @@ pub fn move_file_start(view: &mut View, _count: usize) {
127pub fn move_file_end(view: &mut View, _count: usize) {
127pub fn move_file_end(view: &mut View, _count: usize) {
128 // TODO: use a transaction
128 // TODO: use a transaction
129 let text = &view.state.doc;
129 let text = &view.state.doc;
130− let last_line = text.line_to_char(text.len_lines().checked_sub(1).unwrap());
130+ let last_line = text.line_to_char(text.len_lines().checked_sub(2).unwrap());
131 view.state.selection = Selection::single(last_line, last_line);
131 view.state.selection = Selection::single(last_line, last_line);
133 view.state.mode = Mode::Normal;
133 view.state.mode = Mode::Normal;
136+pub fn page_up(view: &mut View, _count: usize) {
137+ view.first_line = view.first_line.saturating_sub(view.size.1);
138+ view.state.selection = Selection::single(view.first_line as usize, view.first_line as usize);
141+pub fn page_down(view: &mut View, _count: usize) {
142+ view.first_line += view.size.1;
143+ view.state.selection = Selection::single(view.first_line as usize, view.first_line as usize);
146+pub fn half_page_up(view: &mut View, _count: usize) {
147+ view.first_line = view.first_line.saturating_sub(view.size.1 / 2);
150+pub fn half_page_down(view: &mut View, _count: usize) {
151+ view.first_line += view.size.1 / 2;
136// avoid select by default by having a visual mode switch that makes movements into selects
153// avoid select by default by having a visual mode switch that makes movements into selects
138pub fn extend_char_left(view: &mut View, count: usize) {
155pub fn extend_char_left(view: &mut View, count: usize) {