From 14b3ca94b75b8612dab33b7dca7acc70e32866e6 Mon Sep 17 00:00:00 2001
From: Chris Allegretta <chrisa@asty.org>
Date: Fri, 25 Jan 2002 21:59:02 +0000
Subject: [PATCH] - General - New flag RELATIVECHARS to show column positino
 relative to the current line instead of the current file.  New flag -C,
 --relative, changes to do_cursorpos()

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1046 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog     |  5 ++++-
 nano.c        | 13 ++++++++++---
 nano.h        |  1 +
 nanorc.sample |  3 +++
 rcfile.c      |  7 ++++---
 winio.c       | 45 ++++++++++++++++++++++++++++++---------------
 6 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d1d75e5b..a874444b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 CVS code -
-
+- General
+	- New flag RELATIVECHARS to show column positino relative to
+	  the current line instead of the current file.  New flag 
+	  -C, --relative, changes to do_cursorpos().
 - po/ca.po, po/es.po:
 	- Catalan and Spanish translation updates (Jordi).
 
diff --git a/nano.c b/nano.c
index b6eaf90c..c93cde08 100644
--- a/nano.c
+++ b/nano.c
@@ -409,6 +409,9 @@ void usage(void)
     printf(_("Usage: nano [GNU long option] [option] +LINE <file>\n\n"));
     printf(_("Option		Long option		Meaning\n"));
 
+    printf
+	(_
+	 (" -C 		--relative		Show relative col position with ^C\n"));
 #ifndef NANO_SMALL
     printf
 	(_
@@ -489,6 +492,7 @@ void usage(void)
 #else
     printf(_("Usage: nano [option] +LINE <file>\n\n"));
     printf(_("Option		Meaning\n"));
+    printf(_(" -C 		Show relative col position with ^C\n"));
 #ifndef NANO_SMALL
     printf(_(" -D 		Write file in DOS format\n"));
 #endif
@@ -2736,7 +2740,7 @@ int main(int argc, char *argv[])
 	{"smooth", 0, 0, 'S'},
 #endif
 	{"keypad", 0, 0, 'K'},
-
+	{"relative", 0, 0, 'C'},
 	{0, 0, 0, 0}
     };
 #endif
@@ -2757,15 +2761,18 @@ int main(int argc, char *argv[])
 #endif /* ENABLE_NANORC */
 
 #ifdef HAVE_GETOPT_LONG
-    while ((optchr = getopt_long(argc, argv, "h?DFKMRST:Vabcefgijklmo:pr:s:tvwxz",
+    while ((optchr = getopt_long(argc, argv, "h?CDFKMRST:Vabcefgijklmo:pr:s:tvwxz",
 				 long_options, &option_index)) != EOF) {
 #else
     while ((optchr =
-	    getopt(argc, argv, "h?DFKMRST:Vabcefgijklmo:pr:s:tvwxz")) != EOF) {
+	    getopt(argc, argv, "h?CDFKMRST:Vabcefgijklmo:pr:s:tvwxz")) != EOF) {
 #endif
 
 	switch (optchr) {
 
+	case 'C':
+	    SET(RELATIVECHARS);
+	    break;
 #ifndef NANO_SMALL
 	case 'D':
 	    SET(DOS_FILE);
diff --git a/nano.h b/nano.h
index 26e10a6e..2cee58f5 100644
--- a/nano.h
+++ b/nano.h
@@ -162,6 +162,7 @@ typedef struct colortype {
 #define SMOOTHSCROLL		(1<<23)
 #define DISABLE_CURPOS		(1<<24)	/* Damn, we still need it */
 #define ALT_KEYPAD		(1<<25)	/* Damn, we still need it */
+#define RELATIVECHARS		(1<<26)
 
 /* Control key sequences, changing these would be very very bad */
 
diff --git a/nanorc.sample b/nanorc.sample
index 78628bd3..8be5eea2 100644
--- a/nanorc.sample
+++ b/nanorc.sample
@@ -8,6 +8,9 @@
 # Constantly update the cursor position
 # set const
 
+# Show column position relative to the current line, not the whole file
+# set relative
+
 # Use cut to end of line with ^K by default
 # set cut
 
diff --git a/rcfile.c b/rcfile.c
index 56c66519..491cb308 100644
--- a/rcfile.c
+++ b/rcfile.c
@@ -41,9 +41,9 @@
 #endif
 
 #ifndef DISABLE_WRAPJUSTIFY
-#define NUM_RCOPTS 19
+#define NUM_RCOPTS 20
 #else
-#define NUM_RCOPTS 18
+#define NUM_RCOPTS 19
 #endif
 
 /* Static stuff for the nanorc file */
@@ -70,7 +70,8 @@ rcoption rcopts[NUM_RCOPTS] = {
     {"suspend", SUSPEND},
     {"multibuffer", MULTIBUFFER},
     {"smooth", SMOOTHSCROLL},
-    {"keypad", ALT_KEYPAD}
+    {"keypad", ALT_KEYPAD},
+    {"relative", RELATIVECHARS}
 };
 
 static int errors = 0;
diff --git a/winio.c b/winio.c
index 38824d04..e685e2d8 100644
--- a/winio.c
+++ b/winio.c
@@ -1586,32 +1586,47 @@ int do_cursorpos(int constant)
 {
     filestruct *fileptr;
     float linepct = 0.0, bytepct = 0.0;
-    long i = 0;
+    long i = 0, j = 0;
     static long old_i = -1, old_totsize = -1;
 
     if (current == NULL || fileage == NULL)
 	return 0;
 
-    for (fileptr = fileage; fileptr != current && fileptr != NULL;
-	 fileptr = fileptr->next)
-	i += strlen(fileptr->data) + 1;
-
-    if (fileptr == NULL)
-	return -1;
-
-    i += current_x;
-
     if (old_i == -1)
 	old_i = i;
 
     if (old_totsize == -1)
 	old_totsize = totsize;
 
-    if (totlines > 0)
-	linepct = 100 * current->lineno / totlines;
+    if (ISSET(RELATIVECHARS)) {
+
+	if (strlen(current->data) == 0)
+	    bytepct = 0;
+	else
+	    bytepct = 100 * current_x / strlen(current->data);
+
+	old_i = -1;
+	i = current_x;
+	j = strlen(current->data);
 
-    if (totsize > 0)
-	bytepct = 100 * i / totsize;
+    } else {
+	for (fileptr = fileage; fileptr != current && fileptr != NULL;
+	     fileptr = fileptr->next)
+	    i += strlen(fileptr->data) + 1;
+
+	if (fileptr == NULL)
+	    return -1;
+
+	i += current_x;
+
+	j = totsize;
+
+	if (totsize > 0)
+	    bytepct = 100 * i / totsize;
+    }
+
+    if (totlines > 0)
+	 linepct = 100 * current->lineno / totlines;
 
 #ifdef DEBUG
     fprintf(stderr, _("do_cursorpos: linepct = %f, bytepct = %f\n"),
@@ -1624,7 +1639,7 @@ int do_cursorpos(int constant)
     if (!constant || (old_i != i || old_totsize != totsize)) {
 	statusbar(_
 		  ("line %d of %d (%.0f%%), character %ld of %ld (%.0f%%)"),
-		  current->lineno, totlines, linepct, i, totsize, bytepct);
+		  current->lineno, totlines, linepct, i, j, bytepct);
     }
 
     old_i = i;
-- 
GitLab