nano-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Nano-devel] [PATCH 1/4] new feature: option --marginstripe that shows a


From: Benno Schulenberg
Subject: [Nano-devel] [PATCH 1/4] new feature: option --marginstripe that shows a vertical guiding bar
Date: Sun, 3 Mar 2019 12:03:04 +0100

Option -J (--marginstripe) takes a column number as argument and then
shows a vertical, colored bar over the entire height of the buffer,
to aid the user in controling the width of the text when the terminal
is wider than this desired width.

This fulfills https://bugs.debian.org/916392.
Requested-by: Arturo Borrero González <address@hidden>
And fulfills https://savannah.gnu.org/bugs/?55315.
Requested-by: Bryan Christ <address@hidden>
---
 src/global.c |  2 ++
 src/nano.c   | 17 ++++++++++++++++-
 src/proto.h  |  1 +
 src/rcfile.c |  8 ++++++++
 src/winio.c  |  9 +++++++++
 5 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/src/global.c b/src/global.c
index 5d057401..50cbfca0 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 stripe_column = 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 c8681c91..a55eebed 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -797,6 +797,10 @@ void usage(void)
 #endif
 #ifdef ENABLE_NANORC
        print_opt("-I", "--ignorercfiles", N_("Don't look at nanorc files"));
+#endif
+#ifndef NANO_TINY
+       print_opt("-J <number>", "--marginstripe=<number>",
+                                       N_("Show a guiding bar at this 
column"));
 #endif
        print_opt("-K", "--rawsequences",
                                        N_("Fix numeric keypad key confusion 
problem"));
@@ -2022,6 +2026,7 @@ int main(int argc, char **argv)
                {"tabstospaces", 0, NULL, 'E'},
                {"locking", 0, NULL, 'G'},
                {"historylog", 0, NULL, 'H'},
+               {"marginstripe", 1, NULL, 'J'},
                {"noconvert", 0, NULL, 'N'},
                {"positionlog", 0, NULL, 'P'},
                {"smooth", 0, NULL, 'S'},
@@ -2092,7 +2097,7 @@ int main(int argc, char **argv)
 
        while ((optchr =
                getopt_long(argc, argv,
-                               
"ABC:DEFGHIKLMNOPQ:RST:UVWX:Y:Zabcdefghijklmno:pr:s:tuvwxyz$",
+                               
"ABC:DEFGHIJ:KLMNOPQ:RST:UVWX:Y:Zabcdefghijklmno:pr:s:tuvwxyz$",
                                long_options, NULL)) != -1) {
                switch (optchr) {
 #ifndef NANO_TINY
@@ -2134,6 +2139,13 @@ int main(int argc, char **argv)
                                ignore_rcfiles = TRUE;
                                break;
 #endif
+                       case 'J':
+                               if (!parse_num(optarg, &stripe_column) || 
stripe_column <= 0) {
+                                       fprintf(stderr, _("Stripe column \"%s\" 
is invalid"), optarg);
+                                       fprintf(stderr, "\n");
+                                       exit(1);
+                               }
+                               break;
                        case 'K':
                                SET(RAW_SEQUENCES);
                                break;
@@ -2330,6 +2342,7 @@ int main(int argc, char **argv)
                ssize_t fill_cmdline = fill;
 #endif
 #ifndef NANO_TINY
+               size_t stripeclm_cmdline = stripe_column;
                char *backup_dir_cmdline = backup_dir;
                char *word_chars_cmdline = word_chars;
 #endif
@@ -2376,6 +2389,8 @@ int main(int argc, char **argv)
                        fill = fill_cmdline;
 #endif
 #ifndef NANO_TINY
+               if (stripeclm_cmdline > 0)
+                       stripe_column = stripeclm_cmdline;
                if (backup_dir_cmdline != NULL) {
                        free(backup_dir);
                        backup_dir = backup_dir_cmdline;
diff --git a/src/proto.h b/src/proto.h
index 65675731..a24e7117 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 stripe_column;
 
 extern filestruct *cutbuffer;
 extern filestruct *cutbottom;
diff --git a/src/rcfile.c b/src/rcfile.c
index da17c4b9..8099cdbd 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -102,6 +102,7 @@ static const rcoption rcopts[] = {
        {"backupdir", 0},
        {"casesensitive", CASE_SENSITIVE},
        {"cutfromcursor", CUT_FROM_CURSOR},
+       {"marginstripe", 0},
        {"locking", LOCKING},
        {"matchbrackets", 0},
        {"noconvert", NO_CONVERT},
@@ -1116,6 +1117,13 @@ void parse_rcfile(FILE *rcstream, bool syntax_only)
                } else
 #endif
 #ifndef NANO_TINY
+               if (strcasecmp(rcopts[i].name, "marginstripe") == 0) {
+                       if (!parse_num(option, &stripe_column) || stripe_column 
<= 0) {
+                               rcfile_error(N_("Edge column \"%s\" is 
invalid"), option);
+                               stripe_column = 0;
+                       }
+                       free(option);
+               }
                if (strcasecmp(rcopts[i].name, "matchbrackets") == 0) {
                        matchbrackets = option;
                        if (has_blank_mbchars(matchbrackets)) {
diff --git a/src/winio.c b/src/winio.c
index de94dbdf..2f1a5edd 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -2685,6 +2685,15 @@ void edit_draw(filestruct *fileptr, const char 
*converted,
        }
 #endif /* ENABLE_COLOR */
 
+       if (stripe_column > 0) {
+               const char *text = converted + actual_x(converted, 
stripe_column - 1);
+               const char *striped_char = (*text == '\0') ? " " : text;
+
+               wattron(edit, interface_color_pair[ERROR_MESSAGE]);
+               mvwaddnstr(edit, row, margin + stripe_column - 1, striped_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.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]