[PATCH 2/2] options: require --colonparsing/-@ to parse colon+number after a filename

Benno Schulenberg <[email protected]>
Newsgroups gmane.editors.nano.devel
Message-ID <[email protected]>
Stop doing colon parsing by default, to avoid surprises and frustration
for users that have filenames that end in a colon plus digits.

The equivalent rcfile option is, of course, 'set colonparsing'.

Using +1, or similar, before the filename disables any colon parsing
and the filename is taken as is.
---
 src/definitions.h    |  1 +
 src/nano.c           | 10 ++++++++--
 src/rcfile.c         |  1 +
 syntax/nanorc.nanorc |  2 +-
 4 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/definitions.h b/src/definitions.h
index 55d8235d..706a0c07 100644
--- a/src/definitions.h
+++ b/src/definitions.h
@@ -373,6 +373,7 @@ enum {
 	EMPTY_LINE,
 	INDICATOR,
 	BOOKSTYLE,
+	COLON_PARSING,
 	STATEFLAGS,
 	USE_MAGIC,
 	MINIBAR,
diff --git a/src/nano.c b/src/nano.c
index 5707bd96..e99a0fab 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -646,6 +646,7 @@ void usage(void)
 	print_opt("-!", "--magic", N_("Also try magic to determine syntax"));
 #endif
 #ifndef NANO_TINY
+	print_opt("-@", "--colonparsing", N_("Accept 'filename:linenumber' notation"));
 	print_opt("-%", "--stateflags", N_("Show some states on the title bar"));
 	print_opt("-_", "--minibar", N_("Show a feedback bar at the bottom"));
 	print_opt("-0", "--zero", N_("Hide all bars, use whole terminal"));
@@ -1799,6 +1800,7 @@ int main(int argc, char **argv)
 		{"indicator", 0, NULL, 'q'},
 		{"unix", 0, NULL, 'u'},
 		{"afterends", 0, NULL, 'y'},
+		{"colonparsing", 0, NULL, '@'},
 		{"stateflags", 0, NULL, '%'},
 		{"minibar", 0, NULL, '_'},
 		{"zero", 0, NULL, '0'},
@@ -1850,7 +1852,7 @@ int main(int argc, char **argv)
 		SET(MODERN_BINDINGS);
 
 	while ((optchr = getopt_long(argc, argv, "ABC:DEFGHIJ:KLMNOPQ:RS$T:UVWX:Y:Z"
-				"abcdef:ghijklmno:pqr:s:tuvwxy!%_0/", long_options, NULL)) != -1) {
+				"abcdef:ghijklmno:pqr:s:tuvwxy!@%_0/", long_options, NULL)) != -1) {
 		switch (optchr) {
 #ifndef NANO_TINY
 			case 'A':
@@ -2089,6 +2091,9 @@ int main(int argc, char **argv)
 				break;
 #endif
 #ifndef NANO_TINY
+			case '@':
+				SET(COLON_PARSING);
+				break;
 			case '%':
 				SET(STATEFLAGS);
 				break;
@@ -2504,7 +2509,8 @@ int main(int argc, char **argv)
 			 * (possibly preceded by more digits and a colon).  If there is or
 			 * are such trailing numbers, chop the colons plus numbers off.
 			 * The number is later used to place the cursor on that line. */
-			if (strchr(filename, ':') && stat(filename, &fileinfo) < 0) {
+			if (ISSET(COLON_PARSING) && !givenline && strchr(filename, ':') &&
+									!givencol && stat(filename, &fileinfo) < 0) {
 				char *coda = filename + strlen(filename);
   maybe_two:
 				while (--coda > filename + 1 && ('0' <= *coda && *coda <= '9'))
diff --git a/src/rcfile.c b/src/rcfile.c
index 943d6888..95271a7e 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -98,6 +98,7 @@ static const rcoption rcopts[] = {
 	{"backup", MAKE_BACKUP},
 	{"backupdir", 0},
 	{"bookstyle", BOOKSTYLE},
+	{"colonparsing", COLON_PARSING},
 	{"cutfromcursor", CUT_FROM_CURSOR},
 	{"emptyline", EMPTY_LINE},
 	{"guidestripe", 0},
diff --git a/syntax/nanorc.nanorc b/syntax/nanorc.nanorc
index 6b81075e..5af71c4d 100644
--- a/syntax/nanorc.nanorc
+++ b/syntax/nanorc.nanorc
@@ -14,7 +14,7 @@ color bold,purple "^[[:blank:]]*include[[:blank:]][^"]*([[:blank:]]|$)"
 color lime "^[[:blank:]]*extendsyntax[[:blank:]]+[[:alpha:]]+[[:blank:]]+(i?color|header|magic|comment|formatter|linter|tabgives)[[:blank:]]+.*"
 
 # The arguments of commands
-color brightgreen "^[[:blank:]]*(set|unset)[[:blank:]]+(afterends|allow_insecure_backup|atblanks|autoindent|backup|boldtext|bookstyle|breaklonglines|casesensitive|constantshow|cutfromcursor|emptyline|historylog|indicator|jumpyscrolling|linenumbers|locking|magic|minibar|mouse|multibuffer|noconvert|nohelp|nonewlines|positionlog|preserve|quickblank|rawsequences|rebinddelete|regexp|saveonexit|showcursor|smarthome|softwrap|stateflags|tabstospaces|trimblanks|unix|wordbounds|zap|zero)\>"
+color brightgreen "^[[:blank:]]*(set|unset)[[:blank:]]+(afterends|allow_insecure_backup|atblanks|autoindent|backup|boldtext|bookstyle|breaklonglines|casesensitive|colonparsing|constantshow|cutfromcursor|emptyline|historylog|indicator|jumpyscrolling|linenumbers|locking|magic|minibar|mouse|multibuffer|noconvert|nohelp|nonewlines|positionlog|preserve|quickblank|rawsequences|rebinddelete|regexp|saveonexit|showcursor|smarthome|softwrap|stateflags|tabstospaces|trimblanks|unix|wordbounds|zap|zero)\>"
 color brightgreen "^[[:blank:]]*set[[:blank:]]+(backupdir|brackets|errorcolor|functioncolor|keycolor|matchbrackets|minicolor|numbercolor|operatingdir|promptcolor|punct|quotestr|scrollercolor|selectedcolor|speller|spotlightcolor|statuscolor|stripecolor|titlecolor|whitespace|wordchars)[[:blank:]]+"
 color brightgreen "^[[:blank:]]*set[[:blank:]]+(fill[[:blank:]]+-?[[:digit:]]+|(guidestripe|tabsize)[[:blank:]]+[1-9][0-9]*)\>"
 color brightgreen "^[[:blank:]]*bind[[:blank:]]+((\^([A-Za-z]|[]/@\^_`-]|Space)|([Ss][Hh]-)?[Mm]-[A-Za-z]|[Mm]-([][!"#$%&'()*+,./0-9:;<=>?@\^_`{|}~-]|Space))|F([1-9]|1[0-9]|2[0-4])|Ins|Del)[[:blank:]]+([a-z]+|".*")[[:blank:]]+(main|help|search|replace(with)?|yesno|gotoline|writeout|insert|execute|browser|whereisfile|gotodir|spell|linter|all)\>"
-- 
2.42.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.