commit 56402e7589773256279ad6e38e84eb4064f7d2a2
parent a5e106d764e90213967be9537625c306839b3dd3
Author: David Lawrence Ramsey <pooka109@gmail.com>
Date: Fri, 20 Jan 2017 10:34:45 -0600
softwrap: improve Left and Right's behavior with softwrapped chunks
Use the new "unclever" functionality of Home and End to make do_left()
and do_right() move properly to the end of the previous chunk or to the
start of the next chunk in softwrap mode when crossing a line boundary.
(Furthermore, doing Up plus End, or Down plus Home, does all needed
screen updates, which simplifies the code.)
The do_left() and do_right() functions don't yet properly move vertically
at line boundaries, but that will be fixed once do_up() and do_down() are
updated for softwrap mode, which is forthcoming.
This fixes https://savannah.gnu.org/bugs/?49384.
Diffstat:
M | src/move.c | | | 48 | +++++++++++++++++++++++++++++++++++++----------- |
1 file changed, 37 insertions(+), 11 deletions(-)
diff --git a/src/move.c b/src/move.c
@@ -592,17 +592,34 @@ void do_scroll_down(void)
void do_left(void)
{
size_t was_column = xplustabs();
+#ifndef NANO_TINY
+ size_t was_chunk = (was_column / editwincols);
+ filestruct *was_current = openfile->current;
+#endif
if (openfile->current_x > 0)
openfile->current_x = move_mbleft(openfile->current->data,
openfile->current_x);
else if (openfile->current != openfile->fileage) {
do_up_void();
- openfile->current_x = strlen(openfile->current->data);
+ do_end(FALSE);
+ return;
}
openfile->placewewant = xplustabs();
+#ifndef NANO_TINY
+ /* If we were on the first line of the edit window, and we changed chunk,
+ * we're now above the first line of the edit window, so scroll up. */
+ if (ISSET(SOFTWRAP) && openfile->current_y == 0 &&
+ openfile->current == was_current &&
+ (openfile->placewewant / editwincols) != was_chunk) {
+ edit_scroll(UPWARD, ISSET(SMOOTH_SCROLL) ? 1 : editwinrows / 2 + 1);
+ return;
+ }
+#endif
+
+ /* Update current if the mark is on or it has changed "page". */
if (line_needs_update(was_column, openfile->placewewant))
update_line(openfile->current, openfile->current_x);
}
@@ -611,25 +628,34 @@ void do_left(void)
void do_right(void)
{
size_t was_column = xplustabs();
+#ifndef NANO_TINY
+ size_t was_chunk = (was_column / editwincols);
+ filestruct *was_current = openfile->current;
+#endif
if (openfile->current->data[openfile->current_x] != '\0')
openfile->current_x = move_mbright(openfile->current->data,
openfile->current_x);
else if (openfile->current != openfile->filebot) {
- openfile->current_x = 0;
-#ifndef NANO_TINY
- if (ISSET(SOFTWRAP))
- openfile->current_y -= strlenpt(openfile->current->data) / editwincols;
-#endif
+ do_home(FALSE);
+ do_down_void();
+ return;
}
openfile->placewewant = xplustabs();
+#ifndef NANO_TINY
+ /* If we were on the last line of the edit window, and we changed chunk,
+ * we're now below the first line of the edit window, so scroll down. */
+ if (ISSET(SOFTWRAP) && openfile->current_y == editwinrows - 1 &&
+ openfile->current == was_current &&
+ openfile->placewewant / editwincols != was_chunk) {
+ edit_scroll(DOWNWARD, ISSET(SMOOTH_SCROLL) ? 1 : editwinrows / 2 + 1);
+ return;
+ }
+#endif
+
+ /* Update current if the mark is on or it has changed "page". */
if (line_needs_update(was_column, openfile->placewewant))
update_line(openfile->current, openfile->current_x);
-
- if (openfile->current_x == 0)
- do_down_void();
- else
- ensure_line_is_visible();
}