diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index 72c9d15e..2cd2ad05 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -227,16 +227,16 @@ impl EditorView {
         _theme: &Theme,
     ) -> Box<dyn Iterator<Item = HighlightEvent> + 'doc> {
         let text = doc.text().slice(..);
-        let last_line = std::cmp::min(
-            // Saturating subs to make it inclusive zero indexing.
-            (offset.row + height as usize).saturating_sub(1),
-            doc.text().len_lines().saturating_sub(1),
-        );
 
         let range = {
-            // calculate viewport byte ranges
-            let start = text.line_to_byte(offset.row);
-            let end = text.line_to_byte(last_line + 1);
+            // Calculate viewport byte ranges:
+            // Saturating subs to make it inclusive zero indexing.
+            let last_line = doc.text().len_lines().saturating_sub(1);
+            let last_visible_line = (offset.row + height as usize)
+                .saturating_sub(1)
+                .min(last_line);
+            let start = text.line_to_byte(offset.row.min(last_line));
+            let end = text.line_to_byte(last_visible_line + 1);
 
             start..end
         };
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 47edf303..bb9616e8 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -1223,9 +1223,11 @@ impl Editor {
     pub fn focus(&mut self, view_id: ViewId) {
         let prev_id = std::mem::replace(&mut self.tree.focus, view_id);
 
-        // if leaving the view: mode should reset
+        // if leaving the view: mode should reset and the cursor should be
+        // within view
         if prev_id != view_id {
             self.mode = Mode::Normal;
+            self.ensure_cursor_in_view(view_id);
         }
     }
 
@@ -1234,9 +1236,11 @@ impl Editor {
         self.tree.focus_next();
         let id = self.tree.focus;
 
-        // if leaving the view: mode should reset
+        // if leaving the view: mode should reset and the cursor should be
+        // within view
         if prev_id != id {
             self.mode = Mode::Normal;
+            self.ensure_cursor_in_view(id);
         }
     }