new feature: option --guidestripe that shows a vertical guiding bar

Option -J (--guidestripe) 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 regulating 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 <arturo@debian.org>
And fulfills https://savannah.gnu.org/bugs/?55315.
Requested-by: Bryan Christ <bryan.christ@gmail.com>
master
Benno Schulenberg 2018-12-17 19:57:30 +01:00
parent 43b42246d3
commit 66c6eb5166
5 changed files with 36 additions and 1 deletions

View File

@ -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 will be drawn. */
filestruct *cutbuffer = NULL;
/* The buffer where we store cut text. */

View File

@ -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>", "--guidestripe=<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'},
{"guidestripe", 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;

View File

@ -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;

View File

@ -102,6 +102,7 @@ static const rcoption rcopts[] = {
{"backupdir", 0},
{"casesensitive", CASE_SENSITIVE},
{"cutfromcursor", CUT_FROM_CURSOR},
{"guidestripe", 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, "guidestripe") == 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)) {

View File

@ -2685,6 +2685,15 @@ void edit_draw(filestruct *fileptr, const char *converted,
}
#endif /* ENABLE_COLOR */
if (stripe_column > 0 && !inhelp) {
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. */