diff --git a/method/__init__.py b/method/__init__.py index 0f309a4..526b0cb 100644 --- a/method/__init__.py +++ b/method/__init__.py @@ -396,7 +396,7 @@ class ToggleMargins(Method): class CenterView(Method): '''Move view to center on cursor''' def _execute(self, w, **vargs): - w.center_view() + w.center_view(force=True) class SetMark(Method): '''Set the mark to the current cursor location''' def _execute(self, w, **vargs): diff --git a/window.py b/window.py index c308e60..53f4989 100644 --- a/window.py +++ b/window.py @@ -221,7 +221,7 @@ class Window(object): def last_is_visible(self): return self.point_is_visible(self.buffer.get_buffer_end()) - def center_view(self): + def center_view(self, force=False): (x, y) = self.logical_cursor().xy() counter = 0 while counter < self.height / 2: @@ -234,6 +234,14 @@ class Window(object): (x, y) = (0, 0) break counter += 1 + + # make sure we aren't "centering" on the end of the file (where half the + # screen is empty). that is, unless that's what the user wants + # (indicated by force=True). + if not force: + (x2, y2) = self.last_visible_coords() + if y2 < y or x2 < x: + x, y = x2, y2 self.first = Point(x - (x % self.width), y) self.redraw() def lower_view(self): @@ -267,11 +275,13 @@ class Window(object): self.first = Point(x - (x % self.width), y) self.redraw() def assure_visible_cursor(self): - p = self.logical_cursor() - if self.first > p: - self.upper_view() - elif p > self.last: - self.lower_view() + if not self.cursor_is_visible(): + self.center_view() + #p = self.logical_cursor() + #if self.first > p: + # self.upper_view() + #elif p > self.last: + # self.lower_view() # moving in buffer def forward(self): @@ -457,7 +467,13 @@ class Window(object): self.assure_visible_cursor() def goto_end(self, force=False): self.cursor = self.buffer.get_buffer_end() - (x, y) = self.logical_cursor().xy() + (x, y) = self.last_visible_coords() + if force or not self.cursor_is_visible(): + self.first = Point(x - (x % self.width), y) + self.redraw() + + def last_visible_coords(self): + (x, y) = self.buffer.get_buffer_end().xy() if x == 0: y -= 1 x = len(self.buffer.lines[y]) @@ -474,10 +490,7 @@ class Window(object): (x, y) = (0, 0) break counter += 1 - - if force or not self.cursor_is_visible(): - self.first = Point(x - (x % self.width), y) - self.redraw() + return (x, y) # mark manipulation def set_mark_point(self, p):