diff -ru vim70-orig/src/move.c vim70/src/move.c
--- vim70-orig/src/move.c	2006-03-13 13:21:18.000000000 -0800
+++ vim70/src/move.c	2006-08-15 13:54:39.000000000 -0700
@@ -911,7 +911,7 @@
 win_col_off(wp)
     win_T	*wp;
 {
-    return ((wp->w_p_nu ? number_width(wp) + 1 : 0)
+    return ((wp->w_p_nu ? abs(number_width(wp)) + 1 : 0)
 #ifdef FEAT_CMDWIN
 	    + (cmdwin_type == 0 || wp != curwin ? 0 : 1)
 #endif
@@ -944,7 +944,7 @@
     win_T	*wp;
 {
     if (wp->w_p_nu && vim_strchr(p_cpo, CPO_NUMCOL) != NULL)
-	return number_width(wp) + 1;
+	return abs(number_width(wp)) + 1;
     return 0;
 }
 
diff -ru vim70-orig/src/option.c vim70/src/option.c
--- vim70-orig/src/option.c	2006-05-03 10:32:28.000000000 -0700
+++ vim70/src/option.c	2006-08-15 13:49:24.000000000 -0700
@@ -7828,15 +7828,15 @@
     }
 
 #ifdef FEAT_LINEBREAK
-    /* 'numberwidth' must be positive */
+    /* abs('numberwidth') must be between 1 and 10 */
     else if (pp == &curwin->w_p_nuw)
     {
-	if (curwin->w_p_nuw < 1)
+	if (abs(curwin->w_p_nuw) < 1)
 	{
 	    errmsg = e_positive;
 	    curwin->w_p_nuw = 1;
 	}
-	if (curwin->w_p_nuw > 10)
+	if (abs(curwin->w_p_nuw) > 10)
 	{
 	    errmsg = e_invarg;
 	    curwin->w_p_nuw = 10;
diff -ru vim70-orig/src/screen.c vim70/src/screen.c
--- vim70-orig/src/screen.c	2006-05-05 03:13:55.000000000 -0700
+++ vim70/src/screen.c	2006-08-15 14:02:56.000000000 -0700
@@ -436,7 +436,7 @@
 #ifdef FEAT_LINEBREAK
     /* Force redraw when width of 'number' column changes. */
     if (curwin->w_redr_type < NOT_VALID
-	   && curwin->w_nrwidth != (curwin->w_p_nu ? number_width(curwin) : 0))
+	   && curwin->w_nrwidth != (curwin->w_p_nu ? abs(number_width(curwin)) : 0))
 	curwin->w_redr_type = NOT_VALID;
 #endif
 
@@ -867,7 +867,7 @@
 
 #ifdef FEAT_LINEBREAK
     /* Force redraw when width of 'number' column changes. */
-    i = wp->w_p_nu ? number_width(wp) : 0;
+    i = wp->w_p_nu ? abs(number_width(wp)) : 0;
     if (wp->w_nrwidth != i)
     {
 	type = NOT_VALID;
@@ -2179,8 +2179,8 @@
 	{
 	    int	    w = number_width(wp);
 
-	    if (len > w + 1)
-		len = w + 1;
+	    if (len > abs(w) + 1)
+		len = abs(w) + 1;
 	    sprintf((char *)buf, "%*ld ", w, (long)lnum);
 #ifdef FEAT_RIGHTLEFT
 	    if (wp->w_p_rl)
@@ -3268,7 +3268,7 @@
 		    }
 		    else
 			c_extra = ' ';
-		    n_extra = number_width(wp) + 1;
+		    n_extra = abs(number_width(wp)) + 1;
 		    char_attr = hl_attr(HLF_N);
 #ifdef FEAT_SYN_HL
 		    /* When 'cursorline' is set highlight the line number of
@@ -9368,10 +9368,10 @@
     } while (lnum > 0);
 
     /* 'numberwidth' gives the minimal width plus one */
-    if (n < wp->w_p_nuw - 1)
-	n = wp->w_p_nuw - 1;
+    if (n < abs(wp->w_p_nuw) - 1)
+	n = abs(wp->w_p_nuw) - 1;
 
-    wp->w_nrwidth_width = n;
-    return n;
+    wp->w_nrwidth_width = (wp->w_p_nuw < 0) ? -n : n;
+    return wp->w_nrwidth_width;
 }
 #endif
