@@ -133,22 +133,60 @@ pub fn move_file_end(view: &mut View, _count: usize) {
133 view.state.mode = Mode::Normal;
133 view.state.mode = Mode::Normal;
136+pub fn check_cursor_in_view(view: &mut View) -> bool {
137+ let cursor = view.state.selection().cursor();
138+ let line = view.state.doc().char_to_line(cursor) as u16;
139+ let document_end = view.first_line + view.size.1.saturating_sub(1) - 1;
142+ if (line > document_end.saturating_sub(padding)) | (line < view.first_line + padding) {
136pub fn page_up(view: &mut View, _count: usize) {
148pub fn page_up(view: &mut View, _count: usize) {
149+ let text = &view.state.doc;
137 view.first_line = view.first_line.saturating_sub(view.size.1);
150 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);
152+ view.state.selection = Selection::single(
153+ text.line_to_char(view.first_line as usize),
154+ text.line_to_char(view.first_line as usize),
141pub fn page_down(view: &mut View, _count: usize) {
158pub fn page_down(view: &mut View, _count: usize) {
159+ let text = &view.state.doc;
142 view.first_line += view.size.1;
160 view.first_line += view.size.1;
143− view.state.selection = Selection::single(view.first_line as usize, view.first_line as usize);
162+ view.state.selection = Selection::single(
163+ text.line_to_char(view.first_line as usize),
164+ text.line_to_char(view.first_line as usize),
146pub fn half_page_up(view: &mut View, _count: usize) {
168pub fn half_page_up(view: &mut View, _count: usize) {
147 view.first_line = view.first_line.saturating_sub(view.size.1 / 2);
169 view.first_line = view.first_line.saturating_sub(view.size.1 / 2);
171+ if !check_cursor_in_view(view) {
172+ let text = &view.state.doc;
173+ view.state.selection = Selection::single(
174+ text.line_to_char(view.first_line as usize),
175+ text.line_to_char(view.first_line as usize),
150pub fn half_page_down(view: &mut View, _count: usize) {
180pub fn half_page_down(view: &mut View, _count: usize) {
151 view.first_line += view.size.1 / 2;
181 view.first_line += view.size.1 / 2;
183+ if !check_cursor_in_view(view) {
184+ let text = &view.state.doc;
185+ view.state.selection = Selection::single(
186+ text.line_to_char(view.first_line as usize),
187+ text.line_to_char(view.first_line as usize),
153// avoid select by default by having a visual mode switch that makes movements into selects
191// avoid select by default by having a visual mode switch that makes movements into selects