diff --git a/src/move.c b/src/move.c
index 09ce649c197dc549f3bb140963454830165415e9..0ffa864f323a432c327736f9f80e2896bd64bac8 100644
--- a/src/move.c
+++ b/src/move.c
@@ -49,11 +49,31 @@ void do_last_line(void)
     focusing = FALSE;
 }
 
+/* Determine the actual current chunk and the target column. */
+void get_edge_and_target(size_t *leftedge, size_t *target_column)
+{
+#ifndef NANO_TINY
+    if (ISSET(SOFTWRAP)) {
+	size_t realspan = strlenpt(openfile->current->data);
+
+	if (openfile->placewewant < realspan)
+	    realspan = openfile->placewewant;
+
+	*leftedge = (realspan / editwincols) * editwincols;
+	*target_column = openfile->placewewant % editwincols;
+    } else
+#endif
+    {
+	*leftedge = 0;
+	*target_column = openfile->placewewant;
+    }
+}
+
 /* Move up nearly one screenful. */
 void do_page_up(void)
 {
     int mustmove = (editwinrows < 3) ? 1 : editwinrows - 2;
-    size_t leftedge = 0, target_column;
+    size_t leftedge, target_column;
 
     /* If we're not in smooth scrolling mode, put the cursor at the
      * beginning of the top line of the edit window, as Pico does. */
@@ -63,18 +83,7 @@ void do_page_up(void)
 	openfile->current_y = 0;
     }
 
-#ifndef NANO_TINY
-    if (ISSET(SOFTWRAP)) {
-	size_t realspan = strlenpt(openfile->current->data);
-
-	if (openfile->placewewant < realspan)
-	    realspan = openfile->placewewant;
-
-	leftedge = (realspan / editwincols) * editwincols;
-	target_column = openfile->placewewant % editwincols;
-    } else
-#endif
-	target_column = openfile->placewewant;
+    get_edge_and_target(&leftedge, &target_column);
 
     /* Move up the required number of lines or chunks.  If we can't, we're
      * at the top of the file, so put the cursor there and get out. */
@@ -96,7 +105,7 @@ void do_page_up(void)
 void do_page_down(void)
 {
     int mustmove = (editwinrows < 3) ? 1 : editwinrows - 2;
-    size_t leftedge = 0, target_column;
+    size_t leftedge, target_column;
 
     /* If we're not in smooth scrolling mode, put the cursor at the
      * beginning of the top line of the edit window, as Pico does. */
@@ -106,18 +115,7 @@ void do_page_down(void)
 	openfile->current_y = 0;
     }
 
-#ifndef NANO_TINY
-    if (ISSET(SOFTWRAP)) {
-	size_t realspan = strlenpt(openfile->current->data);
-
-	if (openfile->placewewant < realspan)
-	    realspan = openfile->placewewant;
-
-	leftedge = (realspan / editwincols) * editwincols;
-	target_column = openfile->placewewant % editwincols;
-    } else
-#endif
-	target_column = openfile->placewewant;
+    get_edge_and_target(&leftedge, &target_column);
 
     /* Move down the required number of lines or chunks.  If we can't, we're
      * at the bottom of the file, so put the cursor there and get out. */
@@ -463,25 +461,14 @@ void do_up(bool scroll_only)
 {
     filestruct *was_current = openfile->current;
     size_t was_column = xplustabs();
-    size_t leftedge = 0, target_column;
+    size_t leftedge, target_column;
 
     /* When just scrolling and the top of the file is onscreen, get out. */
     if (scroll_only && openfile->edittop == openfile->fileage &&
 			openfile->firstcolumn == 0)
 	return;
 
-#ifndef NANO_TINY
-    if (ISSET(SOFTWRAP)) {
-	size_t realspan = strlenpt(openfile->current->data);
-
-	if (openfile->placewewant < realspan)
-	    realspan = openfile->placewewant;
-
-	leftedge = (realspan / editwincols) * editwincols;
-	target_column = openfile->placewewant % editwincols;
-    } else
-#endif
-	target_column = openfile->placewewant;
+    get_edge_and_target(&leftedge, &target_column);
 
     /* If we can't move up one line or chunk, we're at top of file. */
     if (go_back_chunks(1, &openfile->current, &leftedge) > 0)
@@ -523,20 +510,9 @@ void do_down(bool scroll_only)
 {
     filestruct *was_current = openfile->current;
     size_t was_column = xplustabs();
-    size_t leftedge = 0, target_column;
-
-#ifndef NANO_TINY
-    if (ISSET(SOFTWRAP)) {
-	size_t realspan = strlenpt(openfile->current->data);
-
-	if (openfile->placewewant < realspan)
-	    realspan = openfile->placewewant;
+    size_t leftedge, target_column;
 
-	leftedge = (realspan / editwincols) * editwincols;
-	target_column = openfile->placewewant % editwincols;
-    } else
-#endif
-	target_column = openfile->placewewant;
+    get_edge_and_target(&leftedge, &target_column);
 
     /* If we can't move down one line or chunk, we're at bottom of file. */
     if (go_forward_chunks(1, &openfile->current, &leftedge) > 0)