From 119491bbdedf2c727135e5e331f0714d94644351 Mon Sep 17 00:00:00 2001
From: Benno Schulenberg <bensberg@telfort.nl>
Date: Mon, 17 Dec 2018 19:57:30 +0100
Subject: [PATCH] new feature: add option --edgecolumn that shows a vertical
 guiding bar
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Option -e (--edgecolumn) takes a column number as argument and then
shows a vertical, colored bar over the entire height of the buffer,
to help the user control the width of the text when the terminal is
wider than this desired width.

[The color needs to become configurable, and would by default just
change the background color, not the foreground color.  But that is
something for a later patch.  It also needs to add an rcfile option
and documentation, of course.  Suggestions for a better name for the
option are welcome.]

This fulfills https://bugs.debian.org/916392.
Requested-by: Arturo Borrero González <arturo@debian.org>
And fulfills https://savannah.gnu.org/bugs/?55315.
Requested-by: Bryan Christ <bryan.christ@gmail.com>
---
 src/global.c |  2 ++
 src/nano.c   | 16 ++++++++++++++--
 src/proto.h  |  1 +
 src/winio.c  |  9 +++++++++
 4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/global.c b/src/global.c
index 0368132f..baef8fa9 100644
--- a/src/global.c
+++ b/src/global.c
@@ -111,6 +111,8 @@ int editwincols = -1;
 		/* The number of usable columns in the edit window: COLS - margin. */
 int margin = 0;
 		/* The amount of space reserved at the left for line numbers. */
+ssize_t edge_col = 0;
+		/* The column at which a vertical bar of color will be drawn. */
 
 filestruct *cutbuffer = NULL;
 		/* The buffer where we store cut text. */
diff --git a/src/nano.c b/src/nano.c
index 263045bc..db3371b6 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -851,6 +851,10 @@ void usage(void)
 	print_opt("-c", "--constantshow", N_("Constantly show cursor position"));
 	print_opt("-d", "--rebinddelete",
 					N_("Fix Backspace/Delete confusion problem"));
+#ifndef NANO_TINY
+	print_opt("-e <number>", "--edgecolumn=<number>",
+					N_("Show a guiding bar at this column"));
+#endif
 #ifdef ENABLE_BROWSER
 	if (!ISSET(RESTRICTED))
 		print_opt("-g", "--showcursor", N_("Show cursor in file browser & help text"));
@@ -2022,6 +2026,7 @@ int main(int argc, char **argv)
 		{"wordchars", 1, NULL, 'X'},
 		{"zap", 0, NULL, 'Z'},
 		{"atblanks", 0, NULL, 'a'},
+		{"edgecolumn", 0, NULL, 'e'},
 		{"autoindent", 0, NULL, 'i'},
 		{"cutfromcursor", 0, NULL, 'k'},
 		{"unix", 0, NULL, 'u'},
@@ -2084,7 +2089,7 @@ int main(int argc, char **argv)
 
 	while ((optchr =
 		getopt_long(argc, argv,
-				"ABC:DEFGHIKLMNOPQ:RST:UVWX:Y:Zabcdefghijklmno:pqr:s:tuvwxyz$",
+				"ABC:DEFGHIKLMNOPQ:RST:UVWX:Y:Zabcde:fghijklmno:pqr:s:tuvwxyz$",
 				long_options, NULL)) != -1) {
 		switch (optchr) {
 #ifndef NANO_TINY
@@ -2203,6 +2208,14 @@ int main(int argc, char **argv)
 			case 'd':
 				SET(REBIND_DELETE);
 				break;
+			case 'e':
+				if (!parse_num(optarg, &edge_col) || edge_col <= 0) {
+				die("here");
+					fprintf(stderr, _("Requested edge column \"%s\" is invalid"), optarg);
+					fprintf(stderr, "\n");
+					exit(1);
+				}
+				break;
 			case 'g':
 				SET(SHOW_CURSOR);
 				break;
@@ -2294,7 +2307,6 @@ int main(int argc, char **argv)
 				break;
 #endif
 			case 'b':  /* Pico compatibility flags. */
-			case 'e':
 			case 'f':
 			case 'j':
 			case 'q':
diff --git a/src/proto.h b/src/proto.h
index 65890134..09e7464a 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -88,6 +88,7 @@ extern WINDOW *bottomwin;
 extern int editwinrows;
 extern int editwincols;
 extern int margin;
+extern ssize_t edge_col;
 
 extern filestruct *cutbuffer;
 extern filestruct *cutbottom;
diff --git a/src/winio.c b/src/winio.c
index e2042d9e..18f91254 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -2677,6 +2677,15 @@ void edit_draw(filestruct *fileptr, const char *converted,
 	}
 #endif /* ENABLE_COLOR */
 
+	if (edge_col > 0) {
+		const char *text = converted +  actual_x(converted, edge_col);;
+		const char *edge_char = (*text == '\0') ? " " : text;
+
+		wattron(edit, interface_color_pair[ERROR_MESSAGE]);
+		mvwaddnstr(edit, row, margin + edge_col, edge_char, 1);
+		wattroff(edit, interface_color_pair[ERROR_MESSAGE]);
+	}
+
 #ifndef NANO_TINY
 	/* If the mark is on, and fileptr is at least partially selected, we
 	 * need to paint it. */
-- 
2.19.2

